void dequeue_all_listeners(void);
/* Dequeues all listeners waiting for a resource in proxy <px>'s queue */
-void dequeue_proxy_listeners(struct proxy *px);
+void dequeue_proxy_listeners(struct proxy *px, int lpx);
/* This function closes the listening socket for the specified listener,
* provided that it's already in a listening state. The listener enters the
}
}
-/* Dequeues all listeners waiting for a resource in proxy <px>'s queue */
-void dequeue_proxy_listeners(struct proxy *px)
+/* Dequeues all listeners waiting for a resource in proxy <px>'s queue
+ * The caller is responsible for indicating in lpx, whether the proxy's lock
+ * is already held (non-zero) or not (zero) so that this information can be
+ * passed to relax_listener
+*/
+void dequeue_proxy_listeners(struct proxy *px, int lpx)
{
struct listener *listener;
/* This cannot fail because the listeners are by definition in
* the LI_LIMITED state.
*/
- relax_listener(listener, 0, 0);
+ relax_listener(listener, lpx, 0);
}
}
if (p && !MT_LIST_ISEMPTY(&p->listener_queue) &&
(!p->fe_sps_lim || freq_ctr_remain(&p->fe_counters.sess_per_sec, p->fe_sps_lim, 0) > 0))
- dequeue_proxy_listeners(p);
+ dequeue_proxy_listeners(p, 0);
}
return;
if (fe && !MT_LIST_ISEMPTY(&fe->listener_queue) &&
(!fe->fe_sps_lim || freq_ctr_remain(&fe->fe_counters.sess_per_sec, fe->fe_sps_lim, 0) > 0))
- dequeue_proxy_listeners(fe);
+ dequeue_proxy_listeners(fe, 0);
else {
unsigned int wait;
int expire = TICK_ETERNITY;
}
/* The proxy is not limited so we can re-enable any waiting listener */
- dequeue_proxy_listeners(p);
+ dequeue_proxy_listeners(p, 0);
out:
t->expire = next;
task_queue(t);
}
if (px->maxconn > px->feconn)
- dequeue_proxy_listeners(px);
+ dequeue_proxy_listeners(px, 1);
HA_RWLOCK_WRUNLOCK(PROXY_LOCK, &px->lock);