summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2014-03-09 17:59:53 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-03-10 11:10:02 -0700
commit5f81d9d1fa537445d5da49e12de1e16300e94552 (patch)
tree73005ec58aded042f0026872ad2dfc19800a11cb /bitbake
parent324969e9e2ed2b11e63eb31d6d8b46269a1d5dac (diff)
downloadast2050-yocto-poky-5f81d9d1fa537445d5da49e12de1e16300e94552.zip
ast2050-yocto-poky-5f81d9d1fa537445d5da49e12de1e16300e94552.tar.gz
bitbake: runqueue: Use SIGCHLD instead of polling waitpid
Instead of a significant number of calls to waitpid, register a SIGCHLD handler instead. (Bitbake rev: 76029d08ad56a0a264ff9738a0336971a455b7f5) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/runqueue.py33
1 files changed, 19 insertions, 14 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index c486c98..6650bd8 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -912,10 +912,28 @@ class RunQueue:
continue
workerpipe.close()
+ def sigchild_exception(self, signum, stackframe):
+ pid = True
+ while pid:
+ try:
+ pid, status = os.waitpid(-1, os.WNOHANG)
+ if pid != 0 and not self.teardown:
+ if self.worker and pid == self.worker.pid:
+ name = "Worker"
+ elif self.fakeworker and pid == self.fakeworker.pid:
+ name = "Fakeroot"
+ else:
+ name = "Unknown"
+ bb.error("%s process (%s) exited unexpectedly (%s), shutting down..." % (name, pid, str(status)))
+ self.finish_runqueue(True)
+ except OSError:
+ pid = False
+
def start_worker(self):
if self.worker:
self.teardown_workers()
self.teardown = False
+ signal.signal(signal.SIGCHLD, self.sigchild_exception)
self.worker, self.workerpipe = self._start_worker()
def start_fakeworker(self, rqexec):
@@ -924,6 +942,7 @@ class RunQueue:
def teardown_workers(self):
self.teardown = True
+ signal.signal(signal.SIGCHLD, signal.SIG_DFL)
self._teardown_worker(self.worker, self.workerpipe)
self.worker = None
self.workerpipe = None
@@ -2090,20 +2109,6 @@ class runQueuePipe():
self.rqexec = rqexec
def read(self):
- try:
- pid, status = os.waitpid(-1, os.WNOHANG)
- if pid != 0 and not self.rq.teardown:
- if self.rq.worker and pid == self.rq.worker.pid:
- name = "Worker"
- elif self.rq.fakeworker and pid == self.rq.fakeworker.pid:
- name = "Fakeroot"
- else:
- name = "Unknown"
- bb.error("%s process (%s) exited unexpectedly (%s), shutting down..." % (name, pid, str(status)))
- self.rq.finish_runqueue(True)
- except OSError:
- pass
-
start = len(self.queue)
try:
self.queue = self.queue + self.input.read(102400)
OpenPOWER on IntegriCloud