gwion-util
utilities for the Gwion project
Loading...
Searching...
No Matches
gwion_thread.h
Go to the documentation of this file.
1
4#pragma once
5#ifdef BUILD_ON_WINDOWS
6#include <windows.h>
7#define THREAD_RETTYPE long unsigned int
8#define THREAD_FUNC(a) THREAD_RETTYPE(a)(void *data)
9#define THREAD_TYPE HANDLE
10#define THREAD_CREATE(thread, func, arg) \
11 thread = CreateThread(NULL, 0, func, arg, 0, NULL)
12#define THREAD_JOIN(thread) WaitForSingleObject(thread, 0)
13#define THREAD_RETURN(arg) return 0;
14#define THREAD_DETACH(arg)
15
16#define MUTEX_TYPE HANDLE
17#define MUTEX_INITIALIZER NULL
18#define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
19#define MUTEX_CLEANUP(x) CloseHandle(x)
20#define MUTEX_LOCK(x) emulate_pthread_mutex_lock(&(x))
21#define MUTEX_COND_LOCK(x)
22//#define MUTEX_UNLOCK(x) (ReleaseMutex((x)) == 0)
23#define MUTEX_UNLOCK(x) ReleaseMutex((x))
24#define MUTEX_COND_UNLOCK(x) (void)x
25int emulate_pthread_mutex_lock(volatile MUTEX_TYPE *mx);
26
27#define THREAD_COND_TYPE HANDLE
28#define THREAD_COND_SETUP(x) x = CreateEvent(NULL, FALSE, FALSE, NULL);
29#define THREAD_COND_WAIT(x, mutex) WaitForSingleObject(x, INFINITE)
30#define THREAD_COND_SIGNAL(x) SetEvent(x);
31#define THREAD_COND_BROADCAST(x) SetEvent(x);
32#define THREAD_COND_CLEANUP(x) CloseHandle(x)
33#else
34#include <pthread.h>
35
36#define THREAD_RETTYPE void *
37#define THREAD_FUNC(a) THREAD_RETTYPE(a)(void *data)
38#define THREAD_TYPE pthread_t
39#define THREAD_CREATE(thread, func, arg) \
40 pthread_create(&thread, NULL, func, arg)
41#define THREAD_JOIN(thread) pthread_join(thread, NULL)
42#define THREAD_RETURN(arg) \
43 { \
44 pthread_exit(NULL); \
45 return NULL; \
46 }
47#define THREAD_DETACH(arg) pthread_detach(arg)
48
49#define MUTEX_TYPE pthread_mutex_t *
50#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
51#define MUTEX_SETUP(x) \
52 { \
53 pthread_mutexattr_t attr; \
54 pthread_mutexattr_init(&attr); \
55 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \
56 x = (pthread_mutex_t *)xmalloc(sizeof(pthread_mutex_t)); \
57 pthread_mutex_init(x, &attr); \
58 }
59#define MUTEX_CLEANUP(x) \
60 { \
61 pthread_mutex_destroy((x)); \
62 xfree(x); \
63 }
64#define MUTEX_LOCK(x) pthread_mutex_lock((x))
65#define MUTEX_COND_LOCK(x) pthread_mutex_lock((x))
66#define MUTEX_UNLOCK(x) pthread_mutex_unlock((x))
67#define MUTEX_COND_UNLOCK(x) pthread_mutex_unlock((x))
68
69#define THREAD_COND_TYPE pthread_cond_t*
70#define THREAD_COND_SETUP(x) \
71 { \
72 x = (pthread_cond_t *)xcalloc(1, sizeof(pthread_cond_t)); \
73 pthread_cond_init(x, NULL); \
74 }
75#define THREAD_COND_WAIT(x, mutex) pthread_cond_wait(x, mutex)
76#define THREAD_COND_SIGNAL(x) pthread_cond_signal(x)
77#define THREAD_COND_BROADCAST(x) pthread_cond_broadcast(x)
78#define THREAD_COND_CLEANUP(x) \
79 { \
80 pthread_cond_destroy(x); \
81 xfree(x); \
82 }
83
84#endif
85
86#define STR_EXPAND(tok) #tok
87#define STR(tok) STR_EXPAND(tok)
88#ifndef BUILD_ON_WINDOWS
89#include <dlfcn.h>
90#define DLOPEN(dl, b) dlopen(dl, b)
91#define DLSYM(dl, t, a) (t)(intptr_t) dlsym(dl, a)
92#define DLCLOSE(dl) dlclose(dl)
93#define DLERROR() dlerror()
94#else
95#include "windows.h"
96#define DLOPEN(dl, b) LoadLibrary(dl)
97#define DLSYM(dl, t, a) (t)(intptr_t) GetProcAddress(dl, a)
98#define DLCLOSE(dl) FreeLibrary(dl)
99#define DLERROR() "plugin"
100#endif
#define MUTEX_TYPE