diff options
author | Ryan Bloom <rbb@apache.org> | 2001-09-19 01:09:12 +0200 |
---|---|---|
committer | Ryan Bloom <rbb@apache.org> | 2001-09-19 01:09:12 +0200 |
commit | 40dc2ab17366c696f0bac1d122115823a1736559 (patch) | |
tree | 75f188d6f59057625cea67652d9cfcb708635034 /server | |
parent | Switch back to SIGUSR1 for graceful restarts on all platforms that (diff) | |
download | apache2-40dc2ab17366c696f0bac1d122115823a1736559.tar.xz apache2-40dc2ab17366c696f0bac1d122115823a1736559.zip |
Turn the worker MPM's queue into a LIFO. This may
improve cache-hit performance under some conditions.
Submitted by: Aaron Bannert <aaron@clove.org>
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@91077 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'server')
-rw-r--r-- | server/mpm/worker/fdqueue.c | 20 | ||||
-rw-r--r-- | server/mpm/worker/fdqueue.h | 1 |
2 files changed, 10 insertions, 11 deletions
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; |