rbb 99/02/22 12:05:47
Modified: pthreads/src/include fdqueue.h
pthreads/src/main fdqueue.c http_main.c
Log:
Removing Manoj's last fix for the accept thread. It puts the check for queue-
fullness in the wrong spot, and removes necessary logic to keep us from
overflowing our file descriptor queue too much.
Revision Changes Path
1.5 +1 -1 apache-apr/pthreads/src/include/fdqueue.h
Index: fdqueue.h
===================================================================
RCS file: /home/cvs/apache-apr/pthreads/src/include/fdqueue.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- fdqueue.h 1999/02/22 07:49:32 1.4
+++ fdqueue.h 1999/02/22 20:05:45 1.5
@@ -25,7 +25,6 @@
int bounds;
int blanks;
pthread_mutex_t one_big_mutex;
- pthread_cond_t thread_is_idle;
pthread_cond_t not_empty;
pthread_cond_t not_full;
} FDQueue;
@@ -35,5 +34,6 @@
int queue_push(FDQueue *queue, int fd, struct sockaddr *addr);
int queue_pop(FDQueue *queue, struct sockaddr *addr);
int queue_size(FDQueue *queue);
+int increase_blanks(FDQueue *queue);
#endif /* FDQUEUE_H */
1.10 +19 -30 apache-apr/pthreads/src/main/fdqueue.c
Index: fdqueue.c
===================================================================
RCS file: /home/cvs/apache-apr/pthreads/src/main/fdqueue.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- fdqueue.c 1999/02/22 07:49:33 1.9
+++ fdqueue.c 1999/02/22 20:05:46 1.10
@@ -6,15 +6,12 @@
int queue_init(FDQueue *queue, size_t bounds, pool *a) {
int i;
pthread_mutex_init(&queue->one_big_mutex, NULL);
- pthread_cond_init(&queue->thread_is_idle, NULL);
pthread_cond_init(&queue->not_empty, NULL);
pthread_cond_init(&queue->not_full, NULL);
queue->head = queue->tail = 0;
- /* Note, bounds is being increased to account for the bookkeeping slot */
queue->data = ap_palloc(a, (++bounds) * sizeof(FDQueueElement));
queue->bounds = bounds;
- /* A thread isn't idle until it has asked for a connection */
- queue->blanks = 0;
+ queue->blanks = bounds - 1;
ap_register_cleanup(a, queue, (void (*)(void *))queue_destroy,
ap_null_cleanup);
for (i=0; i < bounds; ++i)
queue->data[i].fd = -1;
@@ -23,7 +20,6 @@
void *queue_destroy(FDQueue *queue) {
/* Ignore errors here, we can't do anything about them anyway */
- pthread_cond_destroy(&queue->thread_is_idle);
pthread_cond_destroy(&queue->not_empty);
pthread_cond_destroy(&queue->not_full);
pthread_mutex_destroy(&queue->one_big_mutex);
@@ -33,29 +29,17 @@
if (pthread_mutex_lock(&queue->one_big_mutex) != 0) {
return FD_QUEUE_FAILURE;
}
- while (queue->head == ((queue->tail + 1) % queue->bounds)) {
- pthread_cond_wait(&queue->not_full, &queue->one_big_mutex);
- }
queue->data[queue->tail].fd = fd;
queue->data[queue->tail].addr = *addr;
- /* If the queue was empty, signal that it no longer is */
- /* if (queue->head == queue->tail) { */
- pthread_cond_signal(&queue->not_empty);
- /* } */
queue->tail = (queue->tail + 1) % queue->bounds;
queue->blanks--;
-
- /* If the content in the queue is enough to satisfy all of our threads,
- * then wait until this is no longer the case so that we don't accept
- * connections we can't handle */
- while (queue->blanks <= 0) {
- pthread_cond_wait(&queue->thread_is_idle, &queue->one_big_mutex);
+ pthread_cond_signal(&queue->not_empty);
+ if (queue->blanks == 0) {
+ pthread_cond_wait(&queue->not_full, &queue->one_big_mutex);
}
-
if (pthread_mutex_unlock(&queue->one_big_mutex) != 0) {
return FD_QUEUE_FAILURE;
}
- return FD_QUEUE_SUCCESS;
}
int queue_pop(FDQueue *queue, struct sockaddr *addr) {
@@ -63,13 +47,7 @@
if (pthread_mutex_lock(&queue->one_big_mutex) != 0) {
return FD_QUEUE_FAILURE;
}
-
- if (queue->blanks <= 0) {
- pthread_cond_signal(&queue->thread_is_idle);
- }
- queue->blanks++;
-
- if (queue->head == queue->tail) {
+ if (queue->blanks >= queue->bounds - 1) {
pthread_cond_wait(&queue->not_empty, &queue->one_big_mutex);
}
@@ -77,14 +55,25 @@
*addr = queue->data[queue->head].addr;
queue->data[queue->head].fd = -1;
/* If the queue was full, signal that it no longer is */
- if (queue->head == ((queue->tail + 1) % queue->bounds)) {
- pthread_cond_signal(&queue->not_full);
- }
queue->head = (queue->head + 1) % queue->bounds;
if (pthread_mutex_unlock(&queue->one_big_mutex) != 0) {
return FD_QUEUE_FAILURE;
}
return fd;
+}
+
+int increase_blanks(FDQueue *queue) {
+ if (pthread_mutex_lock(&queue->one_big_mutex) != 0) {
+ return FD_QUEUE_FAILURE;
+ }
+ if (queue->blanks == 0) {
+ pthread_cond_signal(&queue->not_full);
+ }
+ queue->blanks++;
+ if (pthread_mutex_unlock(&queue->one_big_mutex) != 0) {
+ return FD_QUEUE_FAILURE;
+ }
+ return FD_QUEUE_SUCCESS;
}
int queue_size(FDQueue *queue) {
1.52 +1 -0 apache-apr/pthreads/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- http_main.c 1999/02/22 07:49:33 1.51
+++ http_main.c 1999/02/22 20:05:46 1.52
@@ -2379,6 +2379,7 @@
csd = queue_pop(&csd_queue, &sa_client);
if (csd >= 0) {
process_socket(ptrans, &sa_client, csd, my_pid, my_tid);
+ increase_blanks(&csd_queue);
}
ap_clear_pool(ptrans);
}