Modified: trunk/patches/nagios_defunct_reload_workers.patch
===================================================================
--- trunk/patches/nagios_defunct_reload_workers.patch 2014-05-20 11:03:37 UTC (rev 451)
+++ trunk/patches/nagios_defunct_reload_workers.patch 2014-05-20 11:31:15 UTC (rev 452)
@@ -1,11 +1,30 @@
-diff -ur nagios-4.0.20130912.orig/base/workers.c nagios-4.0.20130912/base/workers.c
---- nagios-4.0.20130912.orig/base/workers.c 2014-05-19 15:17:50.000000000 +0000
-+++ nagios-4.0.20130912/base/workers.c 2014-05-19 16:27:00.000000000 +0000
-@@ -353,6 +353,8 @@
+diff -ur nagios-4.0.20130912.orig//base/workers.c nagios-4.0.20130912//base/workers.c
+--- nagios-4.0.20130912.orig//base/workers.c 2014-05-20 11:01:42.000000000 +0000
++++ nagios-4.0.20130912//base/workers.c 2014-05-20 11:30:03.000000000 +0000
+@@ -323,6 +323,7 @@
+ static int wproc_destroy(struct wproc_worker *wp, int flags)
+ {
+ int i = 0, force = 0, self;
++ struct timespec nsleep = {0};
+ if (!wp)
+ return 0;
+@@ -353,6 +354,19 @@
+
iobroker_close(nagios_iobs, wp->sd);
-+ sleep(1);
++ if (wp->pid) {
++ alarm(1);
++ if ( waitpid(wp->pid, &i, 0) == wp->pid ) {
++ alarm(0);
++ } else {
++ alarm(0);
++ kill(wp->pid, SIGKILL); // try again
++ }
++ } else {
++ nsleep.tv_nsec = 500000000L; /* 0.5s */
++ nanosleep(&nsleep, NULL);
++ }
+
/* reap our possibly lost children */
while (waitpid(-1, &i, WNOHANG) > 0)