diff src/event/modules/ngx_kqueue_module.c @ 332:3a91bfeffaba NGINX_0_6_10

nginx 0.6.10 *) Feature: the "open_file_cache", "open_file_cache_retest", and "open_file_cache_errors" directives. *) Bugfix: socket leak; bug appeared in 0.6.7. *) Bugfix: a charset set by the "charset" directive was not appended to the "Content-Type" header set by $r->send_http_header(). *) Bugfix: a segmentation fault might occur in worker process if /dev/poll method was used.
author Igor Sysoev <http://sysoev.ru>
date Mon, 03 Sep 2007 00:00:00 +0400
parents f7cd062ee035
children 820f6378fc00
line wrap: on
line diff
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -200,7 +200,9 @@ ngx_kqueue_init(ngx_cycle_t *cycle, ngx_
         }
     }
 
-    ngx_event_flags = 0;
+    ngx_event_flags = NGX_USE_ONESHOT_EVENT
+                      |NGX_USE_KQUEUE_EVENT
+                      |NGX_USE_VNODE_EVENT;
 
 #if (NGX_HAVE_TIMER_EVENT)
 
@@ -226,8 +228,6 @@ ngx_kqueue_init(ngx_cycle_t *cycle, ngx_
 
 #endif
 
-    ngx_event_flags |= NGX_USE_ONESHOT_EVENT|NGX_USE_KQUEUE_EVENT;
-
 #if (NGX_HAVE_CLEAR_EVENT)
     ngx_event_flags |= NGX_USE_CLEAR_EVENT;
 #else
@@ -389,10 +389,12 @@ ngx_kqueue_del_event(ngx_event_t *ev, ng
 
     if (flags & NGX_DISABLE_EVENT) {
         ev->disabled = 1;
+
+    } else {
+        flags |= EV_DELETE;
     }
 
-    rc = ngx_kqueue_set_event(ev, event,
-                           flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE);
+    rc = ngx_kqueue_set_event(ev, event, flags);
 
     ngx_mutex_unlock(list_mutex);
 
@@ -409,7 +411,7 @@ ngx_kqueue_set_event(ngx_event_t *ev, ng
 
     c = ev->data;
 
-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
+    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
                    "kevent set event: %d: ft:%i fl:%04Xi",
                    c->fd, filter, flags);
 
@@ -466,6 +468,22 @@ ngx_kqueue_set_event(ngx_event_t *ev, ng
     ev->index = nchanges;
     nchanges++;
 
+    if (flags & NGX_FLUSH_EVENT) {
+        ts.tv_sec = 0;
+        ts.tv_nsec = 0;
+
+        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "kevent flush");
+
+        if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts)
+            == -1)
+        {
+            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");
+            return NGX_ERROR;
+        }
+
+        nchanges = 0;
+    }
+
     return NGX_OK;
 }