Lines Matching refs:queue

73 #define apr_queue_full(queue) ((queue)->nelts == (queue)->bounds)  argument
79 #define apr_queue_empty(queue) ((queue)->nelts == 0) argument
87 apr_queue_t *queue = data; in queue_destroy() local
91 apr_thread_cond_destroy(queue->not_empty); in queue_destroy()
92 apr_thread_cond_destroy(queue->not_full); in queue_destroy()
93 apr_thread_mutex_destroy(queue->one_big_mutex); in queue_destroy()
106 apr_queue_t *queue; in apr_queue_create() local
107 queue = apr_palloc(a, sizeof(apr_queue_t)); in apr_queue_create()
108 *q = queue; in apr_queue_create()
111 rv = apr_thread_mutex_create(&queue->one_big_mutex, in apr_queue_create()
118 rv = apr_thread_cond_create(&queue->not_empty, a); in apr_queue_create()
123 rv = apr_thread_cond_create(&queue->not_full, a); in apr_queue_create()
129 queue->data = apr_pcalloc(a, queue_capacity * sizeof(void*)); in apr_queue_create()
130 queue->bounds = queue_capacity; in apr_queue_create()
131 queue->nelts = 0; in apr_queue_create()
132 queue->in = 0; in apr_queue_create()
133 queue->out = 0; in apr_queue_create()
134 queue->terminated = 0; in apr_queue_create()
135 queue->full_waiters = 0; in apr_queue_create()
136 queue->empty_waiters = 0; in apr_queue_create()
138 apr_pool_cleanup_register(a, queue, queue_destroy, apr_pool_cleanup_null); in apr_queue_create()
148 APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data) in apr_queue_push() argument
152 if (queue->terminated) { in apr_queue_push()
156 rv = apr_thread_mutex_lock(queue->one_big_mutex); in apr_queue_push()
161 if (apr_queue_full(queue)) { in apr_queue_push()
162 if (!queue->terminated) { in apr_queue_push()
163 queue->full_waiters++; in apr_queue_push()
164 rv = apr_thread_cond_wait(queue->not_full, queue->one_big_mutex); in apr_queue_push()
165 queue->full_waiters--; in apr_queue_push()
167 apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_push()
172 if (apr_queue_full(queue)) { in apr_queue_push()
173 Q_DBG("queue full (intr)", queue); in apr_queue_push()
174 rv = apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_push()
178 if (queue->terminated) { in apr_queue_push()
187 queue->data[queue->in] = data; in apr_queue_push()
188 queue->in++; in apr_queue_push()
189 if (queue->in >= queue->bounds) in apr_queue_push()
190 queue->in -= queue->bounds; in apr_queue_push()
191 queue->nelts++; in apr_queue_push()
193 if (queue->empty_waiters) { in apr_queue_push()
194 Q_DBG("sig !empty", queue); in apr_queue_push()
195 rv = apr_thread_cond_signal(queue->not_empty); in apr_queue_push()
197 apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_push()
202 rv = apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_push()
211 APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data) in apr_queue_trypush() argument
215 if (queue->terminated) { in apr_queue_trypush()
219 rv = apr_thread_mutex_lock(queue->one_big_mutex); in apr_queue_trypush()
224 if (apr_queue_full(queue)) { in apr_queue_trypush()
225 rv = apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_trypush()
229 queue->data[queue->in] = data; in apr_queue_trypush()
230 queue->in++; in apr_queue_trypush()
231 if (queue->in >= queue->bounds) in apr_queue_trypush()
232 queue->in -= queue->bounds; in apr_queue_trypush()
233 queue->nelts++; in apr_queue_trypush()
235 if (queue->empty_waiters) { in apr_queue_trypush()
236 Q_DBG("sig !empty", queue); in apr_queue_trypush()
237 rv = apr_thread_cond_signal(queue->not_empty); in apr_queue_trypush()
239 apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_trypush()
244 rv = apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_trypush()
251 APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue) { in apr_queue_size() argument
252 return queue->nelts; in apr_queue_size()
261 APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data) in apr_queue_pop() argument
265 if (queue->terminated) { in apr_queue_pop()
269 rv = apr_thread_mutex_lock(queue->one_big_mutex); in apr_queue_pop()
275 if (apr_queue_empty(queue)) { in apr_queue_pop()
276 if (!queue->terminated) { in apr_queue_pop()
277 queue->empty_waiters++; in apr_queue_pop()
278 rv = apr_thread_cond_wait(queue->not_empty, queue->one_big_mutex); in apr_queue_pop()
279 queue->empty_waiters--; in apr_queue_pop()
281 apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_pop()
286 if (apr_queue_empty(queue)) { in apr_queue_pop()
287 Q_DBG("queue empty (intr)", queue); in apr_queue_pop()
288 rv = apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_pop()
292 if (queue->terminated) { in apr_queue_pop()
301 *data = queue->data[queue->out]; in apr_queue_pop()
302 queue->nelts--; in apr_queue_pop()
304 queue->out++; in apr_queue_pop()
305 if (queue->out >= queue->bounds) in apr_queue_pop()
306 queue->out -= queue->bounds; in apr_queue_pop()
307 if (queue->full_waiters) { in apr_queue_pop()
308 Q_DBG("signal !full", queue); in apr_queue_pop()
309 rv = apr_thread_cond_signal(queue->not_full); in apr_queue_pop()
311 apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_pop()
316 rv = apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_pop()
325 APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data) in apr_queue_trypop() argument
329 if (queue->terminated) { in apr_queue_trypop()
333 rv = apr_thread_mutex_lock(queue->one_big_mutex); in apr_queue_trypop()
338 if (apr_queue_empty(queue)) { in apr_queue_trypop()
339 rv = apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_trypop()
343 *data = queue->data[queue->out]; in apr_queue_trypop()
344 queue->nelts--; in apr_queue_trypop()
346 queue->out++; in apr_queue_trypop()
347 if (queue->out >= queue->bounds) in apr_queue_trypop()
348 queue->out -= queue->bounds; in apr_queue_trypop()
349 if (queue->full_waiters) { in apr_queue_trypop()
350 Q_DBG("signal !full", queue); in apr_queue_trypop()
351 rv = apr_thread_cond_signal(queue->not_full); in apr_queue_trypop()
353 apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_trypop()
358 rv = apr_thread_mutex_unlock(queue->one_big_mutex); in apr_queue_trypop()
362 APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue) in apr_queue_interrupt_all() argument
365 Q_DBG("intr all", queue); in apr_queue_interrupt_all()
366 if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) { in apr_queue_interrupt_all()
369 apr_thread_cond_broadcast(queue->not_empty); in apr_queue_interrupt_all()
370 apr_thread_cond_broadcast(queue->not_full); in apr_queue_interrupt_all()
372 if ((rv = apr_thread_mutex_unlock(queue->one_big_mutex)) != APR_SUCCESS) { in apr_queue_interrupt_all()
379 APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue) in apr_queue_term() argument
383 if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) { in apr_queue_term()
391 queue->terminated = 1; in apr_queue_term()
392 if ((rv = apr_thread_mutex_unlock(queue->one_big_mutex)) != APR_SUCCESS) { in apr_queue_term()
395 return apr_queue_interrupt_all(queue); in apr_queue_term()