aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/processing/processor.c
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2011-05-02 12:18:03 +0200
committerMartin Willi <martin@revosec.ch>2011-05-16 15:24:13 +0200
commit68f56418cd5d8a61ec0f7a1ecc72938c7ee9e724 (patch)
tree65cbd3e07c3dd5fd9cecfacb4cc8a96245d2c57b /src/libstrongswan/processing/processor.c
parent2959ea6f84d0dff76cd1190441b206329014118a (diff)
downloadstrongswan-68f56418cd5d8a61ec0f7a1ecc72938c7ee9e724.tar.bz2
strongswan-68f56418cd5d8a61ec0f7a1ecc72938c7ee9e724.tar.xz
Reserve threads for job priority classes based on strongswan.conf options
Diffstat (limited to 'src/libstrongswan/processing/processor.c')
-rw-r--r--src/libstrongswan/processing/processor.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/libstrongswan/processing/processor.c b/src/libstrongswan/processing/processor.c
index b114f8de1..46c49a993 100644
--- a/src/libstrongswan/processing/processor.c
+++ b/src/libstrongswan/processing/processor.c
@@ -67,6 +67,11 @@ struct private_processor_t {
linked_list_t *jobs[JOB_PRIO_MAX];
/**
+ * Threads reserved for each priority
+ */
+ int prio_threads[JOB_PRIO_MAX];
+
+ /**
* access to job lists is locked through this mutex
*/
mutex_t *mutex;
@@ -122,10 +127,18 @@ static void process_jobs(private_processor_t *this)
while (this->desired_threads >= this->total_threads)
{
job_t *job = NULL;
- int i;
+ int i, prio_sum = 0;
for (i = 0; i < JOB_PRIO_MAX; i++)
{
+ if (prio_sum && prio_sum >= this->idle_threads)
+ {
+ DBG2(DBG_JOB, "delaying %N priority jobs: %d threads idle, "
+ "but %d reserved for higher priorities",
+ job_priority_names, i, this->idle_threads, prio_sum);
+ break;
+ }
+ prio_sum += this->prio_threads[i];
if (this->jobs[i]->remove_first(this->jobs[i],
(void**)&job) == SUCCESS)
{
@@ -293,6 +306,9 @@ processor_t *processor_create()
for (i = 0; i < JOB_PRIO_MAX; i++)
{
this->jobs[i] = linked_list_create();
+ this->prio_threads[i] = lib->settings->get_int(lib->settings,
+ "libstrongswan.processor.priority_threads.%N", 0,
+ job_priority_names, i);
}
return &this->public;