1 /* src/interfaces/ecpg/include/ecpg-pthread-win32.h */ 2 /* 3 * pthread mapping macros for win32 native thread implementation 4 */ 5 #ifndef _ECPG_PTHREAD_WIN32_H 6 #define _ECPG_PTHREAD_WIN32_H 7 8 #ifdef ENABLE_THREAD_SAFETY 9 10 #ifndef WIN32 11 12 #include <pthread.h> 13 #else 14 15 typedef struct pthread_mutex_t 16 { 17 HANDLE handle; 18 LONG initlock; 19 } pthread_mutex_t; 20 21 typedef DWORD pthread_key_t; 22 typedef bool pthread_once_t; 23 24 #define PTHREAD_MUTEX_INITIALIZER { NULL, 0 } 25 #define PTHREAD_ONCE_INIT false 26 27 void win32_pthread_mutex(volatile pthread_mutex_t *mutex); 28 void win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)); 29 30 #define pthread_mutex_lock(mutex) \ 31 do { \ 32 if ((mutex)->handle == NULL) \ 33 win32_pthread_mutex((mutex)); \ 34 WaitForSingleObject((mutex)->handle, INFINITE); \ 35 } while(0) 36 37 #define pthread_mutex_unlock(mutex) \ 38 ReleaseMutex((mutex)->handle) 39 40 #define pthread_getspecific(key) \ 41 TlsGetValue((key)) 42 43 #define pthread_setspecific(key, value) \ 44 TlsSetValue((key), (value)) 45 46 /* FIXME: destructor is never called in Win32. */ 47 #define pthread_key_create(key, destructor) \ 48 do { *(key) = TlsAlloc(); ((void)(destructor)); } while(0) 49 50 #define pthread_once(once, fn) \ 51 do { \ 52 if (!*(once)) \ 53 win32_pthread_once((once), (fn)); \ 54 } while(0) 55 #endif /* WIN32 */ 56 #endif /* ENABLE_THREAD_SAFETY */ 57 58 #endif /* _ECPG_PTHREAD_WIN32_H */ 59