---
 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


Reply via email to