summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorRyan Bloom <rbb@apache.org>2001-09-19 01:09:12 +0200
committerRyan Bloom <rbb@apache.org>2001-09-19 01:09:12 +0200
commit40dc2ab17366c696f0bac1d122115823a1736559 (patch)
tree75f188d6f59057625cea67652d9cfcb708635034 /server
parentSwitch back to SIGUSR1 for graceful restarts on all platforms that (diff)
downloadapache2-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.c20
-rw-r--r--server/mpm/worker/fdqueue.h1
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;