Lines Matching refs:queue

48 static int	task_is_running(struct gtaskqueue *queue, struct gtask *gtask);
49 static void gtaskqueue_drain_locked(struct gtaskqueue *queue, struct gtask *gtask);
112 struct gtaskqueue *queue; in _gtaskqueue_create() local
114 queue = kmalloc(sizeof(struct gtaskqueue), in _gtaskqueue_create()
116 if (!queue) { in _gtaskqueue_create()
121 STAILQ_INIT(&queue->tq_queue); in _gtaskqueue_create()
122 LIST_INIT(&queue->tq_active); in _gtaskqueue_create()
123 queue->tq_enqueue = enqueue; in _gtaskqueue_create()
124 queue->tq_context = context; in _gtaskqueue_create()
125 queue->tq_name = name ? name : "taskqueue"; in _gtaskqueue_create()
126 queue->tq_flags |= TQ_FLAGS_ACTIVE; in _gtaskqueue_create()
128 queue->tq_flags |= TQ_FLAGS_UNLOCKED_ENQUEUE; in _gtaskqueue_create()
129 lockinit(&queue->tq_lock, queue->tq_name, 0, 0); in _gtaskqueue_create()
131 return (queue); in _gtaskqueue_create()
148 gtaskqueue_free(struct gtaskqueue *queue) in gtaskqueue_free() argument
151 TQ_LOCK(queue); in gtaskqueue_free()
152 queue->tq_flags &= ~TQ_FLAGS_ACTIVE; in gtaskqueue_free()
153 gtaskqueue_terminate(queue->tq_threads, queue); in gtaskqueue_free()
154 KASSERT(LIST_EMPTY(&queue->tq_active), ("Tasks still running?")); in gtaskqueue_free()
155 KASSERT(queue->tq_callouts == 0, ("Armed timeout tasks")); in gtaskqueue_free()
156 lockuninit(&queue->tq_lock); in gtaskqueue_free()
157 kfree(queue->tq_threads, M_GTASKQUEUE); in gtaskqueue_free()
159 kfree(queue, M_GTASKQUEUE); in gtaskqueue_free()
168 struct gtaskqueue *queue = grouptask->gt_taskqueue; in grouptask_block() local
172 if (queue == NULL) { in grouptask_block()
177 TQ_LOCK(queue); in grouptask_block()
179 gtaskqueue_drain_locked(queue, gtask); in grouptask_block()
180 TQ_UNLOCK(queue); in grouptask_block()
186 struct gtaskqueue *queue = grouptask->gt_taskqueue; in grouptask_unblock() local
190 if (queue == NULL) { in grouptask_unblock()
195 TQ_LOCK(queue); in grouptask_unblock()
197 TQ_UNLOCK(queue); in grouptask_unblock()
201 grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *gtask) in grouptaskqueue_enqueue() argument
204 if (queue == NULL) { in grouptaskqueue_enqueue()
209 TQ_LOCK(queue); in grouptaskqueue_enqueue()
211 TQ_UNLOCK(queue); in grouptaskqueue_enqueue()
215 TQ_UNLOCK(queue); in grouptaskqueue_enqueue()
218 STAILQ_INSERT_TAIL(&queue->tq_queue, gtask, ta_link); in grouptaskqueue_enqueue()
220 TQ_UNLOCK(queue); in grouptaskqueue_enqueue()
221 if ((queue->tq_flags & TQ_FLAGS_BLOCKED) == 0) in grouptaskqueue_enqueue()
222 queue->tq_enqueue(queue->tq_context); in grouptaskqueue_enqueue()
237 gtaskqueue_drain_tq_queue(struct gtaskqueue *queue) in gtaskqueue_drain_tq_queue() argument
241 if (STAILQ_EMPTY(&queue->tq_queue)) in gtaskqueue_drain_tq_queue()
253 STAILQ_INSERT_TAIL(&queue->tq_queue, &t_barrier, ta_link); in gtaskqueue_drain_tq_queue()
261 TQ_SLEEP(queue, &t_barrier, "gtq_qdrain"); in gtaskqueue_drain_tq_queue()
270 gtaskqueue_drain_tq_active(struct gtaskqueue *queue) in gtaskqueue_drain_tq_active() argument
275 if (LIST_EMPTY(&queue->tq_active)) in gtaskqueue_drain_tq_active()
279 queue->tq_callouts++; in gtaskqueue_drain_tq_active()
282 seq = queue->tq_seq; in gtaskqueue_drain_tq_active()
284 LIST_FOREACH(tb, &queue->tq_active, tb_link) { in gtaskqueue_drain_tq_active()
286 TQ_SLEEP(queue, tb->tb_running, "gtq_adrain"); in gtaskqueue_drain_tq_active()
292 queue->tq_callouts--; in gtaskqueue_drain_tq_active()
293 if ((queue->tq_flags & TQ_FLAGS_ACTIVE) == 0) in gtaskqueue_drain_tq_active()
294 wakeup_one(queue->tq_threads); in gtaskqueue_drain_tq_active()
298 gtaskqueue_block(struct gtaskqueue *queue) in gtaskqueue_block() argument
301 TQ_LOCK(queue); in gtaskqueue_block()
302 queue->tq_flags |= TQ_FLAGS_BLOCKED; in gtaskqueue_block()
303 TQ_UNLOCK(queue); in gtaskqueue_block()
307 gtaskqueue_unblock(struct gtaskqueue *queue) in gtaskqueue_unblock() argument
310 TQ_LOCK(queue); in gtaskqueue_unblock()
311 queue->tq_flags &= ~TQ_FLAGS_BLOCKED; in gtaskqueue_unblock()
312 if (!STAILQ_EMPTY(&queue->tq_queue)) in gtaskqueue_unblock()
313 queue->tq_enqueue(queue->tq_context); in gtaskqueue_unblock()
314 TQ_UNLOCK(queue); in gtaskqueue_unblock()
318 gtaskqueue_run_locked(struct gtaskqueue *queue) in gtaskqueue_run_locked() argument
327 KASSERT(queue != NULL, ("tq is NULL")); in gtaskqueue_run_locked()
328 TQ_ASSERT_LOCKED(queue); in gtaskqueue_run_locked()
330 LIST_INSERT_HEAD(&queue->tq_active, &tb, tb_link); in gtaskqueue_run_locked()
335 while ((gtask = STAILQ_FIRST(&queue->tq_queue)) != NULL) { in gtaskqueue_run_locked()
336 STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link); in gtaskqueue_run_locked()
339 tb.tb_seq = ++queue->tq_seq; in gtaskqueue_run_locked()
340 TQ_UNLOCK(queue); in gtaskqueue_run_locked()
354 TQ_LOCK(queue); in gtaskqueue_run_locked()
365 task_is_running(struct gtaskqueue *queue, struct gtask *gtask) in task_is_running() argument
369 TQ_ASSERT_LOCKED(queue); in task_is_running()
370 LIST_FOREACH(tb, &queue->tq_active, tb_link) { in task_is_running()
378 gtaskqueue_cancel_locked(struct gtaskqueue *queue, struct gtask *gtask) in gtaskqueue_cancel_locked() argument
382 STAILQ_REMOVE(&queue->tq_queue, gtask, gtask, ta_link); in gtaskqueue_cancel_locked()
384 return (task_is_running(queue, gtask) ? EBUSY : 0); in gtaskqueue_cancel_locked()
388 gtaskqueue_cancel(struct gtaskqueue *queue, struct gtask *gtask) in gtaskqueue_cancel() argument
392 TQ_LOCK(queue); in gtaskqueue_cancel()
393 error = gtaskqueue_cancel_locked(queue, gtask); in gtaskqueue_cancel()
394 TQ_UNLOCK(queue); in gtaskqueue_cancel()
400 gtaskqueue_drain_locked(struct gtaskqueue *queue, struct gtask *gtask) in gtaskqueue_drain_locked() argument
402 while ((gtask->ta_flags & TASK_ENQUEUED) || task_is_running(queue, gtask)) in gtaskqueue_drain_locked()
403 TQ_SLEEP(queue, gtask, "gtq_drain"); in gtaskqueue_drain_locked()
407 gtaskqueue_drain(struct gtaskqueue *queue, struct gtask *gtask) in gtaskqueue_drain() argument
409 TQ_LOCK(queue); in gtaskqueue_drain()
410 gtaskqueue_drain_locked(queue, gtask); in gtaskqueue_drain()
411 TQ_UNLOCK(queue); in gtaskqueue_drain()
415 gtaskqueue_drain_all(struct gtaskqueue *queue) in gtaskqueue_drain_all() argument
418 TQ_LOCK(queue); in gtaskqueue_drain_all()
419 gtaskqueue_drain_tq_queue(queue); in gtaskqueue_drain_all()
420 gtaskqueue_drain_tq_active(queue); in gtaskqueue_drain_all()
421 TQ_UNLOCK(queue); in gtaskqueue_drain_all()