gui/applets: fix teardown of half-initialized applets

This commit is contained in:
Sebastien Bourdeauducq 2016-09-06 23:06:31 +08:00
parent f6b5d6d20f
commit 5d293d14c6

View File

@ -81,13 +81,14 @@ class AppletIPCServer(AsyncioParentComm):
finally: finally:
self.datasets_sub.notify_cbs.remove(self._on_mod) self.datasets_sub.notify_cbs.remove(self._on_mod)
def start(self, embed_cb, fix_initial_size_cb): def start_server(self, embed_cb, fix_initial_size_cb):
self.server_task = asyncio.ensure_future( self.server_task = asyncio.ensure_future(
self.serve(embed_cb, fix_initial_size_cb)) self.serve(embed_cb, fix_initial_size_cb))
async def stop(self): async def stop_server(self):
self.server_task.cancel() if hasattr(self, "server_task"):
await asyncio.wait([self.server_task]) self.server_task.cancel()
await asyncio.wait([self.server_task])
class _AppletDock(QDockWidgetCloseDetect): class _AppletDock(QDockWidgetCloseDetect):
@ -140,7 +141,7 @@ class _AppletDock(QDockWidgetCloseDetect):
asyncio.ensure_future( asyncio.ensure_future(
LogParser(self._get_log_source).stream_task( LogParser(self._get_log_source).stream_task(
self.ipc.process.stderr)) self.ipc.process.stderr))
self.ipc.start(self.embed, self.fix_initial_size) self.ipc.start_server(self.embed, self.fix_initial_size)
finally: finally:
self.starting_stopping = False self.starting_stopping = False
@ -177,18 +178,19 @@ class _AppletDock(QDockWidgetCloseDetect):
self.starting_stopping = True self.starting_stopping = True
if hasattr(self, "ipc"): if hasattr(self, "ipc"):
await self.ipc.stop() await self.ipc.stop_server()
self.ipc.write_pyon({"action": "terminate"}) if hasattr(self.ipc, "process"):
try: self.ipc.write_pyon({"action": "terminate"})
await asyncio.wait_for(self.ipc.process.wait(), 2.0)
except:
logger.warning("Applet %s failed to exit, killing",
self.applet_name)
try: try:
self.ipc.process.kill() await asyncio.wait_for(self.ipc.process.wait(), 2.0)
except ProcessLookupError: except:
pass logger.warning("Applet %s failed to exit, killing",
await self.ipc.process.wait() self.applet_name)
try:
self.ipc.process.kill()
except ProcessLookupError:
pass
await self.ipc.process.wait()
del self.ipc del self.ipc
if hasattr(self, "embed_widget"): if hasattr(self, "embed_widget"):