summaryrefslogtreecommitdiffstats
path: root/scripts/runqemu
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/runqemu')
-rwxr-xr-xscripts/runqemu24
1 files changed, 15 insertions, 9 deletions
diff --git a/scripts/runqemu b/scripts/runqemu
index def11ea911..cedf4f62ad 100755
--- a/scripts/runqemu
+++ b/scripts/runqemu
@@ -211,7 +211,7 @@ class BaseConfig(object):
211 self.mac_slirp = "52:54:00:12:35:" 211 self.mac_slirp = "52:54:00:12:35:"
212 # pid of the actual qemu process 212 # pid of the actual qemu process
213 self.qemu_environ = os.environ.copy() 213 self.qemu_environ = os.environ.copy()
214 self.qemupid = None 214 self.qemuprocess = None
215 # avoid cleanup twice 215 # avoid cleanup twice
216 self.cleaned = False 216 self.cleaned = False
217 # Files to cleanup after run 217 # Files to cleanup after run
@@ -1531,7 +1531,7 @@ class BaseConfig(object):
1531 for descriptor in self.portlocks.values(): 1531 for descriptor in self.portlocks.values():
1532 pass_fds.append(descriptor.fileno()) 1532 pass_fds.append(descriptor.fileno())
1533 process = subprocess.Popen(cmds, stderr=subprocess.PIPE, pass_fds=pass_fds, env=self.qemu_environ) 1533 process = subprocess.Popen(cmds, stderr=subprocess.PIPE, pass_fds=pass_fds, env=self.qemu_environ)
1534 self.qemupid = process.pid 1534 self.qemuprocess = process
1535 retcode = process.wait() 1535 retcode = process.wait()
1536 if retcode: 1536 if retcode:
1537 if retcode == -signal.SIGTERM: 1537 if retcode == -signal.SIGTERM:
@@ -1554,6 +1554,15 @@ class BaseConfig(object):
1554 signal.signal(signal.SIGTERM, signal.SIG_IGN) 1554 signal.signal(signal.SIGTERM, signal.SIG_IGN)
1555 1555
1556 logger.info("Cleaning up") 1556 logger.info("Cleaning up")
1557
1558 if self.qemuprocess:
1559 try:
1560 # give it some time to shut down, ignore return values and output
1561 self.qemuprocess.send_signal(signal.SIGTERM)
1562 self.qemuprocess.communicate(timeout=5)
1563 except subprocess.TimeoutExpired:
1564 self.qemuprocess.kill()
1565
1557 with open('/proc/uptime', 'r') as f: 1566 with open('/proc/uptime', 'r') as f:
1558 uptime_seconds = f.readline().split()[0] 1567 uptime_seconds = f.readline().split()[0]
1559 logger.info('Host uptime: %s\n' % uptime_seconds) 1568 logger.info('Host uptime: %s\n' % uptime_seconds)
@@ -1581,6 +1590,9 @@ class BaseConfig(object):
1581 else: 1590 else:
1582 shutil.rmtree(ent) 1591 shutil.rmtree(ent)
1583 1592
1593 # Deliberately ignore the return code of 'tput smam'.
1594 subprocess.call(["tput", "smam"])
1595
1584 self.cleaned = True 1596 self.cleaned = True
1585 1597
1586 def run_bitbake_env(self, mach=None): 1598 def run_bitbake_env(self, mach=None):
@@ -1657,12 +1669,8 @@ def main():
1657 subprocess.check_call([renice, str(os.getpid())]) 1669 subprocess.check_call([renice, str(os.getpid())])
1658 1670
1659 def sigterm_handler(signum, frame): 1671 def sigterm_handler(signum, frame):
1660 logger.info("SIGTERM received") 1672 logger.info("Received signal: %s" % (signum))
1661 if config.qemupid:
1662 os.kill(config.qemupid, signal.SIGTERM)
1663 config.cleanup() 1673 config.cleanup()
1664 # Deliberately ignore the return code of 'tput smam'.
1665 subprocess.call(["tput", "smam"])
1666 signal.signal(signal.SIGTERM, sigterm_handler) 1674 signal.signal(signal.SIGTERM, sigterm_handler)
1667 1675
1668 config.check_args() 1676 config.check_args()
@@ -1686,8 +1694,6 @@ def main():
1686 finally: 1694 finally:
1687 config.cleanup_cmd() 1695 config.cleanup_cmd()
1688 config.cleanup() 1696 config.cleanup()
1689 # Deliberately ignore the return code of 'tput smam'.
1690 subprocess.call(["tput", "smam"])
1691 1697
1692if __name__ == "__main__": 1698if __name__ == "__main__":
1693 sys.exit(main()) 1699 sys.exit(main())