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 | |