summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pttbbs/daemon/logind/logind.c13
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();