Lines Matching refs:queue

72 _timeout_task_init(struct taskqueue *queue, struct timeout_task *timeout_task,  in _timeout_task_init()  argument
78 timeout_task->t.ta_queue = queue; in _timeout_task_init()
82 static void taskqueue_run(struct taskqueue *queue, int lock_held);
118 struct taskqueue *queue; in taskqueue_create() local
120 queue = kmalloc(sizeof(*queue), M_TASKQUEUE, mflags | M_ZERO); in taskqueue_create()
121 if (!queue) in taskqueue_create()
123 STAILQ_INIT(&queue->tq_queue); in taskqueue_create()
124 queue->tq_name = name; in taskqueue_create()
125 queue->tq_enqueue = enqueue; in taskqueue_create()
126 queue->tq_context = context; in taskqueue_create()
127 queue->tq_flags |= TQ_FLAGS_ACTIVE; in taskqueue_create()
128 TQ_LOCK_INIT(queue); in taskqueue_create()
131 STAILQ_INSERT_TAIL(&taskqueue_queues, queue, tq_link); in taskqueue_create()
134 return queue; in taskqueue_create()
151 taskqueue_free(struct taskqueue *queue) in taskqueue_free() argument
153 TQ_LOCK(queue); in taskqueue_free()
154 queue->tq_flags &= ~TQ_FLAGS_ACTIVE; in taskqueue_free()
155 taskqueue_run(queue, 1); in taskqueue_free()
156 taskqueue_terminate(queue->tq_threads, queue); in taskqueue_free()
157 TQ_UNLOCK(queue); in taskqueue_free()
160 STAILQ_REMOVE(&taskqueue_queues, queue, taskqueue, tq_link); in taskqueue_free()
163 TQ_LOCK_UNINIT(queue); in taskqueue_free()
165 kfree(queue, M_TASKQUEUE); in taskqueue_free()
171 struct taskqueue *queue; in taskqueue_find() local
174 STAILQ_FOREACH(queue, &taskqueue_queues, tq_link) { in taskqueue_find()
175 if (!strcmp(queue->tq_name, name)) { in taskqueue_find()
177 return queue; in taskqueue_find()
191 taskqueue_enqueue_locked(struct taskqueue *queue, struct task *task) in taskqueue_enqueue_locked() argument
199 if ((queue->tq_flags & TQ_FLAGS_ACTIVE) == 0) in taskqueue_enqueue_locked()
206 KKASSERT(queue == task->ta_queue); in taskqueue_enqueue_locked()
210 task->ta_queue = queue; in taskqueue_enqueue_locked()
215 prev = STAILQ_LAST(&queue->tq_queue, task, ta_link); in taskqueue_enqueue_locked()
217 STAILQ_INSERT_TAIL(&queue->tq_queue, task, ta_link); in taskqueue_enqueue_locked()
220 for (ins = STAILQ_FIRST(&queue->tq_queue); ins; in taskqueue_enqueue_locked()
226 STAILQ_INSERT_AFTER(&queue->tq_queue, prev, task, ta_link); in taskqueue_enqueue_locked()
228 STAILQ_INSERT_HEAD(&queue->tq_queue, task, ta_link); in taskqueue_enqueue_locked()
232 if ((queue->tq_flags & TQ_FLAGS_BLOCKED) == 0) { in taskqueue_enqueue_locked()
233 if (queue->tq_enqueue) in taskqueue_enqueue_locked()
234 queue->tq_enqueue(queue->tq_context); in taskqueue_enqueue_locked()
236 queue->tq_flags |= TQ_FLAGS_PENDING; in taskqueue_enqueue_locked()
247 taskqueue_enqueue(struct taskqueue *queue, struct task *task) in taskqueue_enqueue() argument
251 TQ_LOCK(queue); in taskqueue_enqueue()
252 res = taskqueue_enqueue_locked(queue, task); in taskqueue_enqueue()
253 TQ_UNLOCK(queue); in taskqueue_enqueue()
264 taskqueue_enqueue_optq(struct taskqueue *queue, struct taskqueue **qpp, in taskqueue_enqueue_optq() argument
281 task->ta_queue = queue; in taskqueue_enqueue_optq()
286 if (qtmp == queue) in taskqueue_enqueue_optq()
305 task->ta_queue = queue; in taskqueue_enqueue_optq()
316 *qpp = queue; in taskqueue_enqueue_optq()
317 res = taskqueue_enqueue_locked(queue, task); in taskqueue_enqueue_optq()
318 TQ_UNLOCK(queue); in taskqueue_enqueue_optq()
326 struct taskqueue *queue; in taskqueue_timeout_func() local
330 queue = timeout_task->t.ta_queue; in taskqueue_timeout_func()
332 TQ_LOCK(queue); in taskqueue_timeout_func()
335 queue->tq_callouts--; in taskqueue_timeout_func()
336 taskqueue_enqueue_locked(queue, &timeout_task->t); in taskqueue_timeout_func()
337 TQ_UNLOCK(queue); in taskqueue_timeout_func()
341 taskqueue_enqueue_timeout(struct taskqueue *queue, in taskqueue_enqueue_timeout() argument
346 TQ_LOCK(queue); in taskqueue_enqueue_timeout()
348 timeout_task->t.ta_queue == queue, in taskqueue_enqueue_timeout()
350 timeout_task->t.ta_queue = queue; in taskqueue_enqueue_timeout()
353 taskqueue_enqueue_locked(queue, &timeout_task->t); in taskqueue_enqueue_timeout()
354 TQ_UNLOCK(queue); in taskqueue_enqueue_timeout()
359 queue->tq_callouts++; in taskqueue_enqueue_timeout()
362 TQ_UNLOCK(queue); in taskqueue_enqueue_timeout()
370 taskqueue_block(struct taskqueue *queue) in taskqueue_block() argument
372 TQ_LOCK(queue); in taskqueue_block()
373 queue->tq_flags |= TQ_FLAGS_BLOCKED; in taskqueue_block()
374 TQ_UNLOCK(queue); in taskqueue_block()
378 taskqueue_unblock(struct taskqueue *queue) in taskqueue_unblock() argument
380 TQ_LOCK(queue); in taskqueue_unblock()
381 queue->tq_flags &= ~TQ_FLAGS_BLOCKED; in taskqueue_unblock()
382 if (queue->tq_flags & TQ_FLAGS_PENDING) { in taskqueue_unblock()
383 queue->tq_flags &= ~TQ_FLAGS_PENDING; in taskqueue_unblock()
384 if (queue->tq_enqueue) in taskqueue_unblock()
385 queue->tq_enqueue(queue->tq_context); in taskqueue_unblock()
387 TQ_UNLOCK(queue); in taskqueue_unblock()
391 taskqueue_run(struct taskqueue *queue, int lock_held) in taskqueue_run() argument
397 TQ_LOCK(queue); in taskqueue_run()
398 while (STAILQ_FIRST(&queue->tq_queue)) { in taskqueue_run()
403 task = STAILQ_FIRST(&queue->tq_queue); in taskqueue_run()
404 STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link); in taskqueue_run()
407 queue->tq_running = task; in taskqueue_run()
409 TQ_UNLOCK(queue); in taskqueue_run()
411 queue->tq_running = NULL; in taskqueue_run()
413 TQ_LOCK(queue); in taskqueue_run()
416 TQ_UNLOCK(queue); in taskqueue_run()
420 taskqueue_cancel_locked(struct taskqueue *queue, struct task *task, in taskqueue_cancel_locked() argument
425 STAILQ_REMOVE(&queue->tq_queue, task, task, ta_link); in taskqueue_cancel_locked()
429 return (task == queue->tq_running ? EBUSY : 0); in taskqueue_cancel_locked()
433 taskqueue_cancel(struct taskqueue *queue, struct task *task, u_int *pendp) in taskqueue_cancel() argument
437 TQ_LOCK(queue); in taskqueue_cancel()
438 error = taskqueue_cancel_locked(queue, task, pendp); in taskqueue_cancel()
439 TQ_UNLOCK(queue); in taskqueue_cancel()
447 struct taskqueue *queue; in taskqueue_cancel_simple() local
451 queue = task->ta_queue; in taskqueue_cancel_simple()
453 if (queue == NULL) { in taskqueue_cancel_simple()
457 TQ_LOCK(queue); in taskqueue_cancel_simple()
458 if (queue == task->ta_queue) { in taskqueue_cancel_simple()
459 error = taskqueue_cancel_locked(queue, task, NULL); in taskqueue_cancel_simple()
460 TQ_UNLOCK(queue); in taskqueue_cancel_simple()
463 TQ_UNLOCK(queue); in taskqueue_cancel_simple()
469 taskqueue_cancel_timeout(struct taskqueue *queue, in taskqueue_cancel_timeout() argument
476 TQ_LOCK(queue); in taskqueue_cancel_timeout()
477 error = taskqueue_cancel_locked(queue, &timeout_task->t, &pending1); in taskqueue_cancel_timeout()
480 queue->tq_callouts--; in taskqueue_cancel_timeout()
482 TQ_UNLOCK(queue); in taskqueue_cancel_timeout()
490 taskqueue_drain(struct taskqueue *queue, struct task *task) in taskqueue_drain() argument
492 TQ_LOCK(queue); in taskqueue_drain()
493 while (task->ta_pending != 0 || task == queue->tq_running) in taskqueue_drain()
494 TQ_SLEEP(queue, task, "-"); in taskqueue_drain()
495 TQ_UNLOCK(queue); in taskqueue_drain()
504 struct taskqueue *queue; in taskqueue_drain_simple() local
507 queue = task->ta_queue; in taskqueue_drain_simple()
509 if (queue == NULL) in taskqueue_drain_simple()
511 TQ_LOCK(queue); in taskqueue_drain_simple()
512 if (task->ta_pending == 0 && task != queue->tq_running) { in taskqueue_drain_simple()
513 TQ_UNLOCK(queue); in taskqueue_drain_simple()
516 TQ_SLEEP(queue, task, "-"); in taskqueue_drain_simple()
517 TQ_UNLOCK(queue); in taskqueue_drain_simple()
522 taskqueue_drain_timeout(struct taskqueue *queue, in taskqueue_drain_timeout() argument
526 taskqueue_drain(queue, &timeout_task->t); in taskqueue_drain_timeout()