You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2011/01/27 20:34:38 UTC

svn commit: r1064269 - in /httpd/httpd/trunk/server/mpm: event/fdqueue.c event/fdqueue.h worker/fdqueue.c worker/fdqueue.h

Author: jim
Date: Thu Jan 27 19:34:38 2011
New Revision: 1064269

URL: http://svn.apache.org/viewvc?rev=1064269&view=rev
Log:
Revert an old (~10yr) change to the fd Q; move back to
FIFO rather than LIFO, for more consistent performance
so that older requests don't suffer

Modified:
    httpd/httpd/trunk/server/mpm/event/fdqueue.c
    httpd/httpd/trunk/server/mpm/event/fdqueue.h
    httpd/httpd/trunk/server/mpm/worker/fdqueue.c
    httpd/httpd/trunk/server/mpm/worker/fdqueue.h

Modified: httpd/httpd/trunk/server/mpm/event/fdqueue.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/fdqueue.c?rev=1064269&r1=1064268&r2=1064269&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/event/fdqueue.c (original)
+++ httpd/httpd/trunk/server/mpm/event/fdqueue.c Thu Jan 27 19:34:38 2011
@@ -310,6 +310,8 @@ apr_status_t ap_queue_init(fd_queue_t * 
     queue->data = apr_palloc(a, queue_capacity * sizeof(fd_queue_elem_t));
     queue->bounds = queue_capacity;
     queue->nelts = 0;
+    queue->in = 0;
+    queue->out = 0;
 
     /* Set all the sockets in the queue to NULL */
     for (i = 0; i < queue_capacity; ++i)
@@ -340,7 +342,10 @@ apr_status_t ap_queue_push(fd_queue_t * 
     AP_DEBUG_ASSERT(!queue->terminated);
     AP_DEBUG_ASSERT(!ap_queue_full(queue));
 
-    elem = &queue->data[queue->nelts];
+    elem = &queue->data[queue->in];
+    queue->in++;
+    if (queue->in >= queue->bounds)
+        queue->in -= queue->bounds;
     elem->sd = sd;
     elem->cs = cs;
     elem->p = p;
@@ -420,7 +425,11 @@ apr_status_t ap_queue_pop_something(fd_q
         APR_RING_REMOVE(*te_out, link);
     }
     else {
-        elem = &queue->data[--queue->nelts];
+        elem = &queue->data[queue->out];
+        queue->out++;
+        if (queue->out >= queue->bounds)
+            queue->out -= queue->bounds;
+        queue->nelts--;
         *sd = elem->sd;
         *cs = elem->cs;
         *p = elem->p;

Modified: httpd/httpd/trunk/server/mpm/event/fdqueue.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/fdqueue.h?rev=1064269&r1=1064268&r2=1064269&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/event/fdqueue.h (original)
+++ httpd/httpd/trunk/server/mpm/event/fdqueue.h Thu Jan 27 19:34:38 2011
@@ -70,8 +70,10 @@ struct fd_queue_t
 {
     APR_RING_HEAD(timers_t, timer_event_t) timers;
     fd_queue_elem_t *data;
-    int nelts;
-    int bounds;
+    unsigned int nelts;
+    unsigned int bounds;
+    unsigned int in;
+    unsigned int out;
     apr_thread_mutex_t *one_big_mutex;
     apr_thread_cond_t *not_empty;
     int terminated;

Modified: httpd/httpd/trunk/server/mpm/worker/fdqueue.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/fdqueue.c?rev=1064269&r1=1064268&r2=1064269&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/fdqueue.c (original)
+++ httpd/httpd/trunk/server/mpm/worker/fdqueue.c Thu Jan 27 19:34:38 2011
@@ -284,6 +284,8 @@ apr_status_t ap_queue_init(fd_queue_t *q
     queue->data = apr_palloc(a, queue_capacity * sizeof(fd_queue_elem_t));
     queue->bounds = queue_capacity;
     queue->nelts = 0;
+    queue->in = 0;
+    queue->out = 0;
 
     /* Set all the sockets in the queue to NULL */
     for (i = 0; i < queue_capacity; ++i)
@@ -312,7 +314,10 @@ apr_status_t ap_queue_push(fd_queue_t *q
     AP_DEBUG_ASSERT(!queue->terminated);
     AP_DEBUG_ASSERT(!ap_queue_full(queue));
 
-    elem = &queue->data[queue->nelts];
+    elem = &queue->data[queue->in];
+    queue->in++;
+    if (queue->in >= queue->bounds)
+        queue->in -= queue->bounds;
     elem->sd = sd;
     elem->p = p;
     queue->nelts++;
@@ -361,7 +366,11 @@ apr_status_t ap_queue_pop(fd_queue_t *qu
         }
     }
 
-    elem = &queue->data[--queue->nelts];
+    elem = &queue->data[queue->out];
+    queue->out++;
+    if (queue->out >= queue->bounds)
+        queue->out -= queue->bounds;
+    queue->nelts--;
     *sd = elem->sd;
     *p = elem->p;
 #ifdef AP_DEBUG

Modified: httpd/httpd/trunk/server/mpm/worker/fdqueue.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/fdqueue.h?rev=1064269&r1=1064268&r2=1064269&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/fdqueue.h (original)
+++ httpd/httpd/trunk/server/mpm/worker/fdqueue.h Thu Jan 27 19:34:38 2011
@@ -55,8 +55,10 @@ typedef struct fd_queue_elem_t fd_queue_
 
 struct fd_queue_t {
     fd_queue_elem_t    *data;
-    int                 nelts;
-    int                 bounds;
+    unsigned int       nelts;
+    unsigned int       bounds;
+    unsigned int       in;
+    unsigned int       out;
     apr_thread_mutex_t *one_big_mutex;
     apr_thread_cond_t  *not_empty;
     int                 terminated;