diff options
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index b71e1d0fcb..fa7a99fba1 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -914,32 +914,32 @@ class RunQueue: | |||
| 914 | workerpipe.close() | 914 | workerpipe.close() |
| 915 | 915 | ||
| 916 | def sigchild_exception(self, *args, **kwargs): | 916 | def sigchild_exception(self, *args, **kwargs): |
| 917 | for w in [self.worker, self.fakeworker]: | 917 | pid = -1 |
| 918 | if not w: | 918 | while pid: |
| 919 | continue | ||
| 920 | try: | 919 | try: |
| 921 | pid, status = os.waitpid(w.pid, os.WNOHANG) | 920 | pid, status = os.waitpid(-1, os.WNOHANG) |
| 922 | if pid != 0 and not self.teardown: | 921 | if pid != 0 and not self.teardown: |
| 922 | name = None | ||
| 923 | if self.worker and pid == self.worker.pid: | 923 | if self.worker and pid == self.worker.pid: |
| 924 | name = "Worker" | 924 | name = "Worker" |
| 925 | elif self.fakeworker and pid == self.fakeworker.pid: | 925 | elif self.fakeworker and pid == self.fakeworker.pid: |
| 926 | name = "Fakeroot" | 926 | name = "Fakeroot" |
| 927 | else: | 927 | else: |
| 928 | name = "Unknown" | 928 | bb.warn("Unknown process (%s) exited unexpectedly (%s), shutting down..." % (pid, str(status))) |
| 929 | bb.error("%s process (%s) exited unexpectedly (%s), shutting down..." % (name, pid, str(status))) | 929 | if name and not self.teardown: |
| 930 | self.finish_runqueue(True) | 930 | bb.error("%s process (%s) exited unexpectedly (%s), shutting down..." % (name, pid, str(status))) |
| 931 | self.finish_runqueue(True) | ||
| 931 | except OSError: | 932 | except OSError: |
| 932 | pid = False | 933 | return |
| 933 | if callable(self.oldsigchld) and self.oldsigchld != self.sigchild_exception: | ||
| 934 | self.oldsigchld(*args, **kwargs) | ||
| 935 | 934 | ||
| 936 | def start_worker(self): | 935 | def start_worker(self): |
| 937 | if self.worker: | 936 | if self.worker: |
| 938 | self.teardown_workers() | 937 | self.teardown_workers() |
| 939 | self.teardown = False | 938 | self.teardown = False |
| 940 | if not self.oldsigchld: | 939 | if self.oldsigchld is None: |
| 941 | self.oldsigchld = signal.getsignal(signal.SIGCHLD) | 940 | self.oldsigchld = signal.signal(signal.SIGCHLD, self.sigchild_exception) |
| 942 | signal.signal(signal.SIGCHLD, self.sigchild_exception) | 941 | if self.oldsigchld is None: |
| 942 | self.oldsigchld = signal.SIG_DFL | ||
| 943 | self.worker, self.workerpipe = self._start_worker() | 943 | self.worker, self.workerpipe = self._start_worker() |
| 944 | 944 | ||
| 945 | def start_fakeworker(self, rqexec): | 945 | def start_fakeworker(self, rqexec): |
| @@ -948,7 +948,7 @@ class RunQueue: | |||
| 948 | 948 | ||
| 949 | def teardown_workers(self): | 949 | def teardown_workers(self): |
| 950 | self.teardown = True | 950 | self.teardown = True |
| 951 | if self.oldsigchld: | 951 | if self.oldsigchld is not None: |
| 952 | signal.signal(signal.SIGCHLD, self.oldsigchld) | 952 | signal.signal(signal.SIGCHLD, self.oldsigchld) |
| 953 | self.oldsigchld = None | 953 | self.oldsigchld = None |
| 954 | self._teardown_worker(self.worker, self.workerpipe) | 954 | self._teardown_worker(self.worker, self.workerpipe) |
