diff src/event/modules/ngx_kqueue_module.c @ 195:8dee38ea9117

nginx-0.0.1-2003-11-25-23:44:56 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 25 Nov 2003 20:44:56 +0000
parents 2357fa41738a
children 11fbd0fc041d
line wrap: on
line diff
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -190,6 +190,7 @@ static void ngx_kqueue_done(ngx_cycle_t 
 
 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags)
 {
+    ngx_event_t       *e;
     ngx_connection_t  *c;
 
     ev->active = 1;
@@ -200,6 +201,28 @@ static int ngx_kqueue_add_event(ngx_even
         && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
                                                              == (uintptr_t) ev)
     {
+        if (change_list[ev->index].flags == EV_DISABLE) {
+
+#if (NGX_DEBUG_EVENT)
+            ngx_connection_t *c = (ngx_connection_t *) ev->data;
+            ngx_log_debug(ev->log, "kqueue event activated: %d: ft:%d" _
+                          c->fd _ event);
+#endif
+
+           /*
+            * if the EV_DISABLE is still not passed to a kernel
+            * we will not pass it
+            */
+
+            if (ev->index < (u_int) --nchanges) {
+                e = (ngx_event_t *) change_list[nchanges].udata;
+                change_list[ev->index] = change_list[nchanges];
+                e->index = ev->index;
+            }
+
+            return NGX_OK;
+        }
+
         c = ev->data;
         ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
                       "previous event on #%d were not passed in kernel", c->fd);
@@ -207,7 +230,7 @@ static int ngx_kqueue_add_event(ngx_even
         return NGX_ERROR;
     }
 
-    return ngx_kqueue_set_event(ev, event, EV_ADD|flags);
+    return ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags);
 }
 
 
@@ -286,24 +309,27 @@ static int ngx_kqueue_set_event(ngx_even
     change_list[nchanges].flags = flags;
     change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance);
 
-#if (HAVE_LOWAT_EVENT)
-
-    if (flags & NGX_LOWAT_EVENT) {
-        change_list[nchanges].fflags = NOTE_LOWAT;
-        change_list[nchanges].data = ev->available;
+    if (filter == EVFILT_VNODE) {
+        change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND
+                                       |NOTE_ATTRIB|NOTE_RENAME|NOTE_REVOKE;
+        change_list[nchanges].data = 0;
 
     } else {
+#if (HAVE_LOWAT_EVENT)
+        if (flags & NGX_LOWAT_EVENT) {
+            change_list[nchanges].fflags = NOTE_LOWAT;
+            change_list[nchanges].data = ev->available;
+
+        } else {
+            change_list[nchanges].fflags = 0;
+            change_list[nchanges].data = 0;
+        }
+#else
         change_list[nchanges].fflags = 0;
         change_list[nchanges].data = 0;
+#endif
     }
 
-#else
-
-    change_list[nchanges].fflags = 0;
-    change_list[nchanges].data = 0;
-
-#endif
-
     ev->index = nchanges;
 
     nchanges++;
@@ -365,12 +391,16 @@ static int ngx_kqueue_process_events(ngx
         ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta);
 #endif
 
+#if 0
         /*
          * The expired timers must be handled before a processing of the events
          * because the new timers can be added during a processing
          */
 
         ngx_event_expire_timers((ngx_msec_t) delta);
+#endif
+
+        ngx_event_set_timer_delta((ngx_msec_t) delta);
 
     } else {
         if (events == 0) {
@@ -452,6 +482,13 @@ static int ngx_kqueue_process_events(ngx
 
             break;
 
+        case EVFILT_VNODE:
+            ev->kq_vnode = 1;
+
+            ev->event_handler(ev);
+
+            break;
+
         case EVFILT_AIO:
             ev->complete = 1;
             ev->ready = 1;
@@ -463,10 +500,15 @@ static int ngx_kqueue_process_events(ngx
 
         default:
             ngx_log_error(NGX_LOG_ALERT, log, 0,
-                          "unexpected kevent filter %d" _ event_list[i].filter);
+                          "unexpected kevent() filter %d",
+                          event_list[i].filter);
         }
     }
 
+    if (timer) {
+        ngx_event_expire_timers((ngx_msec_t) delta);
+    }
+
     return NGX_OK;
 }