[MINOR] listeners: add listen_full() to mark a listener full
This is just a cleanup which removes calls to EV_FD_CLR() and state
setting everywhere in the code.
diff --git a/include/proto/protocols.h b/include/proto/protocols.h
index e0d6ee4..354a4e9 100644
--- a/include/proto/protocols.h
+++ b/include/proto/protocols.h
@@ -51,6 +51,11 @@
*/
int resume_listener(struct listener *l);
+/* Marks a ready listener as full so that the session code tries to re-enable
+ * it upon next close() using resume_listener().
+ */
+void listener_full(struct listener *l);
+
/* This function adds all of the protocol's listener's file descriptors to the
* polling lists when they are in the LI_LISTEN state. It is intended to be
* used as a protocol's generic enable_all() primitive, for use after the
diff --git a/src/protocols.c b/src/protocols.c
index 49e7eaa..7d8913d 100644
--- a/src/protocols.c
+++ b/src/protocols.c
@@ -106,6 +106,17 @@
return 1;
}
+/* Marks a ready listener as full so that the session code tries to re-enable
+ * it upon next close() using resume_listener().
+ */
+void listener_full(struct listener *l)
+{
+ if (l->state >= LI_READY) {
+ EV_FD_CLR(l->fd, DIR_RD);
+ l->state = LI_FULL;
+ }
+}
+
/* This function adds all of the protocol's listener's file descriptors to the
* polling lists when they are in the LI_LISTEN state. It is intended to be
* used as a protocol's generic enable_all() primitive, for use after the
diff --git a/src/session.c b/src/session.c
index e5ac4ee..6e718c0 100644
--- a/src/session.c
+++ b/src/session.c
@@ -32,6 +32,7 @@
#include <proto/log.h>
#include <proto/session.h>
#include <proto/pipe.h>
+#include <proto/protocols.h>
#include <proto/proto_http.h>
#include <proto/proto_tcp.h>
#include <proto/proxy.h>
@@ -2088,12 +2089,8 @@
actconn--;
jobs--;
s->listener->nbconn--;
- if (s->listener->state == LI_FULL &&
- s->listener->nbconn < s->listener->maxconn) {
- /* we should reactivate the listener */
- EV_FD_SET(s->listener->fd, DIR_RD);
- s->listener->state = LI_READY;
- }
+ if (s->listener->state == LI_FULL)
+ resume_listener(s->listener);
if (unlikely((global.mode & MODE_DEBUG) &&
(!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {
diff --git a/src/stream_sock.c b/src/stream_sock.c
index c5cd1e5..10e13cb 100644
--- a/src/stream_sock.c
+++ b/src/stream_sock.c
@@ -1194,8 +1194,7 @@
int ret;
if (unlikely(l->nbconn >= l->maxconn)) {
- EV_FD_CLR(l->fd, DIR_RD);
- l->state = LI_FULL;
+ listener_full(l);
return 0;
}
@@ -1221,20 +1220,16 @@
send_log(p, LOG_EMERG,
"Proxy %s reached system FD limit at %d. Please check system tunables.\n",
p->id, maxfd);
- if (l->nbconn) {
- EV_FD_CLR(l->fd, DIR_RD);
- l->state = LI_FULL;
- }
+ if (l->nbconn)
+ listener_full(l);
return 0;
case EMFILE:
if (p)
send_log(p, LOG_EMERG,
"Proxy %s reached process FD limit at %d. Please check 'ulimit-n' and restart.\n",
p->id, maxfd);
- if (l->nbconn) {
- EV_FD_CLR(l->fd, DIR_RD);
- l->state = LI_FULL;
- }
+ if (l->nbconn)
+ listener_full(l);
return 0;
case ENOBUFS:
case ENOMEM:
@@ -1242,10 +1237,8 @@
send_log(p, LOG_EMERG,
"Proxy %s reached system memory limit at %d sockets. Please check system tunables.\n",
p->id, maxfd);
- if (l->nbconn) {
- EV_FD_CLR(l->fd, DIR_RD);
- l->state = LI_FULL;
- }
+ if (l->nbconn)
+ listener_full(l);
return 0;
default:
return 0;
@@ -1291,10 +1284,10 @@
}
if (l->nbconn >= l->maxconn) {
- EV_FD_CLR(l->fd, DIR_RD);
- l->state = LI_FULL;
+ listener_full(l);
return 0;
}
+
} /* end of while (p->feconn < p->maxconn) */
return 0;
}