1 #include "platform_adpt.h"
9 WSAStartup(0x0202, &wd);
12 int PA_Write(PA_HFILE hFile, const void *pBuff, unsigned int size)
15 if( ! WriteFile(hFile, pBuff, size, &dwWritten, NULL) )
19 int PA_Read(PA_HFILE hFile, void *pBuff, unsigned int size)
22 if( ! ReadFile(hFile, pBuff, size, &dwReaden, NULL) )
27 PA_HTHREAD PA_ThreadCreate(PA_ThreadRoutine* routine, void* data)
29 return CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)routine, data, 0, NULL);
32 void *PA_ThreadWaitUntilTerminate(PA_HTHREAD hThread)
35 WaitForSingleObject(hThread, INFINITE);
36 GetExitCodeThread(hThread, &dwExitCode);
37 return (void*)dwExitCode;
40 BOOL PA_PipeCreate(PA_PIPE *pHPipeRd, PA_PIPE *pHPipeWrt)
42 return CreatePipe(pHPipeRd, pHPipeWrt, NULL, 0) == TRUE;
44 BOOL PA_PipeClose(PA_PIPE hPipe)
46 return CloseHandle(hPipe);
49 int PA_SocketSetNBlk(PA_SOCKET s, BOOL b)
51 return ioctlsocket(s, FIONBIO, (u_long*)&b);
54 /*****************************
56 *****************************/
57 enum { LOCK_LEVEL_NONE, LOCK_LEVEL_READ, LOCK_LEVEL_WRITE };
59 RWLOCK *RWLockCreate()
61 RWLOCK *pLock = (RWLOCK*)malloc(sizeof(RWLOCK));
62 pLock->m_currentLevel = LOCK_LEVEL_NONE;
63 pLock->m_readerCount = pLock->m_writeCount = 0;
64 pLock->m_writerId = 0;
65 //pLock->m_unlockEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
66 pLock->m_unlockEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
67 pLock->m_accessMutex = CreateMutex( NULL, FALSE, NULL );
68 InitializeCriticalSection( &pLock->m_csStateChange );
72 BOOL RWLockDestroy(RWLOCK *pLock)
74 DeleteCriticalSection( &pLock->m_csStateChange );
75 if ( pLock->m_accessMutex ) CloseHandle( pLock->m_accessMutex );
76 if ( pLock->m_unlockEvent ) CloseHandle( pLock->m_unlockEvent );
81 static BOOL _Lock(RWLOCK *pLock, int level, DWORD timeout)
86 waitResult = WaitForSingleObject( pLock->m_accessMutex, timeout );
87 if ( waitResult != WAIT_OBJECT_0 ) return FALSE;
89 if ( level == LOCK_LEVEL_READ && pLock->m_currentLevel != LOCK_LEVEL_WRITE )
91 EnterCriticalSection( &pLock->m_csStateChange );
92 pLock->m_currentLevel = level;
93 pLock->m_readerCount += 1;
94 ResetEvent( pLock->m_unlockEvent );
95 LeaveCriticalSection( &pLock->m_csStateChange );
97 else if ( level == LOCK_LEVEL_READ &&
98 pLock->m_currentLevel == LOCK_LEVEL_WRITE )
100 waitResult = WaitForSingleObject( pLock->m_unlockEvent, timeout );
101 if ( waitResult == WAIT_OBJECT_0 )
103 EnterCriticalSection( &pLock->m_csStateChange );
104 pLock->m_currentLevel = level;
105 pLock->m_readerCount += 1;
106 ResetEvent( pLock->m_unlockEvent );
107 LeaveCriticalSection( &pLock->m_csStateChange );
109 else bresult = FALSE;
111 else if ( level == LOCK_LEVEL_WRITE &&
112 pLock->m_currentLevel == LOCK_LEVEL_NONE )
114 EnterCriticalSection( &pLock->m_csStateChange );
115 pLock->m_currentLevel = level;
116 pLock->m_writerId = GetCurrentThreadId();
117 pLock->m_writeCount = 1;
118 ResetEvent( pLock->m_unlockEvent );
119 LeaveCriticalSection( &pLock->m_csStateChange );
121 else if ( level == LOCK_LEVEL_WRITE &&
122 pLock->m_currentLevel != LOCK_LEVEL_NONE )
124 DWORD id = GetCurrentThreadId();
125 if(id == pLock->m_writerId) pLock->m_writeCount++;
128 waitResult = WaitForSingleObject( pLock->m_unlockEvent, timeout );
129 if ( waitResult == WAIT_OBJECT_0 )
131 EnterCriticalSection( &pLock->m_csStateChange );
132 pLock->m_currentLevel = level;
133 pLock->m_writerId = GetCurrentThreadId();
134 pLock->m_writeCount = 1;
135 ResetEvent( pLock->m_unlockEvent );
136 LeaveCriticalSection( &pLock->m_csStateChange );
138 else bresult = FALSE;
142 ReleaseMutex( pLock->m_accessMutex );
147 BOOL RWLockLockR(RWLOCK *pLock, DWORD timeout)
149 return _Lock(pLock, LOCK_LEVEL_READ, timeout);
152 BOOL RWLockLockW(RWLOCK *pLock, DWORD timeout)
154 return _Lock(pLock, LOCK_LEVEL_WRITE, timeout);
157 void RWLockUnlock(RWLOCK *pLock)
159 EnterCriticalSection( &pLock->m_csStateChange );
160 if ( pLock->m_currentLevel == LOCK_LEVEL_READ )
162 pLock->m_readerCount --;
163 if ( pLock->m_readerCount == 0 )
165 pLock->m_currentLevel = LOCK_LEVEL_NONE;
166 SetEvent (pLock->m_unlockEvent);
169 else if ( pLock->m_currentLevel == LOCK_LEVEL_WRITE )
171 pLock->m_writeCount--;
172 if(pLock->m_writeCount == 0)
174 pLock->m_currentLevel = LOCK_LEVEL_NONE;
175 pLock->m_writerId = 0;
176 SetEvent ( pLock->m_unlockEvent );
179 LeaveCriticalSection( &pLock->m_csStateChange );
183 /////////////////////////////////////////////////////////
184 #elif defined(__linux__)
186 BOOL PA_EventWaitTimed(PA_EVENT e, DWORD ms)
191 clock_gettime(CLOCK_MONOTONIC, &ts);
192 ts.tv_sec += ms/1000;
193 ts.tv_nsec += (ms%1000)*1000000;
195 gettimeofday((struct timeval*)&ts, NULL);
197 ts.tv_sec += ms/1000;
198 ts.tv_nsec += (ms%1000)*1000000;
199 if(ts.tv_nsec > 1000000000) {
200 ts.tv_nsec -= 1000000000;
204 return sem_timedwait(e, &ts) == 0;
207 PA_HTHREAD PA_ThreadCreate(PA_ThreadRoutine* routine, void* data)
210 if(pthread_create(&thd, NULL, routine, data) == 0)
216 void* PA_ThreadWaitUntilTerminate(PA_HTHREAD hThread)
219 pthread_join(hThread, &tmp); return tmp;
222 BOOL PA_PipeCreate(PA_PIPE *pHPipeRd, PA_PIPE *pHPipeWrt)
225 if(pipe(fds) < 0) return FALSE;
230 BOOL PA_PipeClose(PA_PIPE hPipe)
232 return 0 == close(hPipe);
235 void PA_Sleep(UINT ms)
239 tv.tv_usec = (ms%1000)*1000;
240 select(0, NULL, NULL, NULL, &tv);
243 DWORD PA_GetTickCount()
246 clock_gettime(CLOCK_MONOTONIC, &ts);
247 return 1000*ts.tv_sec + ts.tv_nsec/1000000;
250 BOOL PA_DeleteFile(const char *fn)
252 return unlink(fn) == 0;
255 int PA_SocketSetNBlk(PA_SOCKET s, BOOL b)
257 int opt = fcntl(s, F_GETFL, &opt, 0);
258 if(b) opt |= O_NONBLOCK;
259 else opt &= ~O_NONBLOCK;
260 return fcntl(s, F_SETFL, opt);
263 /***********************
265 ***********************/
266 BOOL _RWLockLockR(pthread_rwlock_t *lock, DWORD timeout)
268 if(timeout == INFINITE)
269 return pthread_rwlock_rdlock(lock) == 0;
272 while(!pthread_rwlock_tryrdlock(lock) && timeout > 0)
275 if(timeout > 10) timeout -= 10;
281 BOOL _RWLockLockW(pthread_rwlock_t *lock, DWORD timeout)
283 if(timeout == INFINITE)
284 return pthread_rwlock_wrlock(lock)==0;
287 while(!pthread_rwlock_trywrlock(lock) && timeout > 0)
290 if(timeout > 10) timeout -= 10;
297 #elif defined(ARM_UCOS_LWIP)
298 PA_HTHREAD PA_ThreadCreate(PA_ThreadRoutine* routine, void* data)
300 //sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio)
301 return sys_thread_new(NULL, routine, data, 0, 10);
303 void* PA_ThreadWaitUntilTerminate(PA_HTHREAD hThread)
308 int PA_SocketSetNBlk(PA_SOCKET s, BOOL b)
310 return lwip_ioctl(s, FIONBIO, (void*)&b);
315 void android_log(int level, const char *tag, const char *sfmt, ...)
320 vsnprintf(buf, sizeof(buf), sfmt, va);
322 __android_log_write(level, tag, buf);
326 int PA_SocketSetLinger(PA_SOCKET s, int onoff, int linger)
328 struct linger opt = { onoff, linger };
329 return setsockopt(s, SOL_SOCKET, SO_LINGER,
339 void dbg_bin(const char *title, const void *p, int size)
342 unsigned char *byts = (unsigned char*)p;
344 for(i=0; i<size; i++)
346 printf("%02X ", byts[i]);
347 if(i>0 && (i&31) == 31) printf("\n");
352 #define dbg_bin(x, y, z)