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);
|
||||
}
|
||||
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user