Lines Matching full:q
24 obj2node(bqueue_t *q, void *data) in obj2node() argument
26 return ((bqueue_node_t *)((char *)data + q->bq_node_offset)); in obj2node()
53 bqueue_init(bqueue_t *q, uint_t fill_fraction, size_t size, size_t node_offset) in bqueue_init() argument
58 list_create(&q->bq_list, node_offset + sizeof (bqueue_node_t), in bqueue_init()
60 list_create(&q->bq_dequeuing_list, node_offset + sizeof (bqueue_node_t), in bqueue_init()
62 list_create(&q->bq_enqueuing_list, node_offset + sizeof (bqueue_node_t), in bqueue_init()
64 cv_init(&q->bq_add_cv, NULL, CV_DEFAULT, NULL); in bqueue_init()
65 cv_init(&q->bq_pop_cv, NULL, CV_DEFAULT, NULL); in bqueue_init()
66 mutex_init(&q->bq_lock, NULL, MUTEX_DEFAULT, NULL); in bqueue_init()
67 q->bq_node_offset = node_offset; in bqueue_init()
68 q->bq_size = 0; in bqueue_init()
69 q->bq_dequeuing_size = 0; in bqueue_init()
70 q->bq_enqueuing_size = 0; in bqueue_init()
71 q->bq_maxsize = size; in bqueue_init()
72 q->bq_fill_fraction = fill_fraction; in bqueue_init()
82 bqueue_destroy(bqueue_t *q) in bqueue_destroy() argument
84 mutex_enter(&q->bq_lock); in bqueue_destroy()
85 ASSERT0(q->bq_size); in bqueue_destroy()
86 ASSERT0(q->bq_dequeuing_size); in bqueue_destroy()
87 ASSERT0(q->bq_enqueuing_size); in bqueue_destroy()
88 cv_destroy(&q->bq_add_cv); in bqueue_destroy()
89 cv_destroy(&q->bq_pop_cv); in bqueue_destroy()
90 list_destroy(&q->bq_list); in bqueue_destroy()
91 list_destroy(&q->bq_dequeuing_list); in bqueue_destroy()
92 list_destroy(&q->bq_enqueuing_list); in bqueue_destroy()
93 mutex_exit(&q->bq_lock); in bqueue_destroy()
94 mutex_destroy(&q->bq_lock); in bqueue_destroy()
98 bqueue_enqueue_impl(bqueue_t *q, void *data, size_t item_size, boolean_t flush) in bqueue_enqueue_impl() argument
101 ASSERT3U(item_size, <=, q->bq_maxsize); in bqueue_enqueue_impl()
103 obj2node(q, data)->bqn_size = item_size; in bqueue_enqueue_impl()
104 q->bq_enqueuing_size += item_size; in bqueue_enqueue_impl()
105 list_insert_tail(&q->bq_enqueuing_list, data); in bqueue_enqueue_impl()
108 q->bq_enqueuing_size >= q->bq_maxsize / q->bq_fill_fraction) { in bqueue_enqueue_impl()
110 mutex_enter(&q->bq_lock); in bqueue_enqueue_impl()
111 while (q->bq_size > q->bq_maxsize) { in bqueue_enqueue_impl()
112 cv_wait_sig(&q->bq_add_cv, &q->bq_lock); in bqueue_enqueue_impl()
114 q->bq_size += q->bq_enqueuing_size; in bqueue_enqueue_impl()
115 list_move_tail(&q->bq_list, &q->bq_enqueuing_list); in bqueue_enqueue_impl()
116 q->bq_enqueuing_size = 0; in bqueue_enqueue_impl()
117 cv_broadcast(&q->bq_pop_cv); in bqueue_enqueue_impl()
118 mutex_exit(&q->bq_lock); in bqueue_enqueue_impl()
123 * Add data to q, consuming size units of capacity. If there is insufficient
128 bqueue_enqueue(bqueue_t *q, void *data, size_t item_size) in bqueue_enqueue() argument
130 bqueue_enqueue_impl(q, data, item_size, B_FALSE); in bqueue_enqueue()
142 bqueue_enqueue_flush(bqueue_t *q, void *data, size_t item_size) in bqueue_enqueue_flush() argument
144 bqueue_enqueue_impl(q, data, item_size, B_TRUE); in bqueue_enqueue_flush()
148 * Take the first element off of q. If there are no elements on the queue, wait
152 bqueue_dequeue(bqueue_t *q) in bqueue_dequeue() argument
154 void *ret = list_remove_head(&q->bq_dequeuing_list); in bqueue_dequeue()
161 mutex_enter(&q->bq_lock); in bqueue_dequeue()
162 while (q->bq_size == 0) { in bqueue_dequeue()
163 cv_wait_sig(&q->bq_pop_cv, &q->bq_lock); in bqueue_dequeue()
165 ASSERT0(q->bq_dequeuing_size); in bqueue_dequeue()
166 ASSERT(list_is_empty(&q->bq_dequeuing_list)); in bqueue_dequeue()
167 list_move_tail(&q->bq_dequeuing_list, &q->bq_list); in bqueue_dequeue()
168 q->bq_dequeuing_size = q->bq_size; in bqueue_dequeue()
169 q->bq_size = 0; in bqueue_dequeue()
170 cv_broadcast(&q->bq_add_cv); in bqueue_dequeue()
171 mutex_exit(&q->bq_lock); in bqueue_dequeue()
172 ret = list_remove_head(&q->bq_dequeuing_list); in bqueue_dequeue()
174 q->bq_dequeuing_size -= obj2node(q, ret)->bqn_size; in bqueue_dequeue()