diff options
-rw-r--r-- | pttbbs/daemon/logind/logind.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/pttbbs/daemon/logind/logind.c b/pttbbs/daemon/logind/logind.c index a93f0f2b..3f9cd995 100644 --- a/pttbbs/daemon/logind/logind.c +++ b/pttbbs/daemon/logind/logind.c @@ -44,6 +44,10 @@ #define LOGIND_MAX_FDS (100000) #endif +#ifndef LOGIND_ACKQUEUE_BOUND +#define LOGIND_ACKQUEUE_BOUND (255) +#endif + #define MY_EVENT_PRIORITY_NUMBERS (4) #define EVTPRIORITY_NORM (MY_EVENT_PRIORITY_NUMBERS/2) #define EVTPRIORITY_ACK (EVTPRIORITY_NORM-1) @@ -365,6 +369,12 @@ ackq_gc() g_ack_queue.reuse = g_ack_queue.size = 0; } +static ssize_t +ackq_size() +{ + return g_ack_queue.size - g_ack_queue.reuse; +} + static void ackq_add(login_conn_ctx *ctx) { @@ -1275,7 +1285,8 @@ auth_start(int fd, login_conn_ctx *conn) draw_auth_success(conn, isfree); - if (!start_service(fd, conn)) + if (ackq_size() > LOGIND_ACKQUEUE_BOUND || + !start_service(fd, conn)) { // too bad, we can't start service. retry_service(); |