diff --git a/include/types/global.h b/include/types/global.h index 0a6ece71f..37fbaca59 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -170,7 +170,7 @@ extern int pid; /* current process id */ extern int relative_pid; /* process id starting at 1 */ extern int actconn; /* # of active sessions */ extern int listeners; -extern int jobs; /* # of active jobs */ +extern int jobs; /* # of active jobs (listeners, sessions, open devices) */ extern struct chunk trash; extern int nb_oldpids; /* contains the number of old pids found */ extern const int zero; diff --git a/src/listener.c b/src/listener.c index 47bed179e..d193b511a 100644 --- a/src/listener.c +++ b/src/listener.c @@ -343,8 +343,9 @@ int create_listeners(struct bind_conf *bc, const struct sockaddr_storage *ss, /* Delete a listener from its protocol's list of listeners. The listener's * state is automatically updated from LI_ASSIGNED to LI_INIT. The protocol's - * number of listeners is updated. Note that the listener must have previously - * been unbound. This is the generic function to use to remove a listener. + * number of listeners is updated, as well as the global number of listeners + * and jobs. Note that the listener must have previously been unbound. This + * is the generic function to use to remove a listener. */ void delete_listener(struct listener *listener) { @@ -353,6 +354,8 @@ void delete_listener(struct listener *listener) listener->state = LI_INIT; LIST_DEL(&listener->proto_list); listener->proto->nb_listeners--; + listeners--; + jobs--; } /* This function is called on a read event from a listening socket, corresponding diff --git a/src/proxy.c b/src/proxy.c index 0bbce62c8..ec1f60a9e 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1080,8 +1080,6 @@ void zombify_proxy(struct proxy *p) unbind_listener_no_close(l); if (l->state >= LI_ASSIGNED) { delete_listener(l); - listeners--; - jobs--; } /* * Pretend we're still up and running so that the fd @@ -1120,8 +1118,6 @@ void stop_proxy(struct proxy *p) unbind_listener(l); if (l->state >= LI_ASSIGNED) { delete_listener(l); - listeners--; - jobs--; } } p->state = PR_STSTOPPED;