]> git.kaiwu.me - nginx.git/commitdiff
Events: processing of posted events changed from LIFO to FIFO.
authorValentin Bartenev <vbart@nginx.com>
Mon, 1 Sep 2014 14:20:18 +0000 (18:20 +0400)
committerValentin Bartenev <vbart@nginx.com>
Mon, 1 Sep 2014 14:20:18 +0000 (18:20 +0400)
In theory, this can provide a bit better distribution of latencies.

Also it simplifies the code, since ngx_queue_t is now used instead
of custom implementation.

14 files changed:
src/core/ngx_connection.c
src/event/modules/ngx_devpoll_module.c
src/event/modules/ngx_epoll_module.c
src/event/modules/ngx_eventport_module.c
src/event/modules/ngx_kqueue_module.c
src/event/modules/ngx_poll_module.c
src/event/modules/ngx_rtsig_module.c
src/event/modules/ngx_select_module.c
src/event/modules/ngx_win32_select_module.c
src/event/ngx_event.c
src/event/ngx_event.h
src/event/ngx_event_posted.c
src/event/ngx_event_posted.h
src/http/ngx_http_spdy.c

index 7b3daf20a6ad4ca5a74f2ecc0d5c708f54c2dbb0..b687d76b23be1f8cae015db7cadc73f68ee94f7f 100644 (file)
@@ -955,11 +955,11 @@ ngx_close_connection(ngx_connection_t *c)
 
 #endif
 
