[Groonga-commit] groonga/groonga at 1e536bf [master] Define COND_BROADCAST (Thanks to t2001).

Back to archive index

Daijiro MORI null+****@clear*****
Fri May 17 15:37:10 JST 2013


Daijiro MORI	2013-05-17 15:37:10 +0900 (Fri, 17 May 2013)

  New Revision: 1e536bff1c15737a99771a9651712b5d1248b02c
  https://github.com/groonga/groonga/commit/1e536bff1c15737a99771a9651712b5d1248b02c

  Message:
    Define COND_BROADCAST (Thanks to t2001).

  Modified files:
    lib/groonga_in.h

  Modified: lib/groonga_in.h (+34 -2)
===================================================================
--- lib/groonga_in.h    2013-05-16 12:45:23 +0900 (eda9dd8)
+++ lib/groonga_in.h    2013-05-17 15:37:10 +0900 (b4b39dd)
@@ -277,6 +277,7 @@ typedef pthread_cond_t grn_cond;
 #define COND_INIT(c)   pthread_cond_init(&c, NULL)
 #define COND_SIGNAL(c) pthread_cond_signal(&c)
 #define COND_WAIT(c,m) pthread_cond_wait(&c, &m)
+#define COND_BROADCAST(c) pthread_cond_broadcast(&c)
 #define COND_INIT_SHARED(c) do {\
   pthread_condattr_t condattr;\
   pthread_condattr_init(&condattr);\
@@ -354,12 +355,14 @@ typedef struct
   HANDLE waiters_count_lock_;
   HANDLE sema_;
   HANDLE waiters_done_;
+  size_t was_broadcast_; 
 } grn_cond;
 
 #define COND_INIT(c) do { \
   (c).waiters_count_ = 0; \
   (c).sema_ = CreateSemaphore(NULL, 0, 0x7fffffff, NULL); \
   MUTEX_INIT((c).waiters_count_lock_); \
+  (c).waiters_done_ = CreateEvent(NULL, FALSE, FALSE, NULL);\
 } while (0)
 
 #define COND_SIGNAL(c) do { \
@@ -373,6 +376,27 @@ typedef struct
   } \
 } while (0)
 
+#define COND_BROADCAST(c) do { \
+  MUTEX_LOCK((c).waiters_count_lock_); \
+  { \
+    int have_waiters = (c).waiters_count_ > 0; \
+    if ((c).waiters_count_ > 0) {  \
+      (c).was_broadcast_ = 1; \
+      have_waiters = 1; \
+    } \
+    if (have_waiters) {\
+      ReleaseSemaphore((c).sema_, (c).waiters_count_, 0); \
+      MUTEX_UNLOCK((c).waiters_count_lock_); \
+      WaitForSingleObject((c).waiters_done_, INFINITE); \
+      (c).was_broadcast_ = 0; \
+    } \
+    else { \
+      MUTEX_UNLOCK((c).waiters_count_lock_); \
+    }\
+  }\
+} while (0)
+      
+  
 #define COND_WAIT(c,m) do { \
   MUTEX_LOCK((c).waiters_count_lock_); \
   (c).waiters_count_++; \
@@ -380,8 +404,16 @@ typedef struct
   SignalObjectAndWait((m), (c).sema_, INFINITE, FALSE); \
   MUTEX_LOCK((c).waiters_count_lock_); \
   (c).waiters_count_--; \
-  MUTEX_UNLOCK((c).waiters_count_lock_); \
-  WaitForSingleObject((m), INFINITE); \
+  { \
+    int last_waiter = (c).was_broadcast_ && (c).waiters_count_ == 0; \
+    MUTEX_UNLOCK((c).waiters_count_lock_); \
+    if (last_waiter)  { \
+      SignalObjectAndWait((c).waiters_done_, (m), INFINITE, FALSE); \
+    } \
+    else { \
+      WaitForSingleObject((m), FALSE); \
+    }\
+  }\
 } while (0)
 
 #else /* WIN32 */
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index