From: Martin Willi Date: Thu, 18 Jul 2013 09:37:42 +0000 (+0200) Subject: processor: add an execute_job() method to directly execute an important job X-Git-Tag: 5.1.0rc1~10^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6653e6c13e61da0753625af13de62c46d1ceeb48;p=thirdparty%2Fstrongswan.git processor: add an execute_job() method to directly execute an important job If all worker threads are busy and waiting for an event, we must ensure that a job delivering that event gets executed. This new method has this property for CRITICAL jobs, using a worker if we have one, but executing the job directly if not. --- diff --git a/src/libstrongswan/processing/processor.c b/src/libstrongswan/processing/processor.c index c465f02591..f193b8d5e1 100644 --- a/src/libstrongswan/processing/processor.c +++ b/src/libstrongswan/processing/processor.c @@ -401,6 +401,31 @@ METHOD(processor_t, queue_job, void, this->mutex->unlock(this->mutex); } +METHOD(processor_t, execute_job, void, + private_processor_t *this, job_t *job) +{ + job_priority_t prio; + bool queued = FALSE; + + this->mutex->lock(this->mutex); + if (get_idle_threads_nolock(this)) + { + prio = sane_prio(job->get_priority(job)); + job->status = JOB_STATUS_QUEUED; + /* insert job in front to execute it immediately */ + this->jobs[prio]->insert_first(this->jobs[prio], job); + queued = TRUE; + } + this->job_added->signal(this->job_added); + this->mutex->unlock(this->mutex); + + if (!queued) + { + job->execute(job); + job->destroy(job); + } +} + METHOD(processor_t, set_threads, void, private_processor_t *this, u_int count) { @@ -512,6 +537,7 @@ processor_t *processor_create() .get_working_threads = _get_working_threads, .get_job_load = _get_job_load, .queue_job = _queue_job, + .execute_job = _execute_job, .set_threads = _set_threads, .get_threads = _get_threads, .cancel = _cancel, diff --git a/src/libstrongswan/processing/processor.h b/src/libstrongswan/processing/processor.h index bd708fba86..c691cfb609 100644 --- a/src/libstrongswan/processing/processor.h +++ b/src/libstrongswan/processing/processor.h @@ -74,6 +74,16 @@ struct processor_t { */ void (*queue_job) (processor_t *this, job_t *job); + /** + * Directly execute a job with an idle worker thread. + * + * If no idle thread is available, the job gets executed by the calling + * thread. + * + * @param job job, gets destroyed + */ + void (*execute_job)(processor_t *this, job_t *job); + /** * Set the number of threads to use in the processor. *