* Take the first element off of q. If there are no elements on the queue, wait * until one is put there. Return the removed element. */
| 127 | * until one is put there. Return the removed element. |
| 128 | */ |
| 129 | void * |
| 130 | bqueue_dequeue(bqueue_t *q) |
| 131 | { |
| 132 | void *ret = NULL; |
| 133 | uint64_t item_size; |
| 134 | mutex_enter(&q->bq_lock); |
| 135 | while (q->bq_size == 0) { |
| 136 | cv_wait_sig(&q->bq_pop_cv, &q->bq_lock); |
| 137 | } |
| 138 | ret = list_remove_head(&q->bq_list); |
| 139 | ASSERT3P(ret, !=, NULL); |
| 140 | item_size = obj2node(q, ret)->bqn_size; |
| 141 | q->bq_size -= item_size; |
| 142 | if (q->bq_size <= q->bq_maxsize - (q->bq_maxsize / q->bq_fill_fraction)) |
| 143 | cv_signal(&q->bq_add_cv); |
| 144 | mutex_exit(&q->bq_lock); |
| 145 | return (ret); |
| 146 | } |
| 147 | |
| 148 | /* |
| 149 | * Returns true if the space used is 0. |
no test coverage detected