}
struct task *accept_queue_process(struct task *t, void *context, unsigned short state);
+struct task *manage_global_listener_queue(struct task *t, void *context, unsigned short state);
extern struct accept_queue_ring accept_queue_rings[MAX_THREADS] __attribute__((aligned(64)));
/* list of the temporarily limited listeners because of lack of resource */
static struct mt_list global_listener_queue = MT_LIST_HEAD_INIT(global_listener_queue);
static struct task *global_listener_queue_task;
-static struct task *manage_global_listener_queue(struct task *t, void *context, unsigned short state);
#if defined(USE_THREAD)
/* This is the global management task for listeners. It enables listeners waiting
* for global resources when there are enough free resource, or at least once in
- * a while. It is designed to be called as a task.
+ * a while. It is designed to be called as a task. It's exported so that it's easy
+ * to spot in "show tasks" or "show profiling".
*/
-static struct task *manage_global_listener_queue(struct task *t, void *context, unsigned short state)
+struct task *manage_global_listener_queue(struct task *t, void *context, unsigned short state)
{
/* If there are still too many concurrent connections, let's wait for
* some of them to go away. We don't need to re-arm the timer because
{ .func = sock_conn_iocb, .name = "sock_conn_iocb" },
{ .func = dgram_fd_handler, .name = "dgram_fd_handler" },
{ .func = listener_accept, .name = "listener_accept" },
+ { .func = manage_global_listener_queue, .name = "manage_global_listener_queue" },
{ .func = poller_pipe_io_handler, .name = "poller_pipe_io_handler" },
{ .func = mworker_accept_wrapper, .name = "mworker_accept_wrapper" },
{ .func = session_expire_embryonic, .name = "session_expire_embryonic" },