1 /*typedef CRITICAL_SECTION perl_mutex;*/
2 typedef HANDLE perl_mutex;
3 typedef HANDLE perl_cond;
4 typedef DWORD perl_key;
5 typedef HANDLE perl_thread;
7 /* XXX Critical Sections used instead of mutexes: lightweight,
8 * but can't be communicated to child processes, and can't get
9 * HANDLE to it for use elsewhere
12 #define MUTEX_INIT(m) InitializeCriticalSection(m)
13 #define MUTEX_LOCK(m) EnterCriticalSection(m)
14 #define MUTEX_UNLOCK(m) LeaveCriticalSection(m)
15 #define MUTEX_DESTROY(m) DeleteCriticalSection(m)
18 #define MUTEX_INIT(m) \
20 if ((*(m) = CreateMutex(NULL,FALSE,NULL)) == NULL) \
21 croak("panic: MUTEX_INIT"); \
23 #define MUTEX_LOCK(m) \
25 if (WaitForSingleObject(*(m),INFINITE) == WAIT_FAILED) \
26 croak("panic: MUTEX_LOCK"); \
28 #define MUTEX_UNLOCK(m) \
30 if (ReleaseMutex(*(m)) == 0) \
31 croak("panic: MUTEX_UNLOCK"); \
33 #define MUTEX_DESTROY(m) \
35 if (CloseHandle(*(m)) == 0) \
36 croak("panic: MUTEX_DESTROY"); \
39 #define COND_INIT(c) \
41 if ((*(c) = CreateEvent(NULL,TRUE,FALSE,NULL)) == NULL) \
42 croak("panic: COND_INIT"); \
44 #define COND_SIGNAL(c) \
46 if (PulseEvent(*(c)) == 0) \
47 croak("panic: COND_SIGNAL (%ld)",GetLastError()); \
49 #define COND_BROADCAST(c) \
51 if (PulseEvent(*(c)) == 0) \
52 croak("panic: COND_BROADCAST"); \
54 /* #define COND_WAIT(c, m) \
56 if (WaitForSingleObject(*(c),INFINITE) == WAIT_FAILED) \
57 croak("panic: COND_WAIT"); \
60 #define COND_WAIT(c, m) \
62 if (SignalObjectAndWait(*(m),*(c),INFINITE,FALSE) == WAIT_FAILED)\
63 croak("panic: COND_WAIT"); \
67 #define COND_DESTROY(c) \
69 if (CloseHandle(*(c)) == 0) \
70 croak("panic: COND_DESTROY"); \
75 if (CloseHandle((t)->Tself) == 0) { \
76 MUTEX_UNLOCK(&(t)->mutex); \
77 croak("panic: DETACH"); \
81 #define THR ((struct thread *) TlsGetValue(thr_key))
83 #define HAVE_THREAD_INTERN
85 #define JOIN(t, avp) \
87 if ((WaitForSingleObject((t)->Tself,INFINITE) == WAIT_FAILED) \
88 || (GetExitCodeThread((t)->Tself,(LPDWORD)(avp)) == 0)) \
89 croak("panic: JOIN"); \
94 if (TlsSetValue(thr_key, (void *) (t)) == 0) \
95 croak("panic: TlsSetValue"); \
98 #define THREAD_CREATE(t, f) thread_create(t, f)
99 #define THREAD_POST_CREATE(t) NOOP
100 #define THREAD_RET_TYPE DWORD WINAPI
101 #define THREAD_RET_CAST(p) ((DWORD)(p))
102 #define YIELD Sleep(0)