/* 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 { /* initstate = 0: not initialized; 1: init done; 2: init in progress */ LONG initstate; CRITICAL_SECTION csection; } pthread_mutex_t; typedef DWORD pthread_key_t; typedef bool pthread_once_t; #define PTHREAD_MUTEX_INITIALIZER { 0 } #define PTHREAD_ONCE_INIT false int pthread_mutex_init(pthread_mutex_t *, void *attr); int pthread_mutex_lock(pthread_mutex_t *); int pthread_mutex_unlock(pthread_mutex_t *); void win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)); #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 */