Mercurial > hg > nginx
diff src/core/ngx_thread_pool.c @ 6042:abde398f34a7
Thread pools: implemented graceful exiting of threads.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Mon, 23 Mar 2015 17:51:21 +0300 |
parents | 2097cd49a158 |
children | 657e029bac28 |
line wrap: on
line diff
--- a/src/core/ngx_thread_pool.c +++ b/src/core/ngx_thread_pool.c @@ -46,6 +46,7 @@ struct ngx_thread_pool_s { static ngx_int_t ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log, ngx_pool_t *pool); static void ngx_thread_pool_destroy(ngx_thread_pool_t *tp); +static void ngx_thread_pool_exit_handler(void *data, ngx_log_t *log); static void *ngx_thread_pool_cycle(void *data); static void ngx_thread_pool_handler(ngx_event_t *ev); @@ -163,13 +164,43 @@ ngx_thread_pool_init(ngx_thread_pool_t * static void ngx_thread_pool_destroy(ngx_thread_pool_t *tp) { - /* TODO: exit threads */ + ngx_uint_t n; + ngx_thread_task_t task; + volatile ngx_uint_t lock; + + ngx_memzero(&task, sizeof(ngx_thread_task_t)); + + task.handler = ngx_thread_pool_exit_handler; + task.ctx = (void *) &lock; + + for (n = 0; n < tp->threads; n++) { + lock = 1; -#if 0 + if (ngx_thread_task_post(tp, &task) != NGX_OK) { + return; + } + + while (lock) { + ngx_sched_yield(); + } + + task.event.active = 0; + } + (void) ngx_thread_cond_destroy(&tp->cond, tp->log); (void) ngx_thread_mutex_destroy(&tp->mtx, tp->log); - #endif +} + + +static void +ngx_thread_pool_exit_handler(void *data, ngx_log_t *log) +{ + ngx_uint_t *lock = data; + + *lock = 0; + + pthread_exit(0); }