Patchwork [bitbake-devel,17/18] toaster: clean exit on bb server shutdown

login
register
mail settings
Submitter Alexandru DAMIAN
Date March 24, 2014, 6:37 p.m.
Message ID <a9cfa3eacfc99550e1ad3f8bb61b2a0bc9b44332.1395686148.git.alexandru.damian@intel.com>
Download mbox | patch
Permalink /patch/69113/
State New
Headers show

Comments

Alexandru DAMIAN - March 24, 2014, 6:37 p.m.
From: Alexandru DAMIAN <alexandru.damian@intel.com>

This patch adds the capability to have the Toaster UI
detect when the Bitbake server exited and cleanly
trigger a clean shutdown of the system through the toaster
starting script.

Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
---
 bin/toaster            | 28 ++++++++++++++++++++++++++--
 lib/bb/ui/toasterui.py |  7 +++++--
 2 files changed, 31 insertions(+), 4 deletions(-)

Patch

diff --git a/bin/toaster b/bin/toaster
index 9c0a15f..b27f7c2 100755
--- a/bin/toaster
+++ b/bin/toaster
@@ -68,11 +68,16 @@  function addtoConfiguration()
         echo $1 >> ${BUILDDIR}/conf/$2
 }
 
+INSTOPSYSTEM=0
+
 # define the stop command
 function stop_system()
 {
+    # prevent reentry
+    if [ $INSTOPSYSTEM == 1 ]; then return; fi
+    INSTOPSYSTEM=1
     if [ -f ${BUILDDIR}/.toasterui.pid ]; then
-        kill $(< ${BUILDDIR}/.toasterui.pid )
+        kill $(< ${BUILDDIR}/.toasterui.pid ) 2>/dev/null
         rm ${BUILDDIR}/.toasterui.pid
     fi
     BBSERVER=localhost:8200 bitbake -m
@@ -80,8 +85,24 @@  function stop_system()
     webserverKillAll
     # force stop any misbehaving bitbake server
     lsof bitbake.lock | awk '{print $2}' | grep "[0-9]\+" | xargs -n1 -r kill
+    trap - SIGHUP
+    trap - SIGCHLD
+    INSTOPSYSTEM=0
+}
+
+function check_pidbyfile() {
+    [ -e $1 ] && kill -0 $(< $1) 2>/dev/null
 }
 
+
+function notify_chldexit() {
+    if [ $NOTOASTERUI == 0 ]; then
+        check_pidbyfile ${BUILDDIR}/.toasterui.pid && return
+        stop_system
+    fi
+}
+
+
 # We make sure we're running in the current shell and in a good environment
 
 if [ -z "$ZSH_NAME" ] && [ `basename \"$0\"` = `basename \"$BASH_SOURCE\"` ]; then
@@ -179,10 +200,13 @@  case $CMD in
             stop_system
             echo "Failed ${CMD}."
         fi
+        # stop system on terminal exit
+        set -o monitor
+        trap stop_system SIGHUP
+        trap notify_chldexit SIGCHLD
     ;;
     stop )
         stop_system
-        trap '' SIGHUP
         echo "Successful ${CMD}."
     ;;
 esac
diff --git a/lib/bb/ui/toasterui.py b/lib/bb/ui/toasterui.py
index 453eaf9..37d6b1a 100644
--- a/lib/bb/ui/toasterui.py
+++ b/lib/bb/ui/toasterui.py
@@ -249,6 +249,10 @@  def main(server, eventHandler, params ):
                     buildinfohelper.store_license_manifest_path(event)
                 continue
 
+            if isinstance(event, bb.cooker.CookerExit):
+                # exit when the server exits
+                break
+
             # ignore
             if isinstance(event, (bb.event.BuildBase,
                                   bb.event.StampUpdate,
@@ -258,8 +262,7 @@  def main(server, eventHandler, params ):
                                   bb.event.OperationProgress,
                                   bb.command.CommandFailed,
                                   bb.command.CommandExit,
-                                  bb.command.CommandCompleted,
-                                  bb.cooker.CookerExit)):
+                                  bb.command.CommandCompleted)):
                 continue
 
             if isinstance(event, bb.event.DepTreeGenerated):