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