ithewei 5 лет назад
Родитель
Сommit
7dac03c258
2 измененных файлов с 32 добавлено и 0 удалено
  1. 18 0
      base/hmutex.h
  2. 14 0
      unittest/hmutex_test.c

+ 18 - 0
base/hmutex.h

@@ -14,6 +14,12 @@ BEGIN_EXTERN_C
 #define hmutex_lock             EnterCriticalSection
 #define hmutex_unlock           LeaveCriticalSection
 
+#define hrecursive_mutex_t          CRITICAL_SECTION
+#define hrecursive_mutex_init       InitializeCriticalSection
+#define hrecursive_mutex_destroy    DeleteCriticalSection
+#define hrecursive_mutex_lock       EnterCriticalSection
+#define hrecursive_mutex_unlock     LeaveCriticalSection
+
 #define HSPINLOCK_COUNT         -1
 #define hspinlock_t             CRITICAL_SECTION
 #define hspinlock_init(pspin)   InitializeCriticalSectionAndSpinCount(pspin, HSPINLOCK_COUNT)
@@ -75,6 +81,18 @@ static inline void honce(honce_t* once, honce_fn fn) {
 #define hmutex_lock             pthread_mutex_lock
 #define hmutex_unlock           pthread_mutex_unlock
 
+#define hrecursive_mutex_t          pthread_mutex_t
+#define hrecursive_mutex_init(pmutex) \
+    do {\
+        pthread_mutexattr_t attr;\
+        pthread_mutexattr_init(&attr);\
+        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);\
+        pthread_mutex_init(pmutex, &attr);\
+    } while(0)
+#define hrecursive_mutex_destroy    pthread_mutex_destroy
+#define hrecursive_mutex_lock       pthread_mutex_lock
+#define hrecursive_mutex_unlock     pthread_mutex_unlock
+
 #if HAVE_PTHREAD_SPIN_LOCK
 #define hspinlock_t             pthread_spinlock_t
 #define hspinlock_init(pspin)   pthread_spin_init(pspin, PTHREAD_PROCESS_PRIVATE)

+ 14 - 0
unittest/hmutex_test.c

@@ -25,6 +25,18 @@ HTHREAD_ROUTINE(test_mutex) {
     return 0;
 }
 
+HTHREAD_ROUTINE(test_recursive_mutex) {
+    hrecursive_mutex_t mutex;
+    hrecursive_mutex_init(&mutex);
+    hrecursive_mutex_lock(&mutex);
+    hrecursive_mutex_lock(&mutex);
+    hrecursive_mutex_unlock(&mutex);
+    hrecursive_mutex_unlock(&mutex);
+    hrecursive_mutex_destroy(&mutex);
+    printf("hrecursive_mutex test OK!\n");
+    return 0;
+}
+
 HTHREAD_ROUTINE(test_spinlock) {
     hspinlock_t spin;
     hspinlock_init(&spin);
@@ -102,6 +114,7 @@ HTHREAD_ROUTINE(test_sem) {
 int main(int argc, char* argv[]) {
     hthread_t thread_once = hthread_create(test_once, NULL);
     hthread_t thread_mutex = hthread_create(test_mutex, NULL);
+    hthread_t thread_recursive_mutex = hthread_create(test_recursive_mutex, NULL);
     hthread_t thread_spinlock = hthread_create(test_spinlock, NULL);
     hthread_t thread_rwlock = hthread_create(test_rwlock, NULL);
     hthread_t thread_timed_mutex = hthread_create(test_timed_mutex, NULL);
@@ -110,6 +123,7 @@ int main(int argc, char* argv[]) {
 
     hthread_join(thread_once);
     hthread_join(thread_mutex);
+    hthread_join(thread_recursive_mutex);
     hthread_join(thread_spinlock);
     hthread_join(thread_rwlock);
     hthread_join(thread_timed_mutex);