diff options
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 241e387bd3..967e944963 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -869,7 +869,7 @@ class RunQueue: | |||
869 | else: | 869 | else: |
870 | worker = subprocess.Popen(["bitbake-worker", "decafbad"], stdout=subprocess.PIPE, stdin=subprocess.PIPE) | 870 | worker = subprocess.Popen(["bitbake-worker", "decafbad"], stdout=subprocess.PIPE, stdin=subprocess.PIPE) |
871 | bb.utils.nonblockingfd(worker.stdout) | 871 | bb.utils.nonblockingfd(worker.stdout) |
872 | workerpipe = runQueuePipe(worker.stdout, None, self.cfgData, rqexec) | 872 | workerpipe = runQueuePipe(worker.stdout, None, self.cfgData, self, rqexec) |
873 | 873 | ||
874 | workerdata = { | 874 | workerdata = { |
875 | "taskdeps" : self.rqdata.dataCache.task_deps, | 875 | "taskdeps" : self.rqdata.dataCache.task_deps, |
@@ -912,6 +912,7 @@ class RunQueue: | |||
912 | def start_worker(self): | 912 | def start_worker(self): |
913 | if self.worker: | 913 | if self.worker: |
914 | self.teardown_workers() | 914 | self.teardown_workers() |
915 | self.teardown = False | ||
915 | self.worker, self.workerpipe = self._start_worker() | 916 | self.worker, self.workerpipe = self._start_worker() |
916 | 917 | ||
917 | def start_fakeworker(self, rqexec): | 918 | def start_fakeworker(self, rqexec): |
@@ -919,6 +920,7 @@ class RunQueue: | |||
919 | self.fakeworker, self.fakeworkerpipe = self._start_worker(True, rqexec) | 920 | self.fakeworker, self.fakeworkerpipe = self._start_worker(True, rqexec) |
920 | 921 | ||
921 | def teardown_workers(self): | 922 | def teardown_workers(self): |
923 | self.teardown = True | ||
922 | self._teardown_worker(self.worker, self.workerpipe) | 924 | self._teardown_worker(self.worker, self.workerpipe) |
923 | self.worker = None | 925 | self.worker = None |
924 | self.workerpipe = None | 926 | self.workerpipe = None |
@@ -2067,7 +2069,7 @@ class runQueuePipe(): | |||
2067 | """ | 2069 | """ |
2068 | Abstraction for a pipe between a worker thread and the server | 2070 | Abstraction for a pipe between a worker thread and the server |
2069 | """ | 2071 | """ |
2070 | def __init__(self, pipein, pipeout, d, rq): | 2072 | def __init__(self, pipein, pipeout, d, rq, rqexec): |
2071 | self.input = pipein | 2073 | self.input = pipein |
2072 | if pipeout: | 2074 | if pipeout: |
2073 | pipeout.close() | 2075 | pipeout.close() |
@@ -2075,11 +2077,26 @@ class runQueuePipe(): | |||
2075 | self.queue = "" | 2077 | self.queue = "" |
2076 | self.d = d | 2078 | self.d = d |
2077 | self.rq = rq | 2079 | self.rq = rq |
2080 | self.rqexec = rqexec | ||
2078 | 2081 | ||
2079 | def setrunqueueexec(self, rq): | 2082 | def setrunqueueexec(self, rqexec): |
2080 | self.rq = rq | 2083 | self.rqexec = rqexec |
2081 | 2084 | ||
2082 | def read(self): | 2085 | def read(self): |
2086 | try: | ||
2087 | pid, status = os.waitpid(-1, os.WNOHANG) | ||
2088 | if pid != 0 and not self.rq.teardown: | ||
2089 | if self.rq.worker and pid == self.rq.worker.pid: | ||
2090 | name = "Worker" | ||
2091 | elif self.rq.fakeworker and pid == self.rq.fakeworker.pid: | ||
2092 | name = "Fakeroot" | ||
2093 | else: | ||
2094 | name = "Unknown" | ||
2095 | bb.error("%s process (%s) exited unexpectedly (%s), shutting down..." % (name, pid, str(status))) | ||
2096 | self.rq.finish_runqueue(True) | ||
2097 | except OSError: | ||
2098 | pass | ||
2099 | |||
2083 | start = len(self.queue) | 2100 | start = len(self.queue) |
2084 | try: | 2101 | try: |
2085 | self.queue = self.queue + self.input.read(102400) | 2102 | self.queue = self.queue + self.input.read(102400) |
@@ -2106,7 +2123,7 @@ class runQueuePipe(): | |||
2106 | task, status = pickle.loads(self.queue[10:index]) | 2123 | task, status = pickle.loads(self.queue[10:index]) |
2107 | except ValueError as e: | 2124 | except ValueError as e: |
2108 | bb.msg.fatal("RunQueue", "failed load pickle '%s': '%s'" % (e, self.queue[10:index])) | 2125 | bb.msg.fatal("RunQueue", "failed load pickle '%s': '%s'" % (e, self.queue[10:index])) |
2109 | self.rq.runqueue_process_waitpid(task, status) | 2126 | self.rqexec.runqueue_process_waitpid(task, status) |
2110 | found = True | 2127 | found = True |
2111 | self.queue = self.queue[index+11:] | 2128 | self.queue = self.queue[index+11:] |
2112 | index = self.queue.find("</exitcode>") | 2129 | index = self.queue.find("</exitcode>") |