| 130 | #endif |
| 131 | |
| 132 | static struct taskqueue * |
| 133 | _taskqueue_create(const char *name, int mflags, |
| 134 | taskqueue_enqueue_fn enqueue, void *context, |
| 135 | int mtxflags, const char *mtxname __unused) |
| 136 | { |
| 137 | struct taskqueue *queue; |
| 138 | char *tq_name; |
| 139 | |
| 140 | tq_name = malloc(TASKQUEUE_NAMELEN, M_TASKQUEUE, mflags | M_ZERO); |
| 141 | if (tq_name == NULL) |
| 142 | return (NULL); |
| 143 | |
| 144 | queue = malloc(sizeof(struct taskqueue), M_TASKQUEUE, mflags | M_ZERO); |
| 145 | if (queue == NULL) { |
| 146 | free(tq_name, M_TASKQUEUE); |
| 147 | return (NULL); |
| 148 | } |
| 149 | |
| 150 | snprintf(tq_name, TASKQUEUE_NAMELEN, "%s", (name) ? name : "taskqueue"); |
| 151 | |
| 152 | STAILQ_INIT(&queue->tq_queue); |
| 153 | LIST_INIT(&queue->tq_active); |
| 154 | queue->tq_enqueue = enqueue; |
| 155 | queue->tq_context = context; |
| 156 | queue->tq_name = tq_name; |
| 157 | queue->tq_spin = (mtxflags & MTX_SPIN) != 0; |
| 158 | queue->tq_flags |= TQ_FLAGS_ACTIVE; |
| 159 | if (enqueue == taskqueue_fast_enqueue || |
| 160 | enqueue == taskqueue_swi_enqueue || |
| 161 | enqueue == taskqueue_swi_giant_enqueue || |
| 162 | enqueue == taskqueue_thread_enqueue) |
| 163 | queue->tq_flags |= TQ_FLAGS_UNLOCKED_ENQUEUE; |
| 164 | mtx_init(&queue->tq_mutex, tq_name, NULL, mtxflags); |
| 165 | |
| 166 | return (queue); |
| 167 | } |
| 168 | |
| 169 | struct taskqueue * |
| 170 | taskqueue_create(const char *name, int mflags, |
no test coverage detected