summaryrefslogtreecommitdiff
path: root/accel-pppd
diff options
context:
space:
mode:
authorKozlov Dmitry <xeb@mail.ru>2011-12-27 16:06:10 +0400
committerKozlov Dmitry <xeb@mail.ru>2011-12-27 16:06:10 +0400
commit1ade87d064ff682e0d836558e73ad7ca3e7148ec (patch)
tree72586b0de898c5fad220286be96222c90cd1f6bd /accel-pppd
parentb2f9d7066553be2b74b048fcf65417eaadb44c60 (diff)
downloadaccel-ppp-1ade87d064ff682e0d836558e73ad7ca3e7148ec.tar.gz
accel-ppp-1ade87d064ff682e0d836558e73ad7ca3e7148ec.zip
core: queue zero-priority context if number of threads is reached maximum
Diffstat (limited to 'accel-pppd')
-rw-r--r--accel-pppd/radius/req.c1
-rw-r--r--accel-pppd/triton/triton.c14
2 files changed, 10 insertions, 5 deletions
diff --git a/accel-pppd/radius/req.c b/accel-pppd/radius/req.c
index ed69846f..4a9d42ad 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 4e3e75a4..66c6cef5 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)