diff src/event/modules/ngx_select_module.c @ 26:53cb81681040

nginx-0.0.1-2002-12-15-09:25:09 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 15 Dec 2002 06:25:09 +0000
parents f540a63026c9
children c14d7232b11f
line wrap: on
line diff
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -8,24 +8,26 @@
 #include <ngx_event.h>
 #include <ngx_select_module.h>
 
-static fd_set       master_read_fd_set;
-static fd_set       master_write_fd_set;
-static fd_set       work_read_fd_set;
-static fd_set       work_write_fd_set;
+
+/* should be per-thread */
+static fd_set         master_read_fd_set;
+static fd_set         master_write_fd_set;
+static fd_set         work_read_fd_set;
+static fd_set         work_write_fd_set;
 
 #if (WIN32)
-static int          max_read;
-static int          max_write;
+static int            max_read;
+static int            max_write;
 #else
-static int          max_fd;
+static int            max_fd;
 #endif
 
-static int          nevents;
+static int            nevents;
 
 static ngx_event_t  **event_index;
 static ngx_event_t  **ready_index;
 static ngx_event_t    timer_queue;
-
+/* */
 
 static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event,
                                      ngx_log_t *log);
@@ -121,12 +123,15 @@ int ngx_select_add_event(ngx_event_t *ev
     return NGX_OK;
 }
 
-int ngx_select_del_event(ngx_event_t *ev, int event)
+int ngx_select_del_event(ngx_event_t *ev, int event, u_int flags)
 {
     ngx_connection_t *c;
     c = (ngx_connection_t *) ev->data;
 
-    ngx_log_debug(c->log, "del event: %d" _ c->fd);
+    if (ev->index == NGX_INVALID_INDEX)
+        return NGX_OK;
+
+    ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event);
 
 #if (WIN32)
     if (event == NGX_READ_EVENT) {
@@ -148,13 +153,13 @@ int ngx_select_del_event(ngx_event_t *ev
         max_fd = -1;
 #endif
 
-    nevents--;
-
-    if (ev->index < nevents) {
+    if (ev->index < --nevents) {
         event_index[ev->index] = event_index[nevents];
         event_index[ev->index]->index = ev->index;
     }
 
+    ev->index = NGX_INVALID_INDEX;
+
     return NGX_OK;
 }
 
@@ -162,7 +167,7 @@ int ngx_select_process_events(ngx_log_t 
 {
     int                i, ready, found, nready;
     u_int              timer, delta;
-    ngx_event_t       *ev, *nx;
+    ngx_event_t       *ev;
     ngx_connection_t  *c;
     struct timeval     tv, *tp;
 
@@ -195,6 +200,15 @@ int ngx_select_process_events(ngx_log_t 
     }
 #endif
 
+#if 1
+    /* DEBUG */
+    for (i = 0; i < nevents; i++) {
+        ev = event_index[i];
+        c = (ngx_connection_t *) ev->data;
+        ngx_log_debug(log, "select: %d" _ c->fd);
+    }
+#endif
+
     ngx_log_debug(log, "select timer: %d" _ timer);
 
 #if (WIN32)
@@ -222,17 +236,17 @@ int ngx_select_process_events(ngx_log_t 
 
     if (timer) {
         if (delta >= timer) {
-            for (ev = timer_queue.timer_next;
-                 ev != &timer_queue && delta >= ev->timer_delta;
-                 /* void */)
-            {
+            for ( ;; ) {
+                ev = timer_queue.timer_next;
+
+                if (ev == &timer_queue || delta < ev->timer_delta)
+                    break;
+
                 delta -= ev->timer_delta;
-                nx = ev->timer_next;
                 ngx_del_timer(ev);
                 ev->timedout = 1;
-                if (ev->event_handler(ev) == -1)
+                if (ev->event_handler(ev) == NGX_ERROR)
                     ev->close_handler(ev);
-                ev = nx;
             }
 
         } else {
@@ -249,15 +263,13 @@ int ngx_select_process_events(ngx_log_t 
 
         if (ev->write) {
             if (FD_ISSET(c->fd, &work_write_fd_set)) {
-                ngx_log_debug(log, "select write %d" _
-                              c->fd);
+                ngx_log_debug(log, "select write %d" _ c->fd);
                 found = 1;
             }
 
         } else {
             if (FD_ISSET(c->fd, &work_read_fd_set)) {
-                ngx_log_debug(log, "select read %d" _
-                              c->fd);
+                ngx_log_debug(log, "select read %d" _ c->fd);
                 found = 1;
             }
         }
@@ -274,13 +286,14 @@ int ngx_select_process_events(ngx_log_t 
 
         if (ev->oneshot) {
             ngx_del_timer(ev);
+
             if (ev->write)
-                ngx_select_del_event(ev, NGX_WRITE_EVENT);
+                ngx_select_del_event(ev, NGX_WRITE_EVENT, 0);
             else
-                ngx_select_del_event(ev, NGX_READ_EVENT);
+                ngx_select_del_event(ev, NGX_READ_EVENT, 0);
         }
 
-        if (ev->event_handler(ev) == -1)
+        if (ev->event_handler(ev) == NGX_ERROR)
             ev->close_handler(ev);
 
         ready--;