Commit 226118cb authored by Ralf's avatar Ralf
Browse files

oops, Waker needs locking

parent 37cb1be6
from libtuer import ThreadRepeater
from collections import namedtuple
from threading import Lock
SLEEP_TIME = 0.5
......@@ -10,26 +11,29 @@ class Waker():
self._sm = sm
self._t = ThreadRepeater(self._wake, SLEEP_TIME, name="Waker")
self._tobewokens = []
self._tobewokens_lock = Lock()
def register(f, time, one_shot = False):
'''Register a function which is called approximately every <time> seconds (or just once, if one_shot is True). f should return quickly, or it will delay the waker!'''
time = max(time//SLEEP_TIME, 1)
self._tobewokens.append(ToBeWoken(f, time, 0, one_shot))
with self._tobewokens_lock:
self._tobewokens.append(ToBeWoken(f, time, 0, one_shot))
def _wake(self):
delete = []
# run the functions we ought to run
for tobewoken, idx in zip(self._tobewokens, range(len(self._tobewokens))):
tobewoken.time_since_call += 1
if tobewoken.time_since_call >= tobewoken.period:
tobewoken.f()
tobewoken.time_since_call = 0
if tobewoken.one_shot:
delete.append(idx)
# delete what we have to delete - in reverse order so the indices stay valid!
delete.reverse()
for idx in delete:
del self._tobewokens[idx]
with self._tobewokens_lock:
delete = []
# run the functions we ought to run
for tobewoken, idx in zip(self._tobewokens, range(len(self._tobewokens))):
tobewoken.time_since_call += 1
if tobewoken.time_since_call >= tobewoken.period:
tobewoken.f()
tobewoken.time_since_call = 0
if tobewoken.one_shot:
delete.append(idx)
# delete what we have to delete - in reverse order so the indices stay valid!
delete.reverse()
for idx in delete:
del self._tobewokens[idx]
def stop(self):
self._t.stop()
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment