]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
bitbake: runqueue: Use SIGCHLD instead of polling waitpid
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 10 Mar 2014 00:59:53 +0000 (17:59 -0700)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 10 Mar 2014 18:10:02 +0000 (11:10 -0700)
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>
bitbake/lib/bb/runqueue.py

index c486c988e2d5608d54b135e7b66bbc1330ac00c8..6650bd86376c209014f547ffdc3a76da017667d8 100644 (file)
@@ -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)