[bitbake-devel] [RFC PATCH 3/3] bitbake: uihelper.py: check event.pid is present

Robert Yang liezhi.yang at windriver.com
Tue Jul 11 10:27:48 UTC 2017


Fixed:
$ . ../poky/oe-init-build-env-memres .
$ bitbake world
In another terminal:
$ . ../poky/oe-init-build-env-memres .
Run the following command and Ctrl-C several times:
$ bitbake --observe-only
Traceback (most recent call last):
  File "/buildarea/lyang1/poky/bitbake/lib/bb/ui/knotty.py", line 441, in main
    helper.eventHandler(event)
  File "/buildarea/lyang1/poky/bitbake/lib/bb/ui/uihelper.py", line 42, in eventHandler
    del self.running_tasks[event.pid]
KeyError: 43646

This was becase the ui maybe connected at any time, so the event.pid may not be
present.

[YOCTO #11781]

Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
---
 bitbake/lib/bb/ui/uihelper.py | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

diff --git a/bitbake/lib/bb/ui/uihelper.py b/bitbake/lib/bb/ui/uihelper.py
index 113fcedeaf1..307c87e149c 100644
--- a/bitbake/lib/bb/ui/uihelper.py
+++ b/bitbake/lib/bb/ui/uihelper.py
@@ -38,29 +38,32 @@ class BBUIHelper:
                 self.running_tasks[event.pid] = { 'title' : "%s %s" % (event._package, event._task), 'starttime' : time.time() }
             self.running_pids.append(event.pid)
             self.needUpdate = True
-        elif isinstance(event, bb.build.TaskSucceeded):
-            del self.running_tasks[event.pid]
-            self.running_pids.remove(event.pid)
-            self.needUpdate = True
-        elif isinstance(event, bb.build.TaskFailedSilent):
-            del self.running_tasks[event.pid]
-            self.running_pids.remove(event.pid)
-            # Don't add to the failed tasks list since this is e.g. a setscene task failure
-            self.needUpdate = True
-        elif isinstance(event, bb.build.TaskFailed):
-            del self.running_tasks[event.pid]
-            self.running_pids.remove(event.pid)
-            self.failed_tasks.append( { 'title' : "%s %s" % (event._package, event._task)})
-            self.needUpdate = True
+        # The ui maybe connected at any time, so make sure that the
+        # event.pid is already in self.running_tasks.
+        elif getattr(event, 'pid', 'none_pid') in self.running_tasks:
+            if isinstance(event, bb.build.TaskSucceeded):
+                del self.running_tasks[event.pid]
+                self.running_pids.remove(event.pid)
+                self.needUpdate = True
+            elif isinstance(event, bb.build.TaskFailedSilent):
+                del self.running_tasks[event.pid]
+                self.running_pids.remove(event.pid)
+                # Don't add to the failed tasks list since this is e.g. a setscene task failure
+                self.needUpdate = True
+            elif isinstance(event, bb.build.TaskFailed):
+                del self.running_tasks[event.pid]
+                self.running_pids.remove(event.pid)
+                self.failed_tasks.append( { 'title' : "%s %s" % (event._package, event._task)})
+                self.needUpdate = True
+            elif isinstance(event, bb.build.TaskProgress):
+                if event.pid > 0:
+                    self.running_tasks[event.pid]['progress'] = event.progress
+                    self.running_tasks[event.pid]['rate'] = event.rate
+                    self.needUpdate = True
         elif isinstance(event, bb.runqueue.runQueueTaskStarted) or isinstance(event, bb.runqueue.sceneQueueTaskStarted):
             self.tasknumber_current = event.stats.completed + event.stats.active + event.stats.failed + 1
             self.tasknumber_total = event.stats.total
             self.needUpdate = True
-        elif isinstance(event, bb.build.TaskProgress):
-            if event.pid > 0:
-                self.running_tasks[event.pid]['progress'] = event.progress
-                self.running_tasks[event.pid]['rate'] = event.rate
-                self.needUpdate = True
 
     def getTasks(self):
         self.needUpdate = False
-- 
2.11.0




More information about the bitbake-devel mailing list