-    if (c->read->prev) {
+    if (c->read->posted) {
         ngx_delete_posted_event(c->read);
     }
 
-    if (c->write->prev) {
+    if (c->write->posted) {
         ngx_delete_posted_event(c->write);
     }
 
index 8f302255d650112005dbe49194ecdbdc7e2ced80..5658e8620b23220ff29c9b0735ce404cfe430cbd 100644 (file)
@@ -344,7 +344,8 @@ ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     ngx_err_t           err;
     ngx_int_t           i;
     ngx_uint_t          level, instance;
-    ngx_event_t        *rev, *wev, **queue;
+    ngx_event_t        *rev, *wev;
+    ngx_queue_t        *queue;
     ngx_connection_t   *c;
     struct pollfd       pfd;
     struct dvpoll       dvp;
index 309e91855b1095301a87b20bdf2adf9ab183b3af..2674d382b69e1f3195ddb320b2df57b7c538a702 100644 (file)
@@ -568,7 +568,8 @@ ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
     ngx_int_t          instance, i;
     ngx_uint_t         level;
     ngx_err_t          err;
-    ngx_event_t       *rev, *wev, **queue;
+    ngx_event_t       *rev, *wev;
+    ngx_queue_t       *queue;
     ngx_connection_t  *c;
 
     /* NGX_TIMER_INFINITE == INFTIM */
index bba87ed814acf62ec557a3a53d0038a0378af338..a9d8a6246f1d71f0bee22429bd16556bde8e9437 100644 (file)
@@ -414,7 +414,8 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     ngx_err_t           err;
     ngx_int_t           instance;
     ngx_uint_t          i, level;
-    ngx_event_t        *ev, *rev, *wev, **queue;
+    ngx_event_t        *ev, *rev, *wev;
+    ngx_queue_t        *queue;
     ngx_connection_t   *c;
     struct timespec     ts, *tp;
 
index 9e41d3e90aa389d6b79776b7da19af5cb6b49cc8..9e7a1bdb69293811c214e6b9d40b36b9a74eb9e6 100644 (file)
@@ -495,7 +495,8 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     ngx_int_t         i, instance;
     ngx_uint_t        level;
     ngx_err_t         err;
-    ngx_event_t      *ev, **queue;
+    ngx_event_t      *ev;
+    ngx_queue_t      *queue;
     struct timespec   ts, *tp;
 
     if (ngx_threaded) {
index f2fc749f7b994f0dc6f811fc6031b6156dd6e973..bad1a7d2a2d87e2a84022b76dbe83544ef33a3de 100644 (file)
@@ -241,7 +241,8 @@ ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
     int                 ready, revents;
     ngx_err_t           err;
     ngx_uint_t          i, found, level;
-    ngx_event_t        *ev, **queue;
+    ngx_event_t        *ev;
+    ngx_queue_t        *queue;
     ngx_connection_t   *c;
 
     /* NGX_TIMER_INFINITE == INFTIM */
index 66b2454c4aeaaeff00594551374e9d1f1c37d5dc..9e31afa1cef2dc2e84747cfacb4420ba5412d3c3 100644 (file)
@@ -307,7 +307,8 @@ ngx_rtsig_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
     ngx_int_t           instance;
     ngx_err_t           err;
     siginfo_t           si;
-    ngx_event_t        *rev, *wev, **queue;
+    ngx_event_t        *rev, *wev;
+    ngx_queue_t        *queue;
     struct timespec     ts, *tp;
     struct sigaction    sa;
     ngx_connection_t   *c;
@@ -480,7 +481,8 @@ ngx_rtsig_process_overflow(ngx_cycle_t *cycle, ngx_msec_t timer,
     size_t             len;
     ngx_err_t          err;
     ngx_uint_t         tested, n, i;
-    ngx_event_t       *rev, *wev, **queue;
+    ngx_event_t       *rev, *wev;
+    ngx_queue_t       *queue;
     ngx_connection_t  *c;
     ngx_rtsig_conf_t  *rtscf;
 
index 7a554fedd8da0187b2c7aa787624584841c406cc..fa2d55ae2ac88a573f3707b9f7422bb0f4c5ccd3 100644 (file)
@@ -214,7 +214,8 @@ ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     int                ready, nready;
     ngx_err_t          err;
     ngx_uint_t         i, found;
-    ngx_event_t       *ev, **queue;
+    ngx_event_t       *ev;
+    ngx_queue_t       *queue;
     struct timeval     tv, *tp;
     ngx_connection_t  *c;
 
index 32ee78db1625fd17de8db68354e93730adfe2c43..be87ded247f85b7e26828a2c619bcca35fca7f92 100644 (file)
@@ -221,7 +221,8 @@ ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     int                ready, nready;
     ngx_err_t          err;
     ngx_uint_t         i, found;
-    ngx_event_t       *ev, **queue;
+    ngx_event_t       *ev;
+    ngx_queue_t       *queue;
     struct timeval     tv, *tp;
     ngx_connection_t  *c;
 
index 8531ed7d510c8bc123d6b0cd4be97b11d38841c4..26c3b97166961468b5197432fcae36882f7eea30 100644 (file)
@@ -252,9 +252,7 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                    "timer delta: %M", delta);
 
-    if (ngx_posted_accept_events) {
-        ngx_event_process_posted(cycle, &ngx_posted_accept_events);
-    }
+    ngx_event_process_posted(cycle, &ngx_posted_accept_events);
 
     if (ngx_accept_mutex_held) {
         ngx_shmtx_unlock(&ngx_accept_mutex);
@@ -264,12 +262,7 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
         ngx_event_expire_timers();
     }
 
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                   "posted events %p", ngx_posted_events);
-
-    if (ngx_posted_events) {
-        ngx_event_process_posted(cycle, &ngx_posted_events);
-    }
+    ngx_event_process_posted(cycle, &ngx_posted_events);
 }
 
 
@@ -612,6 +605,9 @@ ngx_event_process_init(ngx_cycle_t *cycle)
 
 #endif
 
+    ngx_queue_init(&ngx_posted_accept_events);
+    ngx_queue_init(&ngx_posted_events);
+
     if (ngx_event_timer_init(cycle->log) == NGX_ERROR) {
         return NGX_ERROR;
     }
index e9520b66794f1c43d02378ca45c2ad04e4181ac1..6531ec7add34b110fea2ddba9396d48c2bcc5d24 100644 (file)
@@ -74,6 +74,8 @@ struct ngx_event_s {
     /* the pending eof reported by kqueue, epoll or in aio chain operation */
     unsigned         pending_eof:1;
 
+    unsigned         posted:1;
+
 #if (NGX_WIN32)
     /* setsockopt(SO_UPDATE_ACCEPT_CONTEXT) was successful */
     unsigned         accept_context_updated:1;
@@ -125,16 +127,15 @@ struct ngx_event_s {
 
     ngx_rbtree_node_t   timer;
 
+    /* the posted queue */
+    ngx_queue_t      queue;
+
     unsigned         closed:1;
 
     /* to test on worker exit */
     unsigned         channel:1;
     unsigned         resolver:1;
 
-    /* the links of the posted queue */
-    ngx_event_t     *next;
-    ngx_event_t    **prev;
-
 
 #if 0
 
index 87e506d7198796161b0fb7e5e2f9e9b3bcab49b1..d851f3d14fc3c5b95720592a3efcf549f1081b1b 100644 (file)
 #include <ngx_event.h>
 
 
-ngx_event_t  *ngx_posted_accept_events;
-ngx_event_t  *ngx_posted_events;
+ngx_queue_t  ngx_posted_accept_events;
+ngx_queue_t  ngx_posted_events;
 
 
 void
-ngx_event_process_posted(ngx_cycle_t *cycle, ngx_event_t **posted)
+ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted)
 {
+    ngx_queue_t  *q;
     ngx_event_t  *ev;
 
-    for ( ;; ) {
+    while (!ngx_queue_empty(posted)) {
 
-        ev = *posted;
+        q = ngx_queue_head(posted);
+        ev = ngx_queue_data(q, ngx_event_t, queue);
 
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                       "posted event %p", ev);
 
-        if (ev == NULL) {
-            return;
-        }
-
         ngx_delete_posted_event(ev);
 
         ev->handler(ev);
index c24fd4e9b16946f15d517416bb547625ee7a31d8..40ba1c1e02b16f10471e16c73f704fc6e7aea6eb 100644 (file)
 #include <ngx_event.h>
 
 
-#define ngx_post_event(ev, queue)                                             \
+#define ngx_post_event(ev, q)                                                 \
                                                                               \
-    if (ev->prev == NULL) {                                                   \
-        ev->next = *queue;                                                    \
-        ev->prev = queue;                                                     \
-        *queue = ev;                                                          \
-                                                                              \
-        if (ev->next) {                                                       \
-            ev->next->prev = &ev->next;                                       \
-        }                                                                     \
+    if (!ev->posted) {                                                        \
+        ev->posted = 1;                                                       \
+        ngx_queue_insert_tail(q, &ev->queue);                                 \
                                                                               \
         ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "post event %p", ev);  \
                                                                               \
 
 #define ngx_delete_posted_event(ev)                                           \
                                                                               \
-    *(ev->prev) = ev->next;                                                   \
-                                                                              \
-    if (ev->next) {                                                           \
-        ev->next->prev = ev->prev;                                            \
-    }                                                                         \
+    ev->posted = 0;                                                           \
+    ngx_queue_remove(&ev->queue);                                             \
                                                                               \
-    ev->prev = NULL;                                                          \
     ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,                            \
                    "delete posted event %p", ev);
 
 
 
-void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_event_t **posted);
+void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted);
 
 
-extern ngx_event_t  *ngx_posted_accept_events;
-extern ngx_event_t  *ngx_posted_events;
+extern ngx_queue_t  ngx_posted_accept_events;
+extern ngx_queue_t  ngx_posted_events;
 
 
 #endif /* _NGX_EVENT_POSTED_H_INCLUDED_ */
index 478036979f34df213a301715f8948cb7b0098f82..3c57882a6ad84bd2df1ae6155c1eb3cd943d20fd 100644 (file)
@@ -3372,7 +3372,7 @@ ngx_http_spdy_close_stream(ngx_http_spdy_stream_t *stream, ngx_int_t rc)
         ngx_del_timer(ev);
     }
 
-    if (ev->prev) {
+    if (ev->posted) {
         ngx_delete_posted_event(ev);
     }
 
@@ -3387,7 +3387,7 @@ ngx_http_spdy_close_stream(ngx_http_spdy_stream_t *stream, ngx_int_t rc)
         ngx_del_timer(ev);
     }
 
-    if (ev->prev) {
+    if (ev->posted) {
         ngx_delete_posted_event(ev);
     }