]> git.lizzy.rs Git - rudp.git/blob - platform_adpt.h
Switch to CMake
[rudp.git] / platform_adpt.h
1 #ifndef __platform_adpt_h__
2 #define __platform_adpt_h__
3
4 #include "basetype.h"
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9
10 #ifdef _WIN32   //Windows
11 #include <winsock2.h>
12 #include <ws2tcpip.h>
13
14 #if defined(__cplusplus) && defined(USE_MFC)
15 #include <afx.h>
16 #else
17 #define _WIN32_LEAN_AND_MEAN
18 #include <windows.h>
19 #endif
20
21
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 /*
27  *  SOCKET Functions
28  */
29 void PA_NetLibInit();
30 #define PA_NetLibUninit()       WSACleanup()
31
32 #define PA_IOVEC        WSABUF
33 #define PA_IoVecGetPtr(pvec) ((pvec)->buf)
34 #define PA_IoVecGetLen(pvec) ((pvec)->len)
35 #define PA_IoVecSetPtr(pvec, ptr) (pvec)->buf = (char*)(ptr)
36 #define PA_IoVecSetLen(pvec, _len) (pvec)->len = _len
37
38 #define PA_SocketClose closesocket
39 #define CloseSocket     closesocket
40 #define PA_Send(s, p, len, f) send(s, (const char*)p, len, f)
41 #define PA_SendTo(s, p, len, f, paddr, alen) sendto(s, (const char*)p, len, f, paddr, alen)
42 #define PA_Recv(s, p, len, f) recv(s, (char*)p, len, f)
43 #define PA_RecvFrom(s, p, len, f, paddr, palen) recvfrom(s, (char*)p, len, f, paddr, palen)
44 #define PA_GetSockName(s, paddr, paddr_len) getsockname(s, paddr, (int*)paddr_len)
45 #define PA_GetPeerName(s, paddr, paddr_len) getpeername(s, paddr, (int*)paddr_len)
46 #define PA_Accept(s, paddr, paddr_len) accept(s, paddr, paddr_len)
47 #define PA_GetSockOpt(s, level, optname, optval, optlen) getsockopt(s, level, optname, (char*)optval, (int*)optlen)
48 #define PA_SetSockOpt(s, level, optname, optval, optlen) setsockopt(s, level, optname, (const char*)optval, optlen)
49
50 #define PA_SOCKET       SOCKET
51 #define PA_SocketIsValid(s) (s!=INVALID_SOCKET)
52 #define PA_SocketGetError() WSAGetLastError()
53 #define PA_SOCKET_ERROR SOCKET_ERROR    //return value of socket operations
54
55
56 #define EWOULDBLOCK             WSAEWOULDBLOCK
57 #define EINPROGRESS             WSAEINPROGRESS
58 #define EALREADY                WSAEALREADY
59 #define ENOTSOCK                WSAENOTSOCK
60 #define EDESTADDRREQ            WSAEDESTADDRREQ
61 #define EMSGSIZE                WSAEMSGSIZE
62 #define EPROTOTYPE              WSAEPROTOTYPE
63 #define ENOPROTOOPT             WSAENOPROTOOPT
64 #define EPROTONOSUPPORT         WSAEPROTONOSUPPORT
65 #define ESOCKTNOSUPPORT         WSAESOCKTNOSUPPORT
66 #define EOPNOTSUPP              WSAEOPNOTSUPP
67 #define EPFNOSUPPORT            WSAEPFNOSUPPORT
68 #define EAFNOSUPPORT            WSAEAFNOSUPPORT
69 #define EADDRINUSE              WSAEADDRINUSE
70 #define EADDRNOTAVAIL           WSAEADDRNOTAVAIL
71 #define ENETDOWN                WSAENETDOWN
72 #define ENETUNREACH             WSAENETUNREACH
73 #define ENETRESET               WSAENETRESET
74 #define ECONNABORTED            WSAECONNABORTED
75 #define ECONNRESET              WSAECONNRESET
76 #define ENOBUFS                 WSAENOBUFS
77 #define EISCONN                 WSAEISCONN
78 #define ENOTCONN                WSAENOTCONN
79 #define ESHUTDOWN               WSAESHUTDOWN
80 #define ETOOMANYREFS            WSAETOOMANYREFS
81 #define ETIMEDOUT               WSAETIMEDOUT
82 #define ECONNREFUSED            WSAECONNREFUSED
83 #define ELOOP                   WSAELOOP
84 #define EHOSTDOWN               WSAEHOSTDOWN
85 #define EHOSTUNREACH            WSAEHOSTUNREACH
86 #define EPROCLIM                WSAEPROCLIM
87 #define EUSERS                  WSAEUSERS
88 #define EDQUOT                  WSAEDQUOT
89 #define ESTALE                  WSAESTALE
90 #define EREMOTE                 WSAEREMOTE
91
92
93
94 /*
95  *
96  */
97 #define PA_INVALID_HANDLE       INVALID_HANDLE_VALUE
98 #define PA_IsValidHandle(handle) (handle != INVALID_HANDLE_VALUE)
99
100 /*
101  *  Synchronous Objects
102  */
103 #define PA_MUTEX        HANDLE
104 #define PA_EVENT        HANDLE
105 #define PA_COND         HANDLE
106 #define PA_SEM          HANDLE  //semaphore
107 #define PA_PIPE HANDLE
108 #define PA_SPIN CRITICAL_SECTION
109
110 #define PA_DEFINEMUTEX(x) PA_MUTEX x = CreateMutex(NULL, FALSE, NULL)
111 #define PA_MutexInit(x) x = CreateMutex(NULL, FALSE, NULL)
112 #define PA_MutexUninit(x) CloseHandle(x)
113 #define PA_MutexLock(x) WaitForSingleObject(x, INFINITE)
114 #define PA_MutexUnlock(x) ReleaseMutex(x)
115 #define PA_MutexTryLock(x) (WaitForSingleObject(x, 0) == WAIT_OBJECT_0)
116
117 #define PA_SpinInit(x) InitializeCriticalSection(&x)
118 #define PA_SpinUninit(x) DeleteCriticalSection(&x)
119 #define PA_SpinLock(x) EnterCriticalSection(&x)
120 #define PA_SpinTryLock(x) TryEnterCriticalSection(&x)
121 #define PA_SpinUnlock(x) LeaveCriticalSection(&x)
122
123 #define PA_EventInit(x) x = CreateEvent(NULL, FALSE, FALSE, NULL)
124 #define PA_EventUninit(x) CloseHandle(x)
125 #define PA_EventSet(x) SetEvent(x)
126 //#define PA_ResetEvent(x) ResetEvent(x)
127 #define PA_EventWait(x) WaitForSingleObject(x, INFINITE)
128 #define PA_EventWaitTimed(e, ms) (WaitForSingleObject(e, ms)==WAIT_OBJECT_0)
129
130 #define PA_SemInit(x, max_value) x = CreateSemaphore(NULL, 0, max_value, NULL)
131 #define PA_SemUninit(x) CloseHandle(x)
132 #define PA_SemWait(x) WaitForSingleObject(x, INFINITE)
133 #define PA_SemPost(x) ReleaseSemaphore(x, 1, NULL)
134
135 /*
136  *  Threads
137  */
138 #define PA_HTHREAD      HANDLE
139 #define PA_HTHREAD_NULL NULL
140 #define PA_THREAD_RETTYPE       DWORD
141 typedef PA_THREAD_RETTYPE (__STDCALL PA_ThreadRoutine)(void*);
142 #define PA_ThreadGetCurrentHandle() GetCurrentThread()
143 #define PA_ThreadCloseHandle(hThread) CloseHandle(hThread)
144 void *PA_ThreadWaitUntilTerminate(PA_HTHREAD hThread);
145
146 #define PA_Sleep(ms) Sleep(ms)
147
148 /*
149  * Read-Write Lock
150  */
151 typedef struct ReadWriteLock
152 {
153         int    m_currentLevel;
154         int    m_readerCount, m_writeCount;
155         DWORD  m_writerId;
156         HANDLE m_unlockEvent; 
157         HANDLE m_accessMutex;
158         CRITICAL_SECTION m_csStateChange;
159 } RWLOCK, *LPRWLOCK;
160
161 RWLOCK *RWLockCreate();
162 BOOL RWLockDestroy(RWLOCK *pLock);
163 BOOL RWLockLockR(RWLOCK *pLock, DWORD timeout);
164 BOOL RWLockLockW(RWLOCK *pLock, DWORD timeout);
165 void RWLockUnlock(RWLOCK *pLock);
166
167 #define PA_RWLOCK       LPRWLOCK
168 #define PA_RWLockInit(x) x = RWLockCreate()
169 #define PA_RWLockUninit(x) RWLockDestroy(x)
170 #define PA_RWLockLockR(x) RWLockLockR(x, INFINITE)
171 #define PA_RWLockLockW(x) RWLockLockW(x, INFINITE)
172 #define PA_RWLockFailed(op) (op == FALSE)
173 #define PA_RWLockLockRTimed(x, timeout) RWLockLockR(x, timeout)
174 #define PA_RWLockLockWTimed(x, timeout) RWLockLockW(x, timeout)
175 #define PA_RWLockUnlock(x) RWLockUnlock(x)
176
177
178 /*
179  *  String functions
180  */
181 #define PA_StrCaseCmp stricmp
182 #define PA_StrNCaseCmp strnicmp
183 #define PA_StrNCmp      strncmp
184
185 /*
186  *  File Operations
187  */
188 #define PA_HFILE        HANDLE
189 int PA_Write(PA_HFILE hFile, const void *pBuff, unsigned int size);
190 int PA_Read(PA_HFILE hFile, void *pBuff, unsigned int size);
191 #define PA_FileClose(hf) CloseHandle(hf)
192 #define PA_FileIsValid(h) (h!=INVALID_HANDLE_VALUE)
193 #define PA_DeleteFile(f)        DeleteFile(f)
194
195 /*
196  *  Time
197  */
198 #define PA_GetTickCount() GetTickCount()
199
200 #ifdef __cplusplus
201 }
202 #endif
203
204 #elif defined(__linux__)
205 //
206 // OS:  Linux
207 //
208
209 #include <unistd.h>
210 #include <sys/socket.h>
211 #include <sys/types.h>
212 #include <netinet/in.h>
213 #include <netinet/tcp.h>
214 #include <arpa/inet.h>
215 #include <errno.h>
216 #include <fcntl.h>
217 #include <pthread.h>
218 #include <netdb.h>
219 #include <errno.h>
220 #include <sys/select.h>
221 #include <sys/time.h>
222 #include <unistd.h>
223 #include <sys/types.h>
224 #include <sys/uio.h>
225 #include <semaphore.h>
226
227 #ifdef __cplusplus
228 extern "C" {
229 #endif
230
231 /*
232  *  SOCKET Functions
233  */
234 #define PA_NetLibInit()
235 #define PA_NetLibUninit()
236
237 #define PA_IOVEC        struct iovec    
238 #define PA_IoVecGetPtr(pvec) ((pvec)->iov_base)
239 #define PA_IoVecGetLen(pvec) ((pvec)->iov_len)
240 #define PA_IoVecSetPtr(pvec, ptr) (pvec)->iov_base = (void*)(ptr)
241 #define PA_IoVecSetLen(pvec, len) (pvec)->iov_len = len
242
243 #define PA_SocketClose close
244 #define CloseSocket     close
245 #define PA_Send send
246 #define PA_SendTo sendto
247 #define PA_Recv recv
248 #define PA_RecvFrom(s, buf, size, flags, paddr, paddr_len) recvfrom(s, buf, size, flags, paddr, (socklen_t*)paddr_len)
249 #define PA_GetSockName(s, paddr, paddr_len) getsockname(s, paddr, (socklen_t*)paddr_len)
250 #define PA_GetPeerName(s, paddr, paddr_len) getpeername(s, paddr, (socklen_t*)paddr_len)
251 #define PA_Accept(s, paddr, paddr_len) accept(s, paddr, (socklen_t*)paddr_len)
252 #define PA_GetSockOpt(s, level, optname, optval, optlen) getsockopt(s, level, optname, optval, (socklen_t*)optlen)
253 #define PA_SetSockOpt setsockopt
254
255 #define PA_SOCKET       int
256 #define INVALID_SOCKET  -1      
257 #define PA_SocketIsValid(s) (s>=0)
258 #define PA_SocketGetError() errno
259 #define PA_SOCKET_ERROR -1      //return value of socket operations
260
261 /*
262  *
263  */
264 #define PA_IsValidHandle(fd) (fd>=0)
265 #define PA_INVALID_HANDLE -1
266
267 /*
268  *  Synchronous Objects
269  */
270 #define PA_MUTEX        pthread_mutex_t
271 #define PA_PIPE int
272
273 #define PA_EVENT sem_t*
274 #define PA_SEM  sem_t
275
276 #define PA_DEFINEMUTEX(x) pthread_mutex_t x = PTHREAD_MUTEX_INITIALIZER
277 #define PA_MutexInit(x) pthread_mutex_init(&x, NULL)
278 #define PA_MutexUninit(x) pthread_mutex_destroy(&x)
279 #define PA_MutexLock(x) pthread_mutex_lock(&x)
280 #define PA_MutexUnlock(x) pthread_mutex_unlock(&x)
281 #define PA_MutexTryLock(x) (pthread_mutex_trylock(&x) == 0)
282
283 #ifdef HAVE_SPIN_T
284 #define PA_SPIN pthread_spinlock_t
285 #define PA_SpinInit(x) pthread_spin_init(&x, PTHREAD_PROCESS_PRIVATE)
286 #define PA_SpinUninit(x) pthread_spin_destroy(&x)
287 #define PA_SpinLock(x) pthread_spin_lock(&x)
288 #define PA_SpinTryLock(x) pthread_spin_trylock(&x)
289 #define PA_SpinUnlock(x) pthread_spin_unlock(&x)
290 #else
291 #define PA_SPIN pthread_mutex_t
292 #define PA_SpinInit(x) pthread_mutex_init(&x, NULL)
293 #define PA_SpinUninit(x) pthread_mutex_destroy(&x)
294 #define PA_SpinLock(x) pthread_mutex_lock(&x)
295 #define PA_SpinTryLock(x) pthread_mutex_trylock(&x)
296 #define PA_SpinUnlock(x) pthread_mutex_unlock(&x)
297 #endif
298
299 #define PA_EventInit(x)         do { x=(sem_t*)malloc(sizeof(sem_t)); sem_init(x, 0, 0); } while(0)
300 #define PA_EventUninit(x)       do { sem_destroy(x); free(x); } while(0)
301 #define PA_EventSet(x)          sem_post(x) 
302 #define PA_EventWait(x)         sem_wait(x)
303 BOOL PA_EventWaitTimed(PA_EVENT e, DWORD ms);
304
305 #define PA_SemInit(x, max_value) do { x = (sem_t*)malloc(sizeof(sem_t)); sem_init(x, 0, max_value); } while(0)
306 #define PA_SemUninit(x) CloseHandle(x)  { sem_destroy(x); free(x); }
307 #define PA_SemWait(x) sem_wait(x)
308 #define PA_SemPost(x) sem_post(x)
309
310 /*
311  *  Threads
312  */
313 #define PA_HTHREAD pthread_t
314 #define PA_HTHREAD_NULL         0L
315 #define PA_THREAD_RETTYPE       void*
316 typedef PA_THREAD_RETTYPE (__STDCALL PA_ThreadRoutine)(void*);
317 #define PA_ThreadGetCurrentHandle() pthread_self()
318 #define PA_ThreadCloseHandle(hThread) pthread_detach(hThread)
319 void* PA_ThreadWaitUntilTerminate(PA_HTHREAD hThread);
320
321 void PA_Sleep(UINT ms); //Milliseconds
322
323 /*
324  * Read-Write Lock
325  */
326 #define INFINITE 0xFFFFFFFF
327
328 #define PA_RWLOCK       pthread_rwlock_t        
329 #define PA_RWLockInit(x) pthread_rwlock_init(&x, NULL)
330 #define PA_RWLockUninit(x) pthread_rwlock_destroy(&x)
331 BOOL _RWLockLockR(PA_RWLOCK *x, DWORD timeout);
332 BOOL _RWLockLockW(PA_RWLOCK *x, DWORD timeout);
333 #define PA_RWLockLockR(x) pthread_rwlock_rdlock(&x)
334 #define PA_RWLockLockW(x) pthread_rwlock_wrlock(&x)
335 #define PA_RWLockFailed(op) (op != 0)
336 #define PA_RWLockLockRTimed(x, timeout) _RWLockLockR(&x, timeout)
337 #define PA_RWLockLockWTimed(x, timeout) _RWLockLockR(&x, timeout)
338 #define PA_RWLockUnlock(x) pthread_rwlock_unlock(&x)
339
340 /*
341  *  String functions
342  */
343 #define PA_StrCaseCmp strcasecmp
344 #define PA_StrNCaseCmp strncasecmp
345 #define PA_StrNCmp      strncmp
346
347 /*
348  *  File Operations
349  */
350 #define PA_HFILE        int
351 #define PA_Write        write
352 #define PA_Read         read
353 #define PA_FileIsValid(h) (h>=0)
354 #define PA_FileClose(f) close(f)
355 BOOL PA_DeleteFile(const char *fn);
356
357 /*
358  *  Time
359  */
360 DWORD PA_GetTickCount();
361
362 #ifdef __cplusplus
363 }
364 #endif
365 /* End of __LINUX__ */
366
367 #elif defined(ARM_UCOS_LWIP)
368
369 #include <lwip/opt.h>
370 #include <lwip/init.h>
371
372 #include <lwip/mem.h>
373 #include <lwip/memp.h>
374 #include <lwip/sys.h>
375 #include <lwip/stats.h>
376 #include <lwip/netdb.h>
377 #include <lwip/tcpip.h>
378 #include <lwip/sockets.h>
379
380
381 /*
382  * Synchronous Objects: Mutex
383  */
384 #define PA_EVENT sys_sem_t
385 #define PA_SEM  sys_sem_t
386
387 #define PA_EventInit(x) sys_sem_new(&(x), 0)
388 #define PA_EventUninit(x) sys_sem_free(&(x))
389 #define PA_EventSet(x) sys_sem_signal(&(x))
390 //#define PA_ResetEvent(x) ResetEvent(x)
391 #define PA_EventWait(x) sys_arch_sem_wait(&(x), 0)
392 #define PA_EventWaitTimed(e, ms) (sys_arch_sem_wait(&(e), ms)!=SYS_ARCH_TIMEOUT)
393
394 #define PA_MUTEX sys_sem_t
395 #define PA_MutexInit(x) sys_sem_new(&(x), 1)
396 #define PA_MutexUninit(x) sys_sem_free(&(x))
397 #define PA_MutexLock(x) sys_arch_sem_wait(&(x), 0)
398 #define PA_MutexUnlock(x) sys_sem_signal(&(x))
399
400 #define PA_PIPE void*
401
402 /*
403  * Thread
404  */
405 #define PA_HTHREAD sys_thread_t
406 #define PA_HTHREAD_NULL NULL
407 #define PA_THREAD_RETTYPE void* 
408 typedef PA_THREAD_RETTYPE (PA_ThreadRoutine)(void*);
409 void* PA_ThreadWaitUntilTerminate(PA_HTHREAD hThread);
410 #define PA_ThreadCloseHandle(hThread)
411
412 /*
413  * SOCKET Functions
414  */
415 #define PA_NetLibInit() lwip_socket_init()
416 #define PA_NetLibUninit()
417
418 #define PA_SocketClose lwip_close
419 #define CloseSocket     iwip_close
420 #define PA_Send lwip_send
421 #define PA_SendTo lwip_sendto
422 #define PA_Recv lwip_recv
423 #define PA_RecvFrom(s, buf, size, flags, paddr, paddr_len) lwip_recvfrom(s, buf, size, flags, paddr, (socklen_t*)paddr_len)
424 #define PA_GetSockName(s, paddr, paddr_len) lwip_getsockname(s, paddr, (socklen_t*)paddr_len)
425 #define PA_GetPeerName(s, paddr, paddr_len) lwip_getpeername(s, paddr, (socklen_t*)paddr_len)
426 #define PA_Accept(s, paddr, paddr_len) lwip_accept(s, paddr, (socklen_t*)paddr_len)
427 #define PA_GetSockOpt(s, level, optname, optval, optlen) lwip_getsockopt(s, level, optname, optval, (socklen_t*)optlen)
428 #define PA_SetSockOpt lwip_setsockopt
429
430 #define PA_SOCKET       int
431 #define INVALID_SOCKET  -1      
432 #define PA_SocketIsValid(s) (s>=0)
433 #define PA_SocketGetError(s) get_socket(s)->err
434 #define PA_SOCKET_ERROR -1      //return value of socket operations
435
436 struct LwipIoVec {
437         void *iov_base;
438         int  iov_len;
439 };
440 #define PA_IOVEC        struct LwipIoVec
441 #define PA_IoVecGetPtr(pvec) ((pvec)->iov_base)
442 #define PA_IoVecGetLen(pvec) ((pvec)->iov_len)
443 #define PA_IoVecSetPtr(pvec, ptr) (pvec)->iov_base = (void*)(ptr)
444 #define PA_IoVecSetLen(pvec, len) (pvec)->iov_len = len
445
446 /*
447  * Time
448  */
449 #define PA_GetTickCount() sys_now()
450 #define PA_Sleep(x) usleep(x/1000)
451
452 #else
453
454 #error "Platform not supported"
455
456 #endif  
457
458
459 #ifdef __cplusplus
460 extern "C" {
461 #endif
462 /*
463  *  Common Wrapper
464  */
465 PA_HTHREAD PA_ThreadCreate(PA_ThreadRoutine* routine, void* data);
466 int PA_SocketSetNBlk(PA_SOCKET s, BOOL b);
467 int PA_SocketSetLinger(PA_SOCKET s, int onoff, int linger);
468
469 /*
470  *  Pipe functions
471  */
472 BOOL PA_PipeCreate(PA_PIPE *pHPipeRd, PA_PIPE *pHPipeWrt);
473 BOOL PA_PipeClose(PA_PIPE hPipe);
474
475 /*
476  *  Debug
477  */
478 #ifdef _DEBUG
479         #if defined(_WIN32) && defined(__cplusplus) && defined(_USE_MFC) && !defined(_CONSOLE)
480                 #define dbg_msg TRACE
481                 #define PRINTF TRACE
482         #else
483                 #define dbg_msg printf
484                 #define PRINTF printf
485         #endif
486 void dbg_bin(const char *title, const void *p, int size);
487 #else
488         #ifdef _WIN32
489                 #define dbg_msg(fmt, __VA_ARGS__)
490         #else
491                 #define dbg_msg(fmt, args...)
492         #endif
493 #define dbg_bin(x,y,z)
494 #endif
495
496 #ifdef __ANDROID__
497 #include <android/log.h>
498 void android_log(int level, const char *tag, const char *sfmt, ...);
499 #define LOG(sfmt, args...) android_log(ANDROID_LOG_INFO, __FUNCTION__, sfmt, ##args)
500 #define LOGW(sfmt, args...) android_log(ANDROID_LOG_WARN, __FUNCTION__, sfmt, ##args)
501 #define LOGE(sfmt, args...) android_log(ANDROID_LOG_ERROR, __FUNCTION__, sfmt, ##args)
502
503 #undef dbg_msg
504 #define dbg_msg LOG
505
506 #elif defined(__LINUX__)
507
508 #define LOG(sfmt, args...) do { dbg_msg(sfmt, ##args); dbg_msg("\n"); } while(0)
509 #define LOGW(sfmt, args...) do { dbg_msg(sfmt, ##args); dbg_msg("\n"); } while(0)
510 #define LOGE(sfmt, args...) do { dbg_msg(sfmt, ##args); dbg_msg("\n"); } while(0)
511
512 #elif defined(_WIN32)
513
514 #define LOG(sfmt, ...) do { dbg_msg(sfmt, __VA_ARGS__); dbg_msg("\n"); } while(0)
515 #define LOGW(sfmt, ...) do { dbg_msg(sfmt, __VA_ARGS__); dbg_msg("\n"); } while(0)
516 #define LOGE(sfmt, ...) do { dbg_msg(sfmt, __VA_ARGS__); dbg_msg("\n"); } while(0)
517
518 #endif
519
520 #ifdef __cplusplus
521 }
522 #endif
523
524 #endif  //#ifndef __dcs_platform_h__