Lines Matching refs:queue

105 _timeout_task_init(struct taskqueue *queue, struct timeout_task *timeout_task,
110 callout_init_mtx(&timeout_task->c, &queue->tq_mutex,
112 timeout_task->q = queue;
121 struct taskqueue *queue;
128 queue = malloc(sizeof(struct taskqueue), M_TASKQUEUE, mflags | M_ZERO);
129 if (queue == NULL) {
136 STAILQ_INIT(&queue->tq_queue);
137 TAILQ_INIT(&queue->tq_active);
138 queue->tq_enqueue = enqueue;
139 queue->tq_context = context;
140 queue->tq_name = tq_name;
141 queue->tq_spin = (mtxflags & MTX_SPIN) != 0;
142 queue->tq_flags |= TQ_FLAGS_ACTIVE;
144 queue->tq_flags |= TQ_FLAGS_UNLOCKED_ENQUEUE;
145 mtx_init(&queue->tq_mutex, tq_name, NULL, mtxflags);
147 return (queue);
160 taskqueue_set_callback(struct taskqueue *queue,
169 KASSERT((queue->tq_callbacks[cb_type] == NULL),
172 queue->tq_callbacks[cb_type] = callback;
173 queue->tq_cb_contexts[cb_type] = context;
177 taskqueue_free(struct taskqueue *queue)
180 TQ_LOCK(queue);
181 queue->tq_flags &= ~TQ_FLAGS_ACTIVE;
182 taskqueue_terminate(queue->tq_threads, queue);
183 KASSERT(TAILQ_EMPTY(&queue->tq_active), ("Tasks still running?"));
184 KASSERT(queue->tq_callouts == 0, ("Armed timeout tasks"));
186 TQ_UNLOCK(queue);
188 mtx_destroy(&queue->tq_mutex);
189 free(queue->tq_threads, M_TASKQUEUE);
190 free(queue->tq_name, M_TASKQUEUE);
191 free(queue, M_TASKQUEUE);
195 taskqueue_enqueue_locked(struct taskqueue *queue, struct task *task)
207 TQ_UNLOCK(queue);
214 prev = STAILQ_LAST(&queue->tq_queue, task, ta_link);
216 STAILQ_INSERT_TAIL(&queue->tq_queue, task, ta_link);
219 for (ins = STAILQ_FIRST(&queue->tq_queue); ins;
225 STAILQ_INSERT_AFTER(&queue->tq_queue, prev, task, ta_link);
227 STAILQ_INSERT_HEAD(&queue->tq_queue, task, ta_link);
231 if ((queue->tq_flags & TQ_FLAGS_UNLOCKED_ENQUEUE) != 0)
232 TQ_UNLOCK(queue);
233 if ((queue->tq_flags & TQ_FLAGS_BLOCKED) == 0)
234 queue->tq_enqueue(queue->tq_context);
235 if ((queue->tq_flags & TQ_FLAGS_UNLOCKED_ENQUEUE) == 0)
236 TQ_UNLOCK(queue);
243 taskqueue_enqueue(struct taskqueue *queue, struct task *task)
247 TQ_LOCK(queue);
248 res = taskqueue_enqueue_locked(queue, task);
257 struct taskqueue *queue;
261 queue = timeout_task->q;
264 queue->tq_callouts--;
270 taskqueue_enqueue_timeout(struct taskqueue *queue,
275 TQ_LOCK(queue);
276 KASSERT(timeout_task->q == NULL || timeout_task->q == queue,
277 ("Migrated queue"));
278 KASSERT(!queue->tq_spin, ("Timeout for spin-queue"));
279 timeout_task->q = queue;
283 TQ_UNLOCK(queue);
286 taskqueue_enqueue_locked(queue, &timeout_task->t);
292 queue->tq_callouts++;
301 TQ_UNLOCK(queue);
312 taskqueue_block(struct taskqueue *queue)
315 TQ_LOCK(queue);
316 queue->tq_flags |= TQ_FLAGS_BLOCKED;
317 TQ_UNLOCK(queue);
321 taskqueue_unblock(struct taskqueue *queue)
324 TQ_LOCK(queue);
325 queue->tq_flags &= ~TQ_FLAGS_BLOCKED;
326 if (!STAILQ_EMPTY(&queue->tq_queue))
327 queue->tq_enqueue(queue->tq_context);
328 TQ_UNLOCK(queue);
332 taskqueue_run_locked(struct taskqueue *queue)
339 KASSERT(queue != NULL, ("tq is NULL"));
340 TQ_ASSERT_LOCKED(queue);
343 while (STAILQ_FIRST(&queue->tq_queue)) {
344 TAILQ_INSERT_TAIL(&queue->tq_active, &tb, tb_link);
347 * Carefully remove the first task from the queue and
350 task = STAILQ_FIRST(&queue->tq_queue);
352 STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link);
356 TQ_UNLOCK(queue);
369 TQ_LOCK(queue);
372 TAILQ_REMOVE(&queue->tq_active, &tb, tb_link);
373 tb_first = TAILQ_FIRST(&queue->tq_active);
378 taskqueue_run(struct taskqueue *queue)
381 TQ_LOCK(queue);
382 taskqueue_run_locked(queue);
383 TQ_UNLOCK(queue);
387 task_is_running(struct taskqueue *queue, struct task *task)
391 TQ_ASSERT_LOCKED(queue);
392 TAILQ_FOREACH(tb, &queue->tq_active, tb_link) {
400 taskqueue_cancel_locked(struct taskqueue *queue, struct task *task,
405 STAILQ_REMOVE(&queue->tq_queue, task, task, ta_link);
409 return (task_is_running(queue, task) ? EBUSY : 0);
413 taskqueue_cancel(struct taskqueue *queue, struct task *task, u_int *pendp)
417 TQ_LOCK(queue);
418 error = taskqueue_cancel_locked(queue, task, pendp);
419 TQ_UNLOCK(queue);
425 taskqueue_cancel_timeout(struct taskqueue *queue,
431 TQ_LOCK(queue);
433 error = taskqueue_cancel_locked(queue, &timeout_task->t, &pending1);
436 queue->tq_callouts--;
438 TQ_UNLOCK(queue);
446 taskqueue_drain_timeout(struct taskqueue *queue,
453 TQ_LOCK(queue);
457 TQ_UNLOCK(queue);
460 taskqueue_drain(queue, &timeout_task->t);
465 TQ_LOCK(queue);
467 TQ_UNLOCK(queue);
499 taskqueue_member(struct taskqueue *queue, struct thread *td)
504 if (queue->tq_threads[i] == NULL)
506 if (queue->tq_threads[i] == td) {
510 if (++j >= queue->tq_tcount)