From: Ryan Bloom Date: Tue, 18 Sep 2001 23:09:12 +0000 (+0000) Subject: Turn the worker MPM's queue into a LIFO. This may X-Git-Tag: 2.0.26~224 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=40dc2ab17366c696f0bac1d122115823a1736559;p=apache Turn the worker MPM's queue into a LIFO. This may improve cache-hit performance under some conditions. Submitted by: Aaron Bannert git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@91077 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index e8e94c84ea..f81f646ecd 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,9 @@ Changes with Apache 2.0.26-dev + *) Turn the worker MPM's queue into a LIFO. This may + improve cache-hit performance under some conditions. + [Aaron Bannert ] + *) Switch back to SIGUSR1 for graceful restarts on all platforms that support it. [Justin Erenkrantz] diff --git a/server/mpm/worker/fdqueue.c b/server/mpm/worker/fdqueue.c index 8ffc148afc..753e6ed1ec 100644 --- a/server/mpm/worker/fdqueue.c +++ b/server/mpm/worker/fdqueue.c @@ -73,7 +73,6 @@ static int ap_queue_full(fd_queue_t *queue) */ static int ap_queue_empty(fd_queue_t *queue) { - /*return (queue->head == queue->tail);*/ return (queue->blanks >= queue->bounds - 1); } @@ -108,7 +107,7 @@ int ap_queue_init(fd_queue_t *queue, int queue_capacity, apr_pool_t *a) return FD_QUEUE_FAILURE; bounds = queue_capacity + 1; - queue->head = queue->tail = 0; + queue->tail = 0; queue->data = apr_palloc(a, bounds * sizeof(fd_queue_elem_t)); queue->bounds = bounds; queue->blanks = queue_capacity; @@ -144,7 +143,7 @@ int ap_queue_push(fd_queue_t *queue, apr_socket_t *sd, apr_pool_t *p) queue->data[queue->tail].sd = sd; queue->data[queue->tail].p = p; - queue->tail = (queue->tail + 1) % queue->bounds; + queue->tail++; queue->blanks--; pthread_cond_signal(&queue->not_empty); @@ -164,6 +163,8 @@ int ap_queue_push(fd_queue_t *queue, apr_socket_t *sd, apr_pool_t *p) */ apr_status_t ap_queue_pop(fd_queue_t *queue, apr_socket_t **sd, apr_pool_t **p) { + fd_queue_elem_t *elem; + if (pthread_mutex_lock(&queue->one_big_mutex) != 0) { return FD_QUEUE_FAILURE; } @@ -180,13 +181,12 @@ apr_status_t ap_queue_pop(fd_queue_t *queue, apr_socket_t **sd, apr_pool_t **p) } } - *sd = queue->data[queue->head].sd; - *p = queue->data[queue->head].p; - queue->data[queue->head].sd = NULL; - queue->data[queue->head].p = NULL; - if (sd != NULL) { - queue->head = (queue->head + 1) % queue->bounds; - } + queue->tail--; + elem = &queue->data[queue->tail]; + *sd = elem->sd; + *p = elem->p; + elem->sd = NULL; + elem->p = NULL; queue->blanks++; if (pthread_mutex_unlock(&queue->one_big_mutex) != 0) { diff --git a/server/mpm/worker/fdqueue.h b/server/mpm/worker/fdqueue.h index a0efaa003f..7ac951258b 100644 --- a/server/mpm/worker/fdqueue.h +++ b/server/mpm/worker/fdqueue.h @@ -81,7 +81,6 @@ struct fd_queue_elem_t { typedef struct fd_queue_elem_t fd_queue_elem_t; struct fd_queue_t { - int head; int tail; fd_queue_elem_t *data; int bounds;