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

oops, Waker needs locking

parent 37cb1be6
from libtuer import ThreadRepeater from libtuer import ThreadRepeater
from collections import namedtuple from collections import namedtuple
from threading import Lock
SLEEP_TIME = 0.5 SLEEP_TIME = 0.5
...@@ -10,26 +11,29 @@ class Waker(): ...@@ -10,26 +11,29 @@ class Waker():
self._sm = sm self._sm = sm
self._t = ThreadRepeater(self._wake, SLEEP_TIME, name="Waker") self._t = ThreadRepeater(self._wake, SLEEP_TIME, name="Waker")
self._tobewokens = [] self._tobewokens = []
self._tobewokens_lock = Lock()
def register(f, time, one_shot = False): 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!''' '''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) 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): def _wake(self):
delete = [] with self._tobewokens_lock:
# run the functions we ought to run delete = []
for tobewoken, idx in zip(self._tobewokens, range(len(self._tobewokens))): # run the functions we ought to run
tobewoken.time_since_call += 1 for tobewoken, idx in zip(self._tobewokens, range(len(self._tobewokens))):
if tobewoken.time_since_call >= tobewoken.period: tobewoken.time_since_call += 1
tobewoken.f() if tobewoken.time_since_call >= tobewoken.period:
tobewoken.time_since_call = 0 tobewoken.f()
if tobewoken.one_shot: tobewoken.time_since_call = 0
delete.append(idx) if tobewoken.one_shot:
# delete what we have to delete - in reverse order so the indices stay valid! delete.append(idx)
delete.reverse() # delete what we have to delete - in reverse order so the indices stay valid!
for idx in delete: delete.reverse()
del self._tobewokens[idx] for idx in delete:
del self._tobewokens[idx]
def stop(self): def stop(self):
self._t.stop() 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