From 2fe37e7c46671a2ba9039f20c63930de2aaa0576 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Sun, 8 Nov 2015 17:59:33 +0100 Subject: [PATCH] Fix bug with exception never handled in once_at_a_time coroutines --- src/cutecoin/tools/decorators.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/cutecoin/tools/decorators.py b/src/cutecoin/tools/decorators.py index 3842dbd4..169bdae1 100644 --- a/src/cutecoin/tools/decorators.py +++ b/src/cutecoin/tools/decorators.py @@ -13,15 +13,24 @@ def cancel_once_task(object, fn): def once_at_a_time(fn): @functools.wraps(fn) def wrapper(*args, **kwargs): + def task_done(task): + try: + args[0].__tasks.pop(fn.__name__) + except KeyError: + logging.debug("Task already removed") + if getattr(args[0], "__tasks", None) is None: setattr(args[0], "__tasks", {}) if fn.__name__ in args[0].__tasks: if not args[0].__tasks[fn.__name__].done(): args[0].__tasks[fn.__name__].cancel() + try: args[0].__tasks[fn.__name__] = fn(*args, **kwargs) + args[0].__tasks[fn.__name__].add_done_callback(task_done) except asyncio.CancelledError: logging.debug("Cancelled asyncified : {0}".format(fn.__name__)) + return args[0].__tasks[fn.__name__] return wrapper -- GitLab