summaryrefslogtreecommitdiff
path: root/crocoite
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2018-11-25 09:29:47 +0100
committerLars-Dominik Braun <lars@6xq.net>2018-11-25 09:29:47 +0100
commitb0a66f3502b7959aed19c25dad1f2deb86f7208d (patch)
tree332b99727cc9579933d61f77c6456e883810cb9c /crocoite
parent156ed72f8b27222e94f6363ba905cc38b95f2875 (diff)
downloadcrocoite-b0a66f3502b7959aed19c25dad1f2deb86f7208d.tar.gz
crocoite-b0a66f3502b7959aed19c25dad1f2deb86f7208d.tar.bz2
crocoite-b0a66f3502b7959aed19c25dad1f2deb86f7208d.zip
single: Graceful ^C
Allow cancellation of timeout wait.
Diffstat (limited to 'crocoite')
-rw-r--r--crocoite/cli.py6
-rw-r--r--crocoite/controller.py9
2 files changed, 13 insertions, 2 deletions
diff --git a/crocoite/cli.py b/crocoite/cli.py
index e4a46ee..390cae6 100644
--- a/crocoite/cli.py
+++ b/crocoite/cli.py
@@ -69,7 +69,11 @@ def single ():
service=service, handler=handler, behavior=b, logger=logger)
try:
loop = asyncio.get_event_loop()
- loop.run_until_complete(controller.run ())
+ run = asyncio.ensure_future (controller.run ())
+ stop = lambda signum: run.cancel ()
+ loop.add_signal_handler (signal.SIGINT, stop, signal.SIGINT)
+ loop.add_signal_handler (signal.SIGTERM, stop, signal.SIGTERM)
+ loop.run_until_complete(run)
loop.close()
ret = SingleExitStatus.Ok
except Crashed:
diff --git a/crocoite/controller.py b/crocoite/controller.py
index 4d95b09..5f4fe10 100644
--- a/crocoite/controller.py
+++ b/crocoite/controller.py
@@ -178,7 +178,14 @@ class SinglePageController:
idleTimeout = None
while True:
idleProc = asyncio.ensure_future (l.idle.wait ())
- finished, pending = await asyncio.wait([idleProc, timeoutProc], return_when=asyncio.FIRST_COMPLETED, timeout=idleTimeout)
+ try:
+ finished, pending = await asyncio.wait([idleProc, timeoutProc],
+ return_when=asyncio.FIRST_COMPLETED, timeout=idleTimeout)
+ except asyncio.CancelledError:
+ idleProc.cancel ()
+ timeoutProc.cancel ()
+ break
+
if not finished:
# idle timeout
idleProc.cancel ()