Lines Matching refs:task
109 push_readyq(isc_taskmgr_t *manager, isc_task_t *task);
116 task_finished(isc_task_t *task) { in task_finished() argument
117 isc_taskmgr_t *manager = task->manager; in task_finished()
119 REQUIRE(EMPTY(task->events)); in task_finished()
120 REQUIRE(task->nevents == 0); in task_finished()
121 REQUIRE(EMPTY(task->on_shutdown)); in task_finished()
122 REQUIRE(task->references == 0); in task_finished()
123 REQUIRE(task->state == task_state_done); in task_finished()
125 UNLINK(manager->tasks, task, link); in task_finished()
127 free(task); in task_finished()
134 isc_task_t *task; in isc_task_create() local
139 task = malloc(sizeof(*task)); in isc_task_create()
140 if (task == NULL) in isc_task_create()
142 task->manager = manager; in isc_task_create()
143 task->state = task_state_idle; in isc_task_create()
144 task->references = 1; in isc_task_create()
145 INIT_LIST(task->events); in isc_task_create()
146 INIT_LIST(task->on_shutdown); in isc_task_create()
147 task->nevents = 0; in isc_task_create()
148 task->quantum = quantum; in isc_task_create()
149 task->flags = 0; in isc_task_create()
150 task->now = 0; in isc_task_create()
151 memset(task->name, 0, sizeof(task->name)); in isc_task_create()
152 task->tag = NULL; in isc_task_create()
153 INIT_LINK(task, link); in isc_task_create()
154 INIT_LINK(task, ready_link); in isc_task_create()
155 INIT_LINK(task, ready_priority_link); in isc_task_create()
159 if (task->quantum == 0) in isc_task_create()
160 task->quantum = manager->default_quantum; in isc_task_create()
161 APPEND(manager->tasks, task, link); in isc_task_create()
166 free(task); in isc_task_create()
170 *taskp = (isc_task_t *)task; in isc_task_create()
190 task_shutdown(isc_task_t *task) { in task_shutdown() argument
198 if (! TASK_SHUTTINGDOWN(task)) { in task_shutdown()
199 task->flags |= TASK_F_SHUTTINGDOWN; in task_shutdown()
200 if (task->state == task_state_idle) { in task_shutdown()
201 INSIST(EMPTY(task->events)); in task_shutdown()
202 task->state = task_state_ready; in task_shutdown()
205 INSIST(task->state == task_state_ready || in task_shutdown()
206 task->state == task_state_running); in task_shutdown()
211 for (event = TAIL(task->on_shutdown); in task_shutdown()
215 DEQUEUE(task->on_shutdown, event, ev_link); in task_shutdown()
216 ENQUEUE(task->events, event, ev_link); in task_shutdown()
217 task->nevents++; in task_shutdown()
230 task_ready(isc_task_t *task) { in task_ready() argument
231 isc_taskmgr_t *manager = task->manager; in task_ready()
233 REQUIRE(task->state == task_state_ready); in task_ready()
235 push_readyq(manager, task); in task_ready()
239 task_detach(isc_task_t *task) { in task_detach() argument
245 REQUIRE(task->references > 0); in task_detach()
247 task->references--; in task_detach()
248 if (task->references == 0 && task->state == task_state_idle) { in task_detach()
249 INSIST(EMPTY(task->events)); in task_detach()
258 task->state = task_state_ready; in task_detach()
267 isc_task_t *task; in isc_task_detach() local
275 task = (isc_task_t *)*taskp; in isc_task_detach()
277 was_idle = task_detach(task); in isc_task_detach()
280 task_ready(task); in isc_task_detach()
286 task_send(isc_task_t *task, isc_event_t **eventp) { in task_send() argument
298 REQUIRE(task->state != task_state_done); in task_send()
301 if (task->state == task_state_idle) { in task_send()
303 INSIST(EMPTY(task->events)); in task_send()
304 task->state = task_state_ready; in task_send()
306 INSIST(task->state == task_state_ready || in task_send()
307 task->state == task_state_running); in task_send()
308 ENQUEUE(task->events, event, ev_link); in task_send()
309 task->nevents++; in task_send()
316 isc_task_send(isc_task_t *task, isc_event_t **eventp) { in isc_task_send() argument
328 was_idle = task_send(task, eventp); in isc_task_send()
346 task_ready(task); in isc_task_send()
353 isc_task_t *task; in isc_task_sendanddetach() local
361 task = (isc_task_t *)*taskp; in isc_task_sendanddetach()
363 idle1 = task_send(task, eventp); in isc_task_sendanddetach()
364 idle2 = task_detach(task); in isc_task_sendanddetach()
374 task_ready(task); in isc_task_sendanddetach()
382 dequeue_events(isc_task_t *task, void *sender, isc_eventtype_t first, in dequeue_events() argument
399 for (event = HEAD(task->events); event != NULL; event = next_event) { in dequeue_events()
405 DEQUEUE(task->events, event, ev_link); in dequeue_events()
406 task->nevents--; in dequeue_events()
416 isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first, in isc_task_purgerange() argument
429 count = dequeue_events(task, sender, first, last, tag, &events, in isc_task_purgerange()
446 isc_task_setname(isc_task_t *task, const char *name, void *tag) { in isc_task_setname() argument
451 strlcpy(task->name, name, sizeof(task->name)); in isc_task_setname()
452 task->tag = tag; in isc_task_setname()
488 isc_task_t *task; in pop_readyq() local
491 task = HEAD(manager->ready_tasks); in pop_readyq()
493 task = HEAD(manager->ready_priority_tasks); in pop_readyq()
495 if (task != NULL) { in pop_readyq()
496 DEQUEUE(manager->ready_tasks, task, ready_link); in pop_readyq()
497 if (ISC_LINK_LINKED(task, ready_priority_link)) in pop_readyq()
498 DEQUEUE(manager->ready_priority_tasks, task, in pop_readyq()
502 return (task); in pop_readyq()
512 push_readyq(isc_taskmgr_t *manager, isc_task_t *task) { in push_readyq() argument
513 ENQUEUE(manager->ready_tasks, task, ready_link); in push_readyq()
514 if ((task->flags & TASK_F_PRIVILEGED) != 0) in push_readyq()
515 ENQUEUE(manager->ready_priority_tasks, task, in push_readyq()
522 isc_task_t *task; in dispatch() local
536 task = pop_readyq(manager); in dispatch()
537 if (task != NULL) { in dispatch()
552 INSIST(task->state == task_state_ready); in dispatch()
553 task->state = task_state_running; in dispatch()
554 time(&task->now); in dispatch()
556 if (!EMPTY(task->events)) { in dispatch()
557 event = HEAD(task->events); in dispatch()
558 DEQUEUE(task->events, event, ev_link); in dispatch()
559 task->nevents--; in dispatch()
566 (isc_task_t *)task, in dispatch()
573 if (task->references == 0 && in dispatch()
574 EMPTY(task->events) && in dispatch()
575 !TASK_SHUTTINGDOWN(task)) { in dispatch()
600 was_idle = task_shutdown(task); in dispatch()
604 if (EMPTY(task->events)) { in dispatch()
609 if (task->references == 0 && in dispatch()
610 TASK_SHUTTINGDOWN(task)) { in dispatch()
615 task->state = task_state_done; in dispatch()
617 task->state = task_state_idle; in dispatch()
619 } else if (dispatch_count >= task->quantum) { in dispatch()
630 task->state = task_state_ready; in dispatch()
637 task_finished(task); in dispatch()
660 ENQUEUE(new_ready_tasks, task, ready_link); in dispatch()
661 if ((task->flags & TASK_F_PRIVILEGED) != 0) in dispatch()
662 ENQUEUE(new_priority_tasks, task, in dispatch()
739 isc_task_t *task; in isc_taskmgr_destroy() local
786 for (task = HEAD(manager->tasks); in isc_taskmgr_destroy()
787 task != NULL; in isc_taskmgr_destroy()
788 task = NEXT(task, link)) { in isc_taskmgr_destroy()
789 if (task_shutdown(task)) in isc_taskmgr_destroy()
790 push_readyq(manager, task); in isc_taskmgr_destroy()