diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-19 17:44:39 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-19 17:46:33 +0000 |
commit | 49aad7da07e187f206e963001844605731b01247 (patch) | |
tree | a019fc9b60ba839bccb143be6e7f268319641881 /bitbake/lib/bb | |
parent | 99913df3039665816ca506be4112913a1eca8e88 (diff) | |
download | poky-49aad7da07e187f206e963001844605731b01247.tar.gz |
bitbake: runqueue: Remove use of waitpid on worker processes
Use of waitpid on the worker processes is a bad idea since it conflicts
directly with subprocess internals. Instead use the poll() method
and returncode to determine if the process has exitted, if it has,
we can shut down the system.
This should resolve the hangs once and for all, famous last words.
(Bitbake rev: 60969cd62e21e7d4af161bf8504b7643a879c73f)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index e62bb5232f..dbb334c55f 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -2090,22 +2090,18 @@ class runQueuePipe(): | |||
2090 | self.rqexec = rqexec | 2090 | self.rqexec = rqexec |
2091 | 2091 | ||
2092 | def read(self): | 2092 | def read(self): |
2093 | try: | 2093 | for w in [self.rq.worker, self.rq.fakeworker]: |
2094 | for w in [self.rq.worker, self.rq.fakeworker]: | 2094 | if not w: |
2095 | if not w: | 2095 | continue |
2096 | continue | 2096 | w.poll() |
2097 | pid, status = os.waitpid(w.pid, os.WNOHANG) | 2097 | if w.returncode is not None and not self.rq.teardown: |
2098 | if pid != 0 and not self.rq.teardown: | 2098 | name = None |
2099 | if self.rq.worker and pid == self.rq.worker.pid: | 2099 | if self.rq.worker and w.pid == self.rq.worker.pid: |
2100 | name = "Worker" | 2100 | name = "Worker" |
2101 | elif self.rq.fakeworker and pid == self.rq.fakeworker.pid: | 2101 | elif self.rq.fakeworker and w.pid == self.rq.fakeworker.pid: |
2102 | name = "Fakeroot" | 2102 | name = "Fakeroot" |
2103 | else: | 2103 | bb.error("%s process (%s) exited unexpectedly (%s), shutting down..." % (name, w.pid, str(w.returncode))) |
2104 | name = "Unknown" | 2104 | self.rq.finish_runqueue(True) |
2105 | bb.error("%s process (%s) exited unexpectedly (%s), shutting down..." % (name, pid, str(status))) | ||
2106 | self.rq.finish_runqueue(True) | ||
2107 | except OSError: | ||
2108 | pass | ||
2109 | 2105 | ||
2110 | start = len(self.queue) | 2106 | start = len(self.queue) |
2111 | try: | 2107 | try: |