Can you do us a big favor and please resubmit the patch without any whitespace changes? That is, only diff what you actually changed. We

No problem. Here she is.

--
jacob lewallen
[EMAIL PROTECTED]
Index: apr_queue.c
===================================================================
RCS file: /home/cvspublic/apr-util/misc/apr_queue.c,v
retrieving revision 1.10
diff -u -u -r1.10 apr_queue.c
--- apr_queue.c 13 Jan 2003 20:15:50 -0000      1.10
+++ apr_queue.c 10 Feb 2003 22:08:31 -0000
@@ -85,6 +85,8 @@
     unsigned int        in;    /**< next empty location */
     unsigned int        out;   /**< next filled location */
     unsigned int        bounds;/**< max size of queue */
+    unsigned int        full_waiters;
+    unsigned int        empty_waiters;
     apr_thread_mutex_t *one_big_mutex;
     apr_thread_cond_t  *not_empty;
     apr_thread_cond_t  *not_full;
@@ -169,6 +171,8 @@
     queue->in = 0;
     queue->out = 0;
     queue->terminated = 0;
+    queue->full_waiters = 0;
+    queue->empty_waiters = 0;
 
     apr_pool_cleanup_register(a, queue, queue_destroy, apr_pool_cleanup_null);
 
@@ -183,7 +187,6 @@
 APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data)
 {
     apr_status_t rv;
-    int need_signal = 0;
 
     if (queue->terminated) {
         return APR_EOF; /* no more elements ever again */
@@ -196,7 +199,9 @@
 
     if (apr_queue_full(queue)) {
         if (!queue->terminated) {
+            queue->full_waiters++;
             rv = apr_thread_cond_wait(queue->not_full, queue->one_big_mutex);
+            queue->full_waiters--;
             if (rv != APR_SUCCESS) {
                 apr_thread_mutex_unlock(queue->one_big_mutex);
                 return rv;
@@ -218,16 +223,11 @@
         }
     }
 
-    /* if we were empty then signal that we aren't */
-    if (apr_queue_empty(queue)) {
-        need_signal = 1;
-    }
-
     queue->data[queue->in] = data;
     queue->in = (queue->in + 1) % queue->bounds;
     queue->nelts++;
 
-    if (need_signal == 1) {
+    if (queue->empty_waiters) {
         Q_DBG("sig !empty", queue);
         rv = apr_thread_cond_signal(queue->not_empty);
         if (rv != APR_SUCCESS) {
@@ -248,7 +248,7 @@
 APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data)
 {
     apr_status_t rv;
-    int need_signal = 0;
+
     if (queue->terminated) {
         return APR_EOF; /* no more elements ever again */
     }
@@ -262,17 +262,12 @@
         rv = apr_thread_mutex_unlock(queue->one_big_mutex);
         return APR_EAGAIN;
     }
-
-    /* if we were empty then signal that we aren't */
-    if (apr_queue_empty(queue)) {
-        need_signal = 1;
-    }
     
     queue->data[queue->in] = data;
     queue->in = (queue->in + 1) % queue->bounds;
     queue->nelts++;
 
-    if (need_signal == 1) {
+    if (queue->empty_waiters) {
         Q_DBG("sig !empty", queue);
         rv  = apr_thread_cond_signal(queue->not_empty);
         if (rv != APR_SUCCESS) {
@@ -301,7 +296,6 @@
 APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data)
 {
     apr_status_t rv;
-    int need_signal = 0;
 
     if (queue->terminated) {
         return APR_EOF; /* no more elements ever again */
@@ -315,7 +309,9 @@
     /* Keep waiting until we wake up and find that the queue is not empty. */
     if (apr_queue_empty(queue)) {
         if (!queue->terminated) {
+            queue->empty_waiters++;
             rv = apr_thread_cond_wait(queue->not_empty, queue->one_big_mutex);
+            queue->empty_waiters--;
             if (rv != APR_SUCCESS) {
                 apr_thread_mutex_unlock(queue->one_big_mutex);
                 return rv;
@@ -336,15 +332,12 @@
             }
         }
     } 
-    if (apr_queue_full(queue)) {
-        need_signal = 1;
-    }
 
     *data = &queue->data[queue->out];
     queue->nelts--;
 
     queue->out = (queue->out + 1) % queue->bounds;
-    if (need_signal == 1) {
+    if (queue->full_waiters) {
         Q_DBG("signal !full", queue);
         rv = apr_thread_cond_signal(queue->not_full);
         if (rv != APR_SUCCESS) {
@@ -366,7 +359,6 @@
 APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data)
 {
     apr_status_t rv;
-    int need_signal = 0;
 
     if (queue->terminated) {
         return APR_EOF; /* no more elements ever again */
@@ -382,15 +374,12 @@
         rv = apr_thread_mutex_unlock(queue->one_big_mutex);
         return APR_EAGAIN;
     } 
-    if (apr_queue_full(queue)) {
-        need_signal = 1;
-    }
 
     *data = &queue->data[queue->out];
     queue->nelts--;
 
     queue->out = (queue->out + 1) % queue->bounds;
-    if (need_signal == 1) {
+    if (queue->full_waiters) {
         Q_DBG("signal !full", queue);
         rv = apr_thread_cond_signal(queue->not_full);
         if (rv != APR_SUCCESS) {

Reply via email to