* threads are waiting on an idle worker.
*/
if (queue_info->idlers < zero_pt) {
- *had_to_block = 1;
+ if (had_to_block) {
+ *had_to_block = 1;
+ }
rv = apr_thread_cond_wait(queue_info->wait_for_idler,
queue_info->idlers_mutex);
if (rv != APR_SUCCESS) {
timer_event_t **te_out)
{
fd_queue_elem_t *elem;
+ timer_event_t *te;
apr_status_t rv;
if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) {
}
}
- *te_out = NULL;
-
- if (!APR_RING_EMPTY(&queue->timers, timer_event_t, link)) {
- *te_out = APR_RING_FIRST(&queue->timers);
- APR_RING_REMOVE(*te_out, link);
+ te = NULL;
+ if (te_out) {
+ if (!APR_RING_EMPTY(&queue->timers, timer_event_t, link)) {
+ te = APR_RING_FIRST(&queue->timers);
+ APR_RING_REMOVE(te, link);
+ }
+ *te_out = te;
}
- else {
+ if (!te) {
elem = &queue->data[queue->out];
queue->out++;
if (queue->out >= queue->bounds)
queue->out -= queue->bounds;
queue->nelts--;
*sd = elem->sd;
- *baton = elem->baton;
+ if (baton) {
+ *baton = elem->baton;
+ }
*p = elem->p;
#ifdef AP_DEBUG
elem->sd = NULL;
apr_status_t ap_queue_pop_something(fd_queue_t *queue, apr_socket_t **sd,
void **baton, apr_pool_t **p,
timer_event_t **te);
+#define ap_queue_pop(q_, s_, p_) \
+ ap_queue_pop_something((q_), (s_), NULL, (p_), NULL)
apr_status_t ap_queue_interrupt_all(fd_queue_t *queue);
apr_status_t ap_queue_interrupt_one(fd_queue_t *queue);
apr_status_t ap_queue_term(fd_queue_t *queue);