|
26 | 26 |
|
27 | 27 | #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD |
28 | 28 | #include <pthread.h> |
| 29 | +#define RFB_THREADING_GLUE_DETAIL(x, y) x ## y |
| 30 | +#define RFB_THREADING_GLUE(x, y) RFB_THREADING_GLUE_DETAIL(x, y) |
29 | 31 | #if 0 /* debugging */ |
30 | 32 | #define LOCK(mutex) (rfbLog("%s:%d LOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_lock(&(mutex))) |
31 | 33 | #define UNLOCK(mutex) (rfbLog("%s:%d UNLOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_unlock(&(mutex))) |
32 | 34 | #define MUTEX(mutex) pthread_mutex_t (mutex) |
33 | 35 | #define INIT_MUTEX(mutex) (rfbLog("%s:%d INIT_MUTEX(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_init(&(mutex),NULL)) |
| 36 | +#define INIT_MUTEX_RECURSIVE(mutex) do { \ |
| 37 | + rfbLog("%s:%d INIT_MUTEX_RECURSIVE(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex); \ |
| 38 | + pthread_mutexattr_t RFB_THREADING_GLUE(recattr, __LINE__); \ |
| 39 | + pthread_mutexattr_settype(&RFB_THREADING_GLUE(recattr, __LINE__), PTHREAD_MUTEX_RECURSIVE); \ |
| 40 | + pthread_mutex_init(&(mutex), &RFB_THREADING_GLUE(recattr, __LINE__)); \ |
| 41 | + pthread_mutexattr_destroy(&RFB_THREADING_GLUE(recattr, __LINE__)); \ |
| 42 | + } while (0) |
34 | 43 | #define TINI_MUTEX(mutex) (rfbLog("%s:%d TINI_MUTEX(%s)\n",__FILE__,__LINE__,#mutex), pthread_mutex_destroy(&(mutex))) |
35 | 44 | #define TSIGNAL(cond) (rfbLog("%s:%d TSIGNAL(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_signal(&(cond))) |
36 | 45 | #define WAIT(cond,mutex) (rfbLog("%s:%d WAIT(%s,%s)\n",__FILE__,__LINE__,#cond,#mutex), pthread_cond_wait(&(cond),&(mutex))) |
|
46 | 55 | #define MUTEX(mutex) pthread_mutex_t (mutex) |
47 | 56 | #define MUTEX_SIZE (sizeof(pthread_mutex_t)) |
48 | 57 | #define INIT_MUTEX(mutex) pthread_mutex_init(&(mutex),NULL) |
| 58 | +#define INIT_MUTEX_RECURSIVE(mutex) do { \ |
| 59 | + pthread_mutexattr_t RFB_THREADING_GLUE(recattr, __LINE__); \ |
| 60 | + pthread_mutexattr_init(&RFB_THREADING_GLUE(recattr, __LINE__)); \ |
| 61 | + pthread_mutexattr_settype(&RFB_THREADING_GLUE(recattr, __LINE__), PTHREAD_MUTEX_RECURSIVE); \ |
| 62 | + pthread_mutex_init(&(mutex), &RFB_THREADING_GLUE(recattr, __LINE__)); \ |
| 63 | + pthread_mutexattr_destroy(&RFB_THREADING_GLUE(recattr, __LINE__)); \ |
| 64 | + } while (0) |
49 | 65 | #define TINI_MUTEX(mutex) pthread_mutex_destroy(&(mutex)) |
50 | 66 | #define TSIGNAL(cond) pthread_cond_signal(&(cond)) |
51 | 67 | #define WAIT(cond,mutex) pthread_cond_wait(&(cond),&(mutex)) |
|
66 | 82 | #define MUTEX(mutex) CRITICAL_SECTION (mutex) |
67 | 83 | #define MUTEX_SIZE (sizeof(CRITICAL_SECTION)) |
68 | 84 | #define INIT_MUTEX(mutex) InitializeCriticalSection(&(mutex)) |
| 85 | +#define INIT_MUTEX_RECURSIVE(mutex) INIT_MUTEX(mutex) |
69 | 86 | #define TINI_MUTEX(mutex) DeleteCriticalSection(&(mutex)) |
70 | 87 | #define TSIGNAL(cond) WakeAllConditionVariable(&(cond)) |
71 | 88 | #define WAIT(cond,mutex) SleepConditionVariableCS(&(cond),&(mutex),INFINITE); |
|
83 | 100 | #define UNLOCK(mutex) |
84 | 101 | #define MUTEX(mutex) |
85 | 102 | #define INIT_MUTEX(mutex) |
| 103 | +#define INIT_MUTEX_RECURSIVE(mutex) |
86 | 104 | #define TINI_MUTEX(mutex) |
87 | 105 | #define TSIGNAL(cond) |
88 | 106 | #define WAIT(cond,mutex) this_is_unsupported |
|
0 commit comments