From 1ade87d064ff682e0d836558e73ad7ca3e7148ec Mon Sep 17 00:00:00 2001 From: Kozlov Dmitry Date: Tue, 27 Dec 2011 16:06:10 +0400 Subject: core: queue zero-priority context if number of threads is reached maximum --- accel-pppd/radius/req.c | 1 + accel-pppd/triton/triton.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/accel-pppd/radius/req.c b/accel-pppd/radius/req.c index ed69846..4a9d42a 100644 --- a/accel-pppd/radius/req.c +++ b/accel-pppd/radius/req.c @@ -278,6 +278,7 @@ int rad_req_wait(struct rad_req_t *req, int timeout) req->timeout.expire = rad_req_timeout; triton_context_register(&req->ctx, req->rpd->ppp); + triton_context_set_priority(&req->ctx, 1); triton_md_register_handler(&req->ctx, &req->hnd); triton_md_enable_handler(&req->hnd, MD_MODE_READ); diff --git a/accel-pppd/triton/triton.c b/accel-pppd/triton/triton.c index 4e3e75a..66c6cef 100644 --- a/accel-pppd/triton/triton.c +++ b/accel-pppd/triton/triton.c @@ -17,6 +17,7 @@ #endif int thread_count = 2; +int thread_count_max = 200; int max_events = 64; static spinlock_t threads_lock = SPINLOCK_INITIALIZER; @@ -255,10 +256,8 @@ struct _triton_thread_t *create_thread() pthread_mutex_init(&thread->sleep_lock, NULL); pthread_cond_init(&thread->sleep_cond, NULL); pthread_mutex_lock(&thread->sleep_lock); - if (pthread_create(&thread->thread, &attr, (void*(*)(void*))triton_thread, thread)) { - triton_log_error("pthread_create: %s", strerror(errno)); - return NULL; - } + while (pthread_create(&thread->thread, &attr, (void*(*)(void*))triton_thread, thread)) + sleep(1); __sync_add_and_fetch(&triton_stat.thread_count, 1); __sync_add_and_fetch(&triton_stat.thread_active, 1); @@ -273,7 +272,8 @@ int triton_queue_ctx(struct _triton_context_t *ctx) return 0; spin_lock(&threads_lock); - if (list_empty(&sleep_threads) || need_config_reload || triton_stat.thread_active > thread_count) { + if (list_empty(&sleep_threads) || need_config_reload || triton_stat.thread_active > thread_count || + (ctx->priority == 0 && triton_stat.thread_count > thread_count_max)) { if (ctx->priority) list_add(&ctx->entry2, &ctx_queue); else @@ -614,6 +614,10 @@ void __export triton_run() if (opt && atoi(opt) > 0) thread_count = atoi(opt); + opt = conf_get_opt("core", "thread-count-max"); + if (opt && atoi(opt) > 0) + thread_count_max = atoi(opt); + for(i = 0; i < thread_count; i++) { t = create_thread(); if (!t) -- cgit v1.2.3