***/
typedef enum {
- task_state_idle, task_state_ready, task_state_paused,
- task_state_running, task_state_done
+ task_state_idle, /* not doing anything, events queue empty */
+ task_state_ready, /* waiting in worker's queue */
+ task_state_paused, /* not running, paused */
+ task_state_pausing, /* running, waiting to be paused */
+ task_state_running, /* actively processing events */
+ task_state_done /* shutting down, no events or references */
} task_state_t;
#if defined(HAVE_LIBXML2) || defined(HAVE_JSON_C)
static const char *statenames[] = {
- "idle", "ready", "running", "done",
+ "idle", "ready", "paused", "pausing", "running", "done",
};
#endif
}
INSIST(task->state == task_state_ready ||
task->state == task_state_paused ||
+ task->state == task_state_pausing ||
task->state == task_state_running);
/*
}
INSIST(task->state == task_state_ready ||
task->state == task_state_running ||
- task->state == task_state_paused);
+ task->state == task_state_paused ||
+ task->state == task_state_pausing);
ENQUEUE(task->events, event, ev_link);
task->nevents++;
*eventp = NULL;
finished = true;
task->state = task_state_done;
} else {
- /* It might be paused */
if (task->state ==
task_state_running) {
task->state = task_state_idle;
+ } else if (task->state ==
+ task_state_pausing) {
+ task->state = task_state_paused;
}
}
done = true;
*/
task->state = task_state_ready;
requeue = true;
+ } else if (task->state ==
+ task_state_pausing) {
+ task->state = task_state_paused;
}
done = true;
}
INSIST(task->state == task_state_idle ||
task->state == task_state_ready ||
task->state == task_state_running);
- running = (task->state == task_state_running);
- task->state = task_state_paused;
+ if (task->state == task_state_running) {
+ running = true;
+ task->state = task_state_pausing;
+ } else {
+ task->state = task_state_paused;
+ }
UNLOCK(&task->lock);
if (running) {
REQUIRE(ISCAPI_TASK_VALID(task0));
LOCK(&task->lock);
- INSIST(task->state == task_state_paused);
- if (!EMPTY(task->events)) {
- task->state = task_state_ready;
- was_idle = true;
+ INSIST(task->state == task_state_paused ||
+ task->state == task_state_pausing);
+ /* If the task was pausing we can't reschedule it */
+ if (task->state == task_state_pausing) {
+ task->state = task_state_running;
} else {
task->state = task_state_idle;
}
+ if (task->state == task_state_idle && !EMPTY(task->events)) {
+ task->state = task_state_ready;
+ was_idle = true;
+ }
UNLOCK(&task->lock);
if (was_idle) {