d2ef4a640c7766bd6d00176dd89aca108f76ca9e
[tinc] / src / threads.h
1 #ifndef __THREADS_H__
2 #define __THREADS_H__
3
4 #ifdef HAVE_MINGW
5 typedef HANDLE thread_t;
6 typedef CRITICAL_SECTION mutex_t;
7
8 static inline bool thread_create(thread_t *tid, void (*func)(void *), void *arg) {
9         *tid = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, arg, 0, NULL);
10         return tid;
11 }
12 static inline void thread_destroy(thread_t *tid) {
13         WaitForSingleObject(tid, 0);
14         CloseHandle(tid);
15 }
16 static inline void mutex_create(mutex_t *mutex) {
17         InitializeCriticalSection(mutex);
18 }
19 static inline void mutex_lock(mutex_t *mutex) {
20         EnterCriticalSection(mutex);
21 }
22 static inline void mutex_unlock(mutex_t *mutex) {
23         LeaveCriticalSection(mutex);
24 }
25 #else
26 #include <pthread.h>
27
28 typedef pthread_t thread_t;
29 typedef pthread_mutex_t mutex_t;
30
31 static inline bool thread_create(thread_t *tid, void (*func)(void *), void *arg) {
32         return !pthread_create(tid, NULL, (void *(*)(void *))func, arg);
33 }
34 static inline void thread_destroy(thread_t *tid) {
35         pthread_join(*tid, NULL);
36 }
37 static inline void mutex_create(mutex_t *mutex) {
38         pthread_mutex_init(mutex, NULL);
39 }
40 static inline void mutex_lock(mutex_t *mutex) {
41         pthread_mutex_lock(mutex);
42 }
43 static inline void mutex_unlock(mutex_t *mutex) {
44         pthread_mutex_unlock(mutex);
45 }
46 #endif
47
48 #endif