diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 26 | ||||
| -rw-r--r-- | src/event/ngx_event.c | 8 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 16 | ||||
| -rw-r--r-- | src/event/ngx_event_mutex.c | 67 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.c | 13 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.h | 10 |
6 files changed, 111 insertions, 29 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index bfdd98bb2..c49e198ae 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -22,6 +22,9 @@ static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags); static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags); static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags); static int ngx_kqueue_process_events(ngx_log_t *log); +#if (NGX_THREADS) +static void ngx_kqueue_thread_handler(ngx_event_t *ev); +#endif static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle); static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf); @@ -68,6 +71,9 @@ ngx_event_module_t ngx_kqueue_module_ctx = { NULL, /* add an connection */ NULL, /* delete an connection */ ngx_kqueue_process_events, /* process the events */ +#if (NGX_THREADS0) + ngx_kqueue_thread_handler, /* process an event by thread */ +#endif ngx_kqueue_init, /* init the events */ ngx_kqueue_done /* done the events */ } @@ -500,7 +506,12 @@ static ngx_int_t ngx_kqueue_process_events(ngx_log_t *log) if (ev->light) { - /* the accept event */ + /* + * The light events are the accept event, + * or the event that waits in the mutex queue - we need to + * remove it from the mutex queue before the inserting into + * the posted events queue. + */ ngx_mutex_unlock(ngx_posted_events_mutex); @@ -538,12 +549,17 @@ static ngx_int_t ngx_kqueue_process_events(ngx_log_t *log) /* TODO: non-thread mode only */ - ev = ngx_posted_events; - ngx_posted_events = NULL; + for ( ;; ) { + + ev = (ngx_event_t *) ngx_posted_events; + + if (ev == NULL) { + break; + } + + ngx_posted_events = ev->next; - while (ev) { ev->event_handler(ev); - ev = ev->next; } return NGX_OK; diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 820a5f51b..cfd40d703 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -39,13 +39,13 @@ static void *ngx_event_create_conf(ngx_cycle_t *cycle); static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf); -int ngx_event_flags; -ngx_event_actions_t ngx_event_actions; +int ngx_event_flags; +ngx_event_actions_t ngx_event_actions; -static int ngx_event_max_module; +static int ngx_event_max_module; -ngx_event_t *ngx_posted_events; +volatile ngx_event_t *ngx_posted_events; static ngx_str_t events_name = ngx_string("events"); diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 899db18aa..17462dff9 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -20,6 +20,14 @@ typedef struct { #endif +typedef struct { + ngx_uint_t lock; + + ngx_event_t *events; + ngx_event_t *last; +} ngx_event_mutex_t; + + struct ngx_event_s { void *data; /* TODO rename to handler */ @@ -373,11 +381,11 @@ typedef struct { -extern ngx_event_t *ngx_posted_events; +extern volatile ngx_event_t *ngx_posted_events; -extern int ngx_event_flags; -extern ngx_module_t ngx_events_module; -extern ngx_module_t ngx_event_core_module; +extern int ngx_event_flags; +extern ngx_module_t ngx_events_module; +extern ngx_module_t ngx_event_core_module; #define ngx_event_get_conf(conf_ctx, module) \ diff --git a/src/event/ngx_event_mutex.c b/src/event/ngx_event_mutex.c index 5a9542b06..9f1868f78 100644 --- a/src/event/ngx_event_mutex.c +++ b/src/event/ngx_event_mutex.c @@ -1,14 +1,65 @@ -spinlock_max depend on CPU number and mutex type. - 1 CPU 1 - ngx_malloc_mutex 1000 ? +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_event.h> -int ngx_event_mutex_trylock(ngx_mutex_t *mtx) +ngx_int_t ngx_event_mutex_timedlock(ngx_event_mutex_t *m, ngx_msec_t timer, + ngx_event_t *ev) { - for(i = mtx->spinlock_max; i; i--) - if (trylock(mtx->lock)) - return 1; + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, + "lock event mutex " PTR_FMT " lock:%X", m, m->lock); - return 0; + if (m->lock) { + + if (m->events == NULL) { + m->events = ev; + + } else { + m->last->next = ev; + } + + m->last = ev; + ev->next = NULL; + +#if (NGX_THREADS) + ev->light = 1; +#endif + + ngx_add_timer(ev, timer); + + return NGX_AGAIN; + } + + m->lock = 1; + + return NGX_OK; +} + + +ngx_int_t ngx_event_mutex_unlock(ngx_event_mutex_t *m, ngx_log_t *log) +{ + ngx_event_t *ev; + + if (m->lock == 0) { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "tring to unlock the free event mutex " PTR_FMT, m); + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, + "unlock event mutex " PTR_FMT ", next event: " PTR_FMT, + m, m->events); + + m->lock = 0; + + if (m->events) { + ev = m->events; + m->events = ev->next; + + ev->next = (ngx_event_t *) ngx_posted_events; + ngx_posted_events = ev; + } + + return NGX_OK; } diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index 498fd9fa0..8983d997b 100644 --- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -9,22 +9,26 @@ ngx_mutex_t *ngx_event_timer_mutex; #endif -ngx_rbtree_t *ngx_event_timer_rbtree; -ngx_rbtree_t ngx_event_timer_sentinel; +volatile ngx_rbtree_t *ngx_event_timer_rbtree; +ngx_rbtree_t ngx_event_timer_sentinel; ngx_int_t ngx_event_timer_init(ngx_log_t *log) { if (ngx_event_timer_rbtree) { +#if (NGX_THREADS) ngx_event_timer_mutex->log = log; +#endif return NGX_OK; } ngx_event_timer_rbtree = &ngx_event_timer_sentinel; +#if (NGX_THREADS) if (!(ngx_event_timer_mutex = ngx_mutex_init(log, 0))) { return NGX_ERROR; } +#endif return NGX_OK; } @@ -44,7 +48,8 @@ ngx_msec_t ngx_event_find_timer(void) } #endif - node = ngx_rbtree_min(ngx_event_timer_rbtree, &ngx_event_timer_sentinel); + node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree, + &ngx_event_timer_sentinel); #if (NGX_THREADS) ngx_mutex_unlock(ngx_event_timer_mutex); @@ -76,7 +81,7 @@ void ngx_event_expire_timers(ngx_msec_t timer) } #endif - node = ngx_rbtree_min(ngx_event_timer_rbtree, + node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree, &ngx_event_timer_sentinel); #if (NGX_THREADS) diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h index 300d79cb7..568a97c0a 100644 --- a/src/event/ngx_event_timer.h +++ b/src/event/ngx_event_timer.h @@ -31,8 +31,8 @@ extern ngx_mutex_t *ngx_event_timer_mutex; #endif -extern ngx_rbtree_t *ngx_event_timer_rbtree; -extern ngx_rbtree_t ngx_event_timer_sentinel; +extern volatile ngx_rbtree_t *ngx_event_timer_rbtree; +extern ngx_rbtree_t ngx_event_timer_sentinel; ngx_inline static void ngx_event_del_timer(ngx_event_t *ev) @@ -47,7 +47,8 @@ ngx_inline static void ngx_event_del_timer(ngx_event_t *ev) } #endif - ngx_rbtree_delete(&ngx_event_timer_rbtree, &ngx_event_timer_sentinel, + ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree, + &ngx_event_timer_sentinel, (ngx_rbtree_t *) &ev->rbtree_key); #if (NGX_THREADS) @@ -87,7 +88,8 @@ ngx_inline static void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) } #endif - ngx_rbtree_insert(&ngx_event_timer_rbtree, &ngx_event_timer_sentinel, + ngx_rbtree_insert((ngx_rbtree_t **) &ngx_event_timer_rbtree, + &ngx_event_timer_sentinel, (ngx_rbtree_t *) &ev->rbtree_key); #if (NGX_THREADS) |
