Mercurial > hg > nginx
comparison src/core/ngx_thread_pool.c @ 6039:fc36690e7f44
Thread pools: replaced completed tasks queue mutex with spinlock.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Mon, 23 Mar 2015 17:51:21 +0300 |
parents | 67717d4e4f47 |
children | adaedab1e662 |
comparison
equal
deleted
inserted
replaced
6038:94ce52db3367 | 6039:fc36690e7f44 |
---|---|
97 | 97 |
98 | 98 |
99 static ngx_str_t ngx_thread_pool_default = ngx_string("default"); | 99 static ngx_str_t ngx_thread_pool_default = ngx_string("default"); |
100 | 100 |
101 static ngx_uint_t ngx_thread_pool_task_id; | 101 static ngx_uint_t ngx_thread_pool_task_id; |
102 static ngx_atomic_t ngx_thread_pool_done_lock; | |
102 static ngx_thread_pool_queue_t ngx_thread_pool_done; | 103 static ngx_thread_pool_queue_t ngx_thread_pool_done; |
103 | 104 |
104 | 105 |
105 static ngx_int_t | 106 static ngx_int_t |
106 ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log, ngx_pool_t *pool) | 107 ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log, ngx_pool_t *pool) |
327 "complete task #%ui in thread pool \"%V\"", | 328 "complete task #%ui in thread pool \"%V\"", |
328 task->id, &tp->name); | 329 task->id, &tp->name); |
329 | 330 |
330 task->next = NULL; | 331 task->next = NULL; |
331 | 332 |
332 if (ngx_thread_mutex_lock(&ngx_thread_pool_done.mtx, tp->log) | 333 ngx_spinlock(&ngx_thread_pool_done_lock, 1, 2048); |
333 != NGX_OK) | |
334 { | |
335 return NULL; | |
336 } | |
337 | 334 |
338 *ngx_thread_pool_done.last = task; | 335 *ngx_thread_pool_done.last = task; |
339 ngx_thread_pool_done.last = &task->next; | 336 ngx_thread_pool_done.last = &task->next; |
340 | 337 |
341 if (ngx_thread_mutex_unlock(&ngx_thread_pool_done.mtx, tp->log) | 338 ngx_unlock(&ngx_thread_pool_done_lock); |
342 != NGX_OK) | |
343 { | |
344 return NULL; | |
345 } | |
346 | 339 |
347 (void) ngx_notify(ngx_thread_pool_handler); | 340 (void) ngx_notify(ngx_thread_pool_handler); |
348 } | 341 } |
349 } | 342 } |
350 | 343 |
355 ngx_event_t *event; | 348 ngx_event_t *event; |
356 ngx_thread_task_t *task; | 349 ngx_thread_task_t *task; |
357 | 350 |
358 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "thread pool handler"); | 351 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "thread pool handler"); |
359 | 352 |
360 if (ngx_thread_mutex_lock(&ngx_thread_pool_done.mtx, ev->log) != NGX_OK) { | 353 ngx_spinlock(&ngx_thread_pool_done_lock, 1, 2048); |
361 return; | |
362 } | |
363 | 354 |
364 task = ngx_thread_pool_done.first; | 355 task = ngx_thread_pool_done.first; |
365 ngx_thread_pool_done.first = NULL; | 356 ngx_thread_pool_done.first = NULL; |
366 ngx_thread_pool_done.last = &ngx_thread_pool_done.first; | 357 ngx_thread_pool_done.last = &ngx_thread_pool_done.first; |
367 | 358 |
368 if (ngx_thread_mutex_unlock(&ngx_thread_pool_done.mtx, ev->log) != NGX_OK) { | 359 ngx_unlock(&ngx_thread_pool_done_lock); |
369 return; | |
370 } | |
371 | 360 |
372 while (task) { | 361 while (task) { |
373 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, | 362 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, |
374 "run completion handler for task #%ui", task->id); | 363 "run completion handler for task #%ui", task->id); |
375 | 364 |