Added code to reap childs killed by supervisor.

git-svn-id: http://yate.null.ro/svn/yate/trunk@89 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2004-10-21 14:14:50 +00:00
parent bf0a218455
commit aa926e22b6
1 changed files with 9 additions and 6 deletions

View File

@ -49,7 +49,7 @@ using namespace TelEngine;
#define DLL_SUFFIX ".yate"
#define CFG_SUFFIX ".conf"
#define MAX_SANITY 8
#define MAX_SANITY 5
static unsigned long long s_nextinit = 0;
static bool s_makeworker = true;
@ -446,7 +446,7 @@ static int supervise(void)
}
::close(wdogfd[1]);
// Wait for the child to die or block
for (int sanity = MAX_SANITY/2; sanity > 0; sanity--) {
for (int sanity = MAX_SANITY; sanity > 0; sanity--) {
int status = -1;
int tmp = ::waitpid(s_childpid,&status,WNOHANG);
if (tmp > 0) {
@ -463,17 +463,17 @@ static int supervise(void)
break;
}
char buf[8];
char buf[MAX_SANITY];
tmp = ::read(wdogfd[0],buf,sizeof(buf));
if (tmp >= 0) {
// Add one sanity point every second
// Timer messages add one sanity point every second
sanity += tmp;
if (sanity > MAX_SANITY)
sanity = MAX_SANITY;
}
else if ((errno != EINTR) && (errno != EAGAIN))
break;
// Consume sanity points slighly slower
// Consume sanity points slighly slower than added
::usleep(1200000);
}
::close(wdogfd[0]);
@ -481,9 +481,12 @@ static int supervise(void)
// Child failed to proof sanity. Kill it - noo need to be gentle.
::fprintf(stderr,"Supervisor: killing unresponsive child %d\n",s_childpid);
::kill(s_childpid,SIGKILL);
::usleep(10000);
::waitpid(s_childpid,0,WNOHANG);
s_childpid = -1;
::usleep(100000);
}
if (s_runagain)
::usleep(1000000);
}
::fprintf(stderr,"Supervisor (%d) exiting with code %d\n",::getpid(),retcode);
return retcode;