aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2014-09-01 18:20:18 +0400
committerValentin Bartenev <vbart@nginx.com>2014-09-01 18:20:18 +0400
commit37d24e7e3be648a6f73bad18dcf53798a7a1aeb0 (patch)
treeeaf9902b1117ec4a3cd905855c3e26c5825f3282 /src
parent2a81e0556611188a1b9b3e1240a06928dcebc1a2 (diff)
downloadnginx-37d24e7e3be648a6f73bad18dcf53798a7a1aeb0.tar.gz
nginx-37d24e7e3be648a6f73bad18dcf53798a7a1aeb0.zip
Events: processing of posted events changed from LIFO to FIFO.
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.
Diffstat (limited to 'src')
-rw-r--r--src/core/ngx_connection.c4
-rw-r--r--src/event/modules/ngx_devpoll_module.c3
-rw-r--r--src/event/modules/ngx_epoll_module.c3
-rw-r--r--src/event/modules/ngx_eventport_module.c3
-rw-r--r--src/event/modules/ngx_kqueue_module.c3
-rw-r--r--src/event/modules/ngx_poll_module.c3
-rw-r--r--src/event/modules/ngx_rtsig_module.c6
-rw-r--r--src/event/modules/ngx_select_module.c3
-rw-r--r--src/event/modules/ngx_win32_select_module.c3
-rw-r--r--src/event/ngx_event.c14
-rw-r--r--src/event/ngx_event.h9
-rw-r--r--src/event/ngx_event_posted.c16
-rw-r--r--src/event/ngx_event_posted.h27
-rw-r--r--src/http/ngx_http_spdy.c4
14 files changed, 48 insertions, 53 deletions
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c
index 7b3daf20a..b687d76b2 100644
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -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);
}
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c
index 8f302255d..5658e8620 100644
--- a/src/event/modules/ngx_devpoll_module.c
+++ b/src/event/modules/ngx_devpoll_module.c
@@ -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;
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
index 309e91855..2674d382b 100644
--- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c
@@ -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 */
diff --git a/src/event/modules/ngx_eventport_module.c b/src/event/modules/ngx_eventport_module.c
index bba87ed81..a9d8a6246 100644
--- a/src/event/modules/ngx_eventport_module.c
+++ b/src/event/modules/ngx_eventport_module.c
@@ -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;
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 9e41d3e90..9e7a1bdb6 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -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) {
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index f2fc749f7..bad1a7d2a 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -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 */
diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c
index 66b2454c4..9e31afa1c 100644
--- a/src/event/modules/ngx_rtsig_module.c
+++ b/src/event/modules/ngx_rtsig_module.c
@@ -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;
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 7a554fedd..fa2d55ae2 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -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;
diff --git a/src/event/modules/ngx_win32_select_module.c b/src/event/modules/ngx_win32_select_module.c
index 32ee78db1..be87ded24 100644
--- a/src/event/modules/ngx_win32_select_module.c
+++ b/src/event/modules/ngx_win32_select_module.c
@@ -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;
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index 8531ed7d5..26c3b9716 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -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;
}
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index e9520b667..6531ec7ad 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -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
diff --git a/src/event/ngx_event_posted.c b/src/event/ngx_event_posted.c
index 87e506d71..d851f3d14 100644
--- a/src/event/ngx_event_posted.c
+++ b/src/event/ngx_event_posted.c
@@ -10,26 +10,24 @@
#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);
diff --git a/src/event/ngx_event_posted.h b/src/event/ngx_event_posted.h
index c24fd4e9b..40ba1c1e0 100644
--- a/src/event/ngx_event_posted.h
+++ b/src/event/ngx_event_posted.h
@@ -14,16 +14,11 @@
#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); \
\
@@ -35,23 +30,19 @@
#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_ */
diff --git a/src/http/ngx_http_spdy.c b/src/http/ngx_http_spdy.c
index 478036979..3c57882a6 100644
--- a/src/http/ngx_http_spdy.c
+++ b/src/http/ngx_http_spdy.c
@@ -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);
}