| 123 | } |
| 124 | |
| 125 | static struct gtaskqueue * |
| 126 | _gtaskqueue_create(const char *name, int mflags, |
| 127 | taskqueue_enqueue_fn enqueue, void *context, |
| 128 | int mtxflags, const char *mtxname __unused) |
| 129 | { |
| 130 | struct gtaskqueue *queue; |
| 131 | char *tq_name; |
| 132 | |
| 133 | tq_name = malloc(TASKQUEUE_NAMELEN, M_GTASKQUEUE, mflags | M_ZERO); |
| 134 | if (!tq_name) |
| 135 | return (NULL); |
| 136 | |
| 137 | snprintf(tq_name, TASKQUEUE_NAMELEN, "%s", (name) ? name : "taskqueue"); |
| 138 | |
| 139 | queue = malloc(sizeof(struct gtaskqueue), M_GTASKQUEUE, mflags | M_ZERO); |
| 140 | if (!queue) { |
| 141 | free(tq_name, M_GTASKQUEUE); |
| 142 | return (NULL); |
| 143 | } |
| 144 | |
| 145 | STAILQ_INIT(&queue->tq_queue); |
| 146 | LIST_INIT(&queue->tq_active); |
| 147 | queue->tq_enqueue = enqueue; |
| 148 | queue->tq_context = context; |
| 149 | queue->tq_name = tq_name; |
| 150 | queue->tq_spin = (mtxflags & MTX_SPIN) != 0; |
| 151 | queue->tq_flags |= TQ_FLAGS_ACTIVE; |
| 152 | if (enqueue == gtaskqueue_thread_enqueue) |
| 153 | queue->tq_flags |= TQ_FLAGS_UNLOCKED_ENQUEUE; |
| 154 | mtx_init(&queue->tq_mutex, tq_name, NULL, mtxflags); |
| 155 | |
| 156 | return (queue); |
| 157 | } |
| 158 | |
| 159 | /* |
| 160 | * Signal a taskqueue thread to terminate. |
no test coverage detected