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.
This commit is contained in:
@@ -401,6 +401,31 @@ METHOD(processor_t, queue_job, void,
|
|||||||
this->mutex->unlock(this->mutex);
|
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,
|
METHOD(processor_t, set_threads, void,
|
||||||
private_processor_t *this, u_int count)
|
private_processor_t *this, u_int count)
|
||||||
{
|
{
|
||||||
@@ -512,6 +537,7 @@ processor_t *processor_create()
|
|||||||
.get_working_threads = _get_working_threads,
|
.get_working_threads = _get_working_threads,
|
||||||
.get_job_load = _get_job_load,
|
.get_job_load = _get_job_load,
|
||||||
.queue_job = _queue_job,
|
.queue_job = _queue_job,
|
||||||
|
.execute_job = _execute_job,
|
||||||
.set_threads = _set_threads,
|
.set_threads = _set_threads,
|
||||||
.get_threads = _get_threads,
|
.get_threads = _get_threads,
|
||||||
.cancel = _cancel,
|
.cancel = _cancel,
|
||||||
|
|||||||
@@ -74,6 +74,16 @@ struct processor_t {
|
|||||||
*/
|
*/
|
||||||
void (*queue_job) (processor_t *this, job_t *job);
|
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.
|
* Set the number of threads to use in the processor.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user