blob: 33c897b633c57eda24c2e9dc32eec7f7ffc18a0c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
/* 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 <pthread.h>
#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 */
|