From: Richard Purdie Date: Tue, 18 Mar 2014 10:21:34 +0000 (+0000) Subject: bitbake: runqueue: More carefully handle the sigchld handler X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6bbb179cc526c86631dfcb140e3dd51a8c07a52d;p=thirdparty%2Fopenembedded%2Fopenembedded-core-contrib.git bitbake: runqueue: More carefully handle the sigchld handler We've noticed hanging processes which appear to be looping around waitpid. Its possible multiple calls to teardown are causing problem or in theory multiple registrations (although the code should not allow that). Regardless, put better guards around signal handler registration. (Bitbake rev: 79acfb0853aa3215215cee89a945f8e97b0a8fae) Signed-off-by: Richard Purdie --- diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 3c72b60f505..e8dfb394cdc 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py @@ -937,8 +937,9 @@ class RunQueue: if self.worker: self.teardown_workers() self.teardown = False - self.oldsigchld = signal.getsignal(signal.SIGCHLD) - signal.signal(signal.SIGCHLD, self.sigchild_exception) + if not self.oldsigchld: + self.oldsigchld = signal.getsignal(signal.SIGCHLD) + signal.signal(signal.SIGCHLD, self.sigchild_exception) self.worker, self.workerpipe = self._start_worker() def start_fakeworker(self, rqexec): @@ -949,6 +950,7 @@ class RunQueue: self.teardown = True if self.oldsigchld: signal.signal(signal.SIGCHLD, self.oldsigchld) + self.oldsigchld = None self._teardown_worker(self.worker, self.workerpipe) self.worker = None self.workerpipe = None