Patchwork [bitbake-devel] runqueue: Abstract the start and teardown worker functions

login
register
mail settings
Submitter Richard Purdie
Date June 7, 2013, 5:12 p.m.
Message ID <1370625150.6864.53.camel@ted>
Download mbox | patch
Permalink /patch/51351/
State New
Headers show

Comments

Richard Purdie - June 7, 2013, 5:12 p.m.
We're going to need a fakeroot/pseudo version of the worker so
abstract the code to start the worker process.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---

Patch

diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 34a123b..3e694ba 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -800,15 +800,13 @@  class RunQueue:
 
         self.rqexe = None
         self.worker = None
+        self.workerpipe = None
 
-    def start_worker(self):
-        if self.worker:
-            self.teardown_worker()
-
+    def _start_worker(self):
         logger.debug(1, "Starting bitbake-worker")
-        self.worker = subprocess.Popen(["bitbake-worker", "decafbad"], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
-        bb.utils.nonblockingfd(self.worker.stdout)
-        self.workerpipe = runQueuePipe(self.worker.stdout, None, self.cfgData, self)
+        worker = subprocess.Popen(["bitbake-worker", "decafbad"], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
+        bb.utils.nonblockingfd(worker.stdout)
+        workerpipe = runQueuePipe(worker.stdout, None, self.cfgData, None)
 
         workerdata = {
             "taskdeps" : self.rqdata.dataCache.task_deps,
@@ -825,19 +823,35 @@  class RunQueue:
             "logdefaultdomain" : bb.msg.loggerDefaultDomains,
         }
 
-        self.worker.stdin.write("<cookerconfig>" + pickle.dumps(self.cooker.configuration) + "</cookerconfig>")
-        self.worker.stdin.write("<workerdata>" + pickle.dumps(workerdata) + "</workerdata>")
-        self.worker.stdin.flush()
+        worker.stdin.write("<cookerconfig>" + pickle.dumps(self.cooker.configuration) + "</cookerconfig>")
+        worker.stdin.write("<workerdata>" + pickle.dumps(workerdata) + "</workerdata>")
+        worker.stdin.flush()
 
-    def teardown_worker(self):
+        return worker, workerpipe
+
+    def _teardown_worker(self, worker, workerpipe):
+        if not worker:
+            return
         logger.debug(1, "Teardown for bitbake-worker")
-        self.worker.stdin.write("<quit></quit>")
-        self.worker.stdin.flush()
-        while self.worker.returncode is None:
-            self.workerpipe.read()
-            self.worker.poll()
-        while self.workerpipe.read():
+        worker.stdin.write("<quit></quit>")
+        worker.stdin.flush()
+        while worker.returncode is None:
+            workerpipe.read()
+            worker.poll()
+        while workerpipe.read():
             continue
+        workerpipe.close()
+
+    def start_worker(self):
+        if self.worker:
+            self.teardown_worker()
+
+        self.worker, self.workerpipe = self._start_worker()
+
+    def teardown_worker(self):
+        self._teardown_worker(self.worker, self.workerpipe)
+        self.worker = None
+        self.workerpipe = None
 
     def check_stamp_task(self, task, taskname = None, recurse = False, cache = None):
         def get_timestamp(f):