---
src/haproxy.c | 22 ++++++++++++++++++----
1 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/src/haproxy.c b/src/haproxy.c
index c33c072..0187f47 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -160,6 +160,7 @@ char trash[BUFSIZE];
char *swap_buffer = NULL;
int nb_oldpids = 0;
+int nb_allocated_oldpids = 0;
const int zero = 0;
const int one = 1;
const struct linger nolinger = { .l_onoff = 1, .l_linger = 0 };
@@ -323,8 +324,20 @@ void sig_listen(struct sig_handler *sh)
*/
void sig_reaper(struct sig_handler *sh)
{
- int status;
- while(waitpid(-1, &status, WNOHANG) > 0);
+ int status, p;
+ pid_t pid;
+
+ while(1) {
+ pid = waitpid(-1, &status, WNOHANG);
+ if (pid <= 0)
+ break;
+ for (p = 0; p < nb_allocated_oldpids; p++)
+ if (oldpids[p] == pid) {
+ oldpids[p] = 0;
+ nb_oldpids--;
+ break;
+ }
+ }
}
/*
@@ -531,6 +544,7 @@ void init(int argc, char **argv)
argc--; argv++;
nb_oldpids++;
}
+ nb_allocated_oldpids = nb_oldpids;
}
}
else { /* >=2 args */
@@ -969,8 +983,8 @@ static int tell_old_pids(int sig)
{
int p;
int ret = 0;
- for (p = 0; p < nb_oldpids; p++)
- if (kill(oldpids[p], sig) == 0)
+ for (p = 0; p < nb_allocated_oldpids; p++)
+ if (oldpids[p] && kill(oldpids[p], sig) == 0)
ret++;
return ret;
}
--
1.7.2.3