At Wed, 11 Jun 2014 10:53:35 +0800, Ruoyu wrote: > > Sometimes sheep process cannot exit as we expected. I think the > point might be the sequential problem by using waitpid, the > system call waiting for process to change state. > > Current log_close function calling waitpid as a void method. It > will block the main process. Suppose this situation: > > Father: --> active=false --------------------------------> waitpid > Child: -------------> active=true --> while(active) do sth. --> > > The log process will loop forever so that the main process cannot > exit. > > Therefore, it is better to retrieve the return value and pass the > nonblocking flag WNOHANG to it. Moreover, reset share memory flag > before each time calling waitpid. > > Signed-off-by: Ruoyu <lian...@ucweb.com> > --- > lib/logger.c | 26 ++++++++++++++++++++------ > 1 file changed, 20 insertions(+), 6 deletions(-)
Looks good to me. Reviewed-by: Hitoshi Mitake <mitake.hito...@lab.ntt.co.jp> Thanks, Hitoshi > > diff --git a/lib/logger.c b/lib/logger.c > index 6829f45..3815ee4 100644 > --- a/lib/logger.c > +++ b/lib/logger.c > @@ -711,13 +711,27 @@ int log_init(const char *program_name, enum > log_dst_type type, int level, > > void log_close(void) > { > - if (la) { > - la->active = false; > - waitpid(logger_pid, NULL, 0); > + pid_t pid; > + > + if (!la) > + return; > > - syslog(LOG_WARNING, "logger pid %d stopped\n", logger_pid); > - closelog(); > - free_logarea(); > + while (true) { > + la->active = false; > + pid = waitpid(logger_pid, NULL, WNOHANG); > + if (pid == 0) { > + usleep(100000); > + continue; > + } else if (pid > 0) { > + syslog(LOG_WARNING, "logger pid %d stopped\n", > + logger_pid); > + closelog(); > + free_logarea(); > + break; > + } else { > + syslog(LOG_ERR, "waitpid() failure\n"); > + exit(1); > + } > } > } > > -- > 1.8.3.2 > > > -- > sheepdog mailing list > sheepdog@lists.wpkg.org > http://lists.wpkg.org/mailman/listinfo/sheepdog -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog