| 78 | } |
| 79 | |
| 80 | static void |
| 81 | bqueue_enqueue_impl(bqueue_t *q, void *data, uint64_t item_size, |
| 82 | boolean_t flush) |
| 83 | { |
| 84 | ASSERT3U(item_size, >, 0); |
| 85 | ASSERT3U(item_size, <=, q->bq_maxsize); |
| 86 | mutex_enter(&q->bq_lock); |
| 87 | obj2node(q, data)->bqn_size = item_size; |
| 88 | while (q->bq_size + item_size > q->bq_maxsize) { |
| 89 | cv_wait_sig(&q->bq_add_cv, &q->bq_lock); |
| 90 | } |
| 91 | q->bq_size += item_size; |
| 92 | list_insert_tail(&q->bq_list, data); |
| 93 | if (q->bq_size >= q->bq_maxsize / q->bq_fill_fraction) |
| 94 | cv_signal(&q->bq_pop_cv); |
| 95 | if (flush) |
| 96 | cv_broadcast(&q->bq_pop_cv); |
| 97 | mutex_exit(&q->bq_lock); |
| 98 | } |
| 99 | |
| 100 | /* |
| 101 | * Add data to q, consuming size units of capacity. If there is insufficient |
no test coverage detected