Skip to content

Commit 9722d5f

Browse files
author
Volodymyr Samokhatko
committed
threading: recursive mutex
1 parent 111db4b commit 9722d5f

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

include/rfb/threading.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,20 @@
2626

2727
#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
2828
#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)
2931
#if 0 /* debugging */
3032
#define LOCK(mutex) (rfbLog("%s:%d LOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_lock(&(mutex)))
3133
#define UNLOCK(mutex) (rfbLog("%s:%d UNLOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_unlock(&(mutex)))
3234
#define MUTEX(mutex) pthread_mutex_t (mutex)
3335
#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)
3443
#define TINI_MUTEX(mutex) (rfbLog("%s:%d TINI_MUTEX(%s)\n",__FILE__,__LINE__,#mutex), pthread_mutex_destroy(&(mutex)))
3544
#define TSIGNAL(cond) (rfbLog("%s:%d TSIGNAL(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_signal(&(cond)))
3645
#define WAIT(cond,mutex) (rfbLog("%s:%d WAIT(%s,%s)\n",__FILE__,__LINE__,#cond,#mutex), pthread_cond_wait(&(cond),&(mutex)))
@@ -46,6 +55,13 @@
4655
#define MUTEX(mutex) pthread_mutex_t (mutex)
4756
#define MUTEX_SIZE (sizeof(pthread_mutex_t))
4857
#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)
4965
#define TINI_MUTEX(mutex) pthread_mutex_destroy(&(mutex))
5066
#define TSIGNAL(cond) pthread_cond_signal(&(cond))
5167
#define WAIT(cond,mutex) pthread_cond_wait(&(cond),&(mutex))
@@ -66,6 +82,7 @@
6682
#define MUTEX(mutex) CRITICAL_SECTION (mutex)
6783
#define MUTEX_SIZE (sizeof(CRITICAL_SECTION))
6884
#define INIT_MUTEX(mutex) InitializeCriticalSection(&(mutex))
85+
#define INIT_MUTEX_RECURSIVE(mutex) INIT_MUTEX(mutex)
6986
#define TINI_MUTEX(mutex) DeleteCriticalSection(&(mutex))
7087
#define TSIGNAL(cond) WakeAllConditionVariable(&(cond))
7188
#define WAIT(cond,mutex) SleepConditionVariableCS(&(cond),&(mutex),INFINITE);
@@ -83,6 +100,7 @@
83100
#define UNLOCK(mutex)
84101
#define MUTEX(mutex)
85102
#define INIT_MUTEX(mutex)
103+
#define INIT_MUTEX_RECURSIVE(mutex)
86104
#define TINI_MUTEX(mutex)
87105
#define TSIGNAL(cond)
88106
#define WAIT(cond,mutex) this_is_unsupported

0 commit comments

Comments
 (0)