From: Richard Purdie <richard.purdie@linuxfoundation.org>
To: bitbake-devel <bitbake-devel@lists.openembedded.org>
Subject: [PATCH] runqueue: Really fix sigchld handling
Date: Tue, 18 Mar 2014 22:58:52 +0000 [thread overview]
Message-ID: <1395183532.3808.99.camel@ted> (raw)
There are several problems. Firstly, a return value of "None" can mean
there is a C signal handler installed so we need to better handle that
case. signal.SIG_DFL is 0 which equates to false so we also need to
handle that by testing explicitly for None.
Finally, the signal handler *must* call waitpid on all child processes
else it will just get called repeatedly, leading to the hanging behaviour
we've been seeing. The solution is to only error for the worker children,
we warn about any other stray children which we'll have to figure out the
sources of in due course.
Hopefully this patch gets things working again properly though.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 055db48..3ab5439 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -914,32 +914,32 @@ class RunQueue:
workerpipe.close()
def sigchild_exception(self, *args, **kwargs):
- for w in [self.worker, self.fakeworker]:
- if not w:
- continue
+ pid = -1
+ while pid:
try:
- pid, status = os.waitpid(w.pid, os.WNOHANG)
+ pid, status = os.waitpid(-1, os.WNOHANG)
if pid != 0 and not self.teardown:
+ name = None
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)
+ bb.warn("Unknown process (%s) exited unexpectedly (%s), shutting down..." % (pid, str(status)))
+ if name and not self.teardown:
+ bb.error("%s process (%s) exited unexpectedly (%s), shutting down..." % (name, pid, str(status)))
+ self.finish_runqueue(True)
except OSError:
- pid = False
- if callable(self.oldsigchld):
- self.oldsigchld(*args, **kwargs)
+ return
def start_worker(self):
if self.worker:
self.teardown_workers()
self.teardown = False
- if not self.oldsigchld:
- self.oldsigchld = signal.getsignal(signal.SIGCHLD)
- signal.signal(signal.SIGCHLD, self.sigchild_exception)
+ if self.oldsigchld is None:
+ self.oldsigchld = signal.signal(signal.SIGCHLD, self.sigchild_exception)
+ if self.oldsigchld is None:
+ self.oldsigchld = signal.SIG_DFL
self.worker, self.workerpipe = self._start_worker()
def start_fakeworker(self, rqexec):
@@ -948,7 +948,7 @@ class RunQueue:
def teardown_workers(self):
self.teardown = True
- if self.oldsigchld:
+ if self.oldsigchld is not None:
signal.signal(signal.SIGCHLD, self.oldsigchld)
self.oldsigchld = None
self._teardown_worker(self.worker, self.workerpipe)
next reply other threads:[~2014-03-18 22:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-18 22:58 Richard Purdie [this message]
2014-03-19 21:30 ` [PATCH] runqueue: Really fix sigchld handling Chris Larson
2014-03-19 21:40 ` Richard Purdie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1395183532.3808.99.camel@ted \
--to=richard.purdie@linuxfoundation.org \
--cc=bitbake-devel@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.