You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Aaron Bannert <aa...@clove.org> on 2001/09/18 23:49:58 UTC
[PATCH] change worker's fdqueue from FIFO to LIFO
This is a rather simple patch that may improve cache-hit performance
under some conditions by changing the queue of available worker threads
from FIFO to LIFO. It also adds a tiny reduction in the arithmetic that
happens in the critical section, which will definately help if you have
a lame compiler.
-aaron
Index: server/mpm/worker/fdqueue.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/worker/fdqueue.c,v
retrieving revision 1.6
diff -u -r1.6 fdqueue.c
--- server/mpm/worker/fdqueue.c 2001/09/18 21:14:18 1.6
+++ server/mpm/worker/fdqueue.c 2001/09/18 21:35:23
@@ -73,7 +73,6 @@
*/
static int ap_queue_empty(fd_queue_t *queue)
{
- /*return (queue->head == queue->tail);*/
return (queue->blanks >= queue->bounds - 1);
}
@@ -108,7 +107,7 @@
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 @@
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 @@
*/
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 @@
}
}
- *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) {
Index: server/mpm/worker/fdqueue.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/worker/fdqueue.h,v
retrieving revision 1.6
diff -u -r1.6 fdqueue.h
--- server/mpm/worker/fdqueue.h 2001/09/18 21:14:18 1.6
+++ server/mpm/worker/fdqueue.h 2001/09/18 21:35:23
@@ -81,7 +81,6 @@
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;