/* src/interfaces/ecpg/include/ecpg-pthread-win32.h */ /* * pthread mapping macros for win32 native thread implementation */ #ifndef _ECPG_PTHREAD_WIN32_H #define _ECPG_PTHREAD_WIN32_H #ifdef ENABLE_THREAD_SAFETY #ifndef WIN32 #include #else typedef struct pthread_mutex_t { HANDLE handle; LONG initlock; } pthread_mutex_t; typedef DWORD pthread_key_t; typedef bool pthread_once_t; #define PTHREAD_MUTEX_INITIALIZER { NULL, 0 } #define PTHREAD_ONCE_INIT false void win32_pthread_mutex(volatile pthread_mutex_t *mutex); void win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)); #define pthread_mutex_lock(mutex) \ do { \ if ((mutex)->handle == NULL) \ win32_pthread_mutex((mutex)); \ WaitForSingleObject((mutex)->handle, INFINITE); \ } while(0) #define pthread_mutex_unlock(mutex) \ ReleaseMutex((mutex)->handle) #define pthread_getspecific(key) \ TlsGetValue((key)) #define pthread_setspecific(key, value) \ TlsSetValue((key), (value)) /* FIXME: destructor is never called in Win32. */ #define pthread_key_create(key, destructor) \ do { *(key) = TlsAlloc(); ((void)(destructor)); } while(0) #define pthread_once(once, fn) \ do { \ if (!*(once)) \ win32_pthread_once((once), (fn)); \ } while(0) #endif /* WIN32 */ #endif /* ENABLE_THREAD_SAFETY */ #endif /* _ECPG_PTHREAD_WIN32_H */