diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-18 10:21:34 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-18 10:23:13 +0000 |
commit | 6bbb179cc526c86631dfcb140e3dd51a8c07a52d (patch) | |
tree | 00f4d0abd45e85e5729a74fbb283bc22797ee11f /bitbake | |
parent | 1f16ca9fba325f5ddbb1edad5bbad78d990de5e0 (diff) | |
download | poky-6bbb179cc526c86631dfcb140e3dd51a8c07a52d.tar.gz |
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 <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 3c72b60f50..e8dfb394cd 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -937,8 +937,9 @@ class RunQueue: | |||
937 | if self.worker: | 937 | if self.worker: |
938 | self.teardown_workers() | 938 | self.teardown_workers() |
939 | self.teardown = False | 939 | self.teardown = False |
940 | self.oldsigchld = signal.getsignal(signal.SIGCHLD) | 940 | if not self.oldsigchld: |
941 | signal.signal(signal.SIGCHLD, self.sigchild_exception) | 941 | self.oldsigchld = signal.getsignal(signal.SIGCHLD) |
942 | signal.signal(signal.SIGCHLD, self.sigchild_exception) | ||
942 | self.worker, self.workerpipe = self._start_worker() | 943 | self.worker, self.workerpipe = self._start_worker() |
943 | 944 | ||
944 | def start_fakeworker(self, rqexec): | 945 | def start_fakeworker(self, rqexec): |
@@ -949,6 +950,7 @@ class RunQueue: | |||
949 | self.teardown = True | 950 | self.teardown = True |
950 | if self.oldsigchld: | 951 | if self.oldsigchld: |
951 | signal.signal(signal.SIGCHLD, self.oldsigchld) | 952 | signal.signal(signal.SIGCHLD, self.oldsigchld) |
953 | self.oldsigchld = None | ||
952 | self._teardown_worker(self.worker, self.workerpipe) | 954 | self._teardown_worker(self.worker, self.workerpipe) |
953 | self.worker = None | 955 | self.worker = None |
954 | self.workerpipe = None | 956 | self.workerpipe = None |