Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/subr_gtaskqueue.c
Show First 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | #define TQ_UNLOCK(tq) \ | ||||
do { \ | do { \ | ||||
if ((tq)->tq_spin) \ | if ((tq)->tq_spin) \ | ||||
mtx_unlock_spin(&(tq)->tq_mutex); \ | mtx_unlock_spin(&(tq)->tq_mutex); \ | ||||
else \ | else \ | ||||
mtx_unlock(&(tq)->tq_mutex); \ | mtx_unlock(&(tq)->tq_mutex); \ | ||||
} while (0) | } while (0) | ||||
#define TQ_ASSERT_UNLOCKED(tq) mtx_assert(&(tq)->tq_mutex, MA_NOTOWNED) | #define TQ_ASSERT_UNLOCKED(tq) mtx_assert(&(tq)->tq_mutex, MA_NOTOWNED) | ||||
#ifdef INVARIANTS | |||||
static void | |||||
gtask_dump(struct gtask *gtask) | |||||
{ | |||||
printf("gtask: %p ta_flags=%x ta_priority=%d ta_func=%p ta_context=%p\n", | |||||
gtask, gtask->ta_flags, gtask->ta_priority, gtask->ta_func, gtask->ta_context); | |||||
} | |||||
#endif | |||||
static __inline int | static __inline int | ||||
TQ_SLEEP(struct gtaskqueue *tq, void *p, struct mtx *m, int pri, const char *wm, | TQ_SLEEP(struct gtaskqueue *tq, void *p, struct mtx *m, int pri, const char *wm, | ||||
int t) | int t) | ||||
{ | { | ||||
if (tq->tq_spin) | if (tq->tq_spin) | ||||
return (msleep_spin(p, m, wm, t)); | return (msleep_spin(p, m, wm, t)); | ||||
return (msleep(p, m, pri, wm, t)); | return (msleep(p, m, pri, wm, t)); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | gtaskqueue_free(struct gtaskqueue *queue) | ||||
free(queue->tq_threads, M_GTASKQUEUE); | free(queue->tq_threads, M_GTASKQUEUE); | ||||
free(queue->tq_name, M_GTASKQUEUE); | free(queue->tq_name, M_GTASKQUEUE); | ||||
free(queue, M_GTASKQUEUE); | free(queue, M_GTASKQUEUE); | ||||
} | } | ||||
int | int | ||||
grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *gtask) | grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *gtask) | ||||
{ | { | ||||
#ifdef INVARIANTS | |||||
if (queue == NULL) { | |||||
gtask_dump(gtask); | |||||
panic("queue == NULL"); | |||||
} | |||||
#endif | |||||
TQ_LOCK(queue); | TQ_LOCK(queue); | ||||
if (gtask->ta_flags & TASK_ENQUEUED) { | if (gtask->ta_flags & TASK_ENQUEUED) { | ||||
TQ_UNLOCK(queue); | TQ_UNLOCK(queue); | ||||
return (0); | return (0); | ||||
} | } | ||||
STAILQ_INSERT_TAIL(&queue->tq_queue, gtask, ta_link); | STAILQ_INSERT_TAIL(&queue->tq_queue, gtask, ta_link); | ||||
gtask->ta_flags |= TASK_ENQUEUED; | gtask->ta_flags |= TASK_ENQUEUED; | ||||
TQ_UNLOCK(queue); | TQ_UNLOCK(queue); | ||||
▲ Show 20 Lines • Show All 740 Lines • Show Last 20 Lines |