Skip to content

Commit 3426454

Browse files
committed
task.unique() doesn't kill self if self previously called it
1 parent da3e252 commit 3426454

File tree

2 files changed

+26
-22
lines changed

2 files changed

+26
-22
lines changed

custom_components/pyscript/function.py

+20-20
Original file line numberDiff line numberDiff line change
@@ -107,28 +107,28 @@ def task_unique_factory(cls, ctx):
107107
async def task_unique(name, kill_me=False):
108108
"""Implement task.unique()."""
109109
name = f"{ctx.get_global_ctx_name()}.{name}"
110+
curr_task = asyncio.current_task()
110111
if name in cls.unique_name2task:
112+
task = cls.unique_name2task[name]
111113
if kill_me:
112-
#
113-
# it seems we can't cancel ourselves, so we
114-
# tell the repeaer task to cancel us
115-
#
116-
Function.task_cancel(asyncio.current_task())
117-
# wait to be canceled
118-
await asyncio.sleep(100000)
119-
else:
120-
task = cls.unique_name2task[name]
121-
if task in cls.our_tasks:
122-
# only cancel tasks if they are ones we started
123-
try:
124-
task.cancel()
125-
await task
126-
except asyncio.CancelledError:
127-
pass
128-
task = asyncio.current_task()
129-
if task in cls.our_tasks:
130-
cls.unique_name2task[name] = task
131-
cls.unique_task2name[task] = name
114+
if task != curr_task:
115+
#
116+
# it seems we can't cancel ourselves, so we
117+
# tell the repeaer task to cancel us
118+
#
119+
Function.task_cancel(curr_task)
120+
# wait to be canceled
121+
await asyncio.sleep(100000)
122+
elif task != curr_task and task in cls.our_tasks:
123+
# only cancel tasks if they are ones we started
124+
try:
125+
task.cancel()
126+
await task
127+
except asyncio.CancelledError:
128+
pass
129+
if curr_task in cls.our_tasks:
130+
cls.unique_name2task[name] = curr_task
131+
cls.unique_task2name[curr_task] = name
132132

133133
return task_unique
134134

tests/test_unique.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ def funcStartupSync():
7575
seq_num += 1
7676
log.info(f"funcStartupSync setting pyscript.done = {seq_num}")
7777
pyscript.done = seq_num
78+
#
79+
# stick around so the task.unique() still applies
80+
#
81+
task.unique("func6")
82+
task.sleep(10000)
7883
7984
@state_trigger("pyscript.f1var1 == '1'")
8085
def func1(var_name=None, value=None):
@@ -132,9 +137,8 @@ def func5():
132137
pyscript.done = [seq_num, "pyscript.f5var2"]
133138
134139
135-
@time_trigger("startup")
140+
@state_trigger("pyscript.f4var1 == '1'")
136141
def func6():
137-
task.unique("func6")
138142
task.unique("func6", kill_me=True)
139143
# mess up the sequence numbers if task.unique fails to kill us
140144
pyscript.done = [999]

0 commit comments

Comments
 (0)