Wed, 07 Feb 2018 20:39:01 +0000
Time snapshot fixes.
Python's default arguments are purely idiotic (aka. pythonic): generated
only once. This makes sense in a purely functional language, which Python
lightyears away from, but severely limits their usefulness in an imperative
language. Decorators also seem clumsy for this, as one would have to tell
the number of positional arguments for things to work nice, being able to
pass the snapshot both positionally and as keyword. No luck.
So have to do things the old-fashioned hard way.
49 | 1 | # |
89
51cc2e25af38
Added author information headers and content information to source files
Tuomo Valkonen <tuomov@iki.fi>
parents:
87
diff
changeset
|
2 | # Borgend by Tuomo Valkonen, 2018 |
49 | 3 | # |
89
51cc2e25af38
Added author information headers and content information to source files
Tuomo Valkonen <tuomov@iki.fi>
parents:
87
diff
changeset
|
4 | # This file is the scheduler: it provides e a way for other threads to |
51cc2e25af38
Added author information headers and content information to source files
Tuomo Valkonen <tuomov@iki.fi>
parents:
87
diff
changeset
|
5 | # wait until a given time; which may be "dreamtime" that discounts system |
51cc2e25af38
Added author information headers and content information to source files
Tuomo Valkonen <tuomov@iki.fi>
parents:
87
diff
changeset
|
6 | # sleep periods |
49 | 7 | # |
8 | ||
9 | import time | |
86
2fe66644c50d
Can use logging.getLogger directly now after proper packageisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
80
diff
changeset
|
10 | import logging |
102
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
11 | import math |
80
a409242121d5
Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
79
diff
changeset
|
12 | from threading import Condition, Thread |
a409242121d5
Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
79
diff
changeset
|
13 | |
a409242121d5
Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
79
diff
changeset
|
14 | from . import dreamtime |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
15 | from .exprotect import protect_noreturn |
49 | 16 | |
86
2fe66644c50d
Can use logging.getLogger directly now after proper packageisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
80
diff
changeset
|
17 | logger=logging.getLogger(__name__) |
49 | 18 | |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
19 | class QueuedEvent: |
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
20 | def __init__(self, cond, name=None): |
49 | 21 | self.next=None |
22 | self.prev=None | |
23 | self.name=name | |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
24 | self.cond=cond |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
25 | self.linked=False |
49 | 26 | |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
27 | @staticmethod |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
28 | def snapshot(): |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
29 | return None |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
30 | |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
31 | def is_before(self, other, snapshot=None): |
54 | 32 | raise NotImplementedError |
49 | 33 | |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
34 | def __lt__(self, other): |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
35 | return self.is_before(other, self.snapshot()) |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
36 | |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
37 | def insert_after(self, ev, snapshot=None): |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
38 | if not snapshot: |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
39 | snapshot=self.snapshot() |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
40 | if not self.next or ev.is_before(self.next, snapshot): |
49 | 41 | self.insert_immediately_after(ev) |
42 | else: | |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
43 | self.next.insert_after(ev, snapshot) |
49 | 44 | |
45 | def insert_immediately_after(self, ev): | |
69
8705e296c7a0
Scheduling list fix and simplifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
46 | assert(ev.next is None and ev.prev is None) |
49 | 47 | ev.prev=self |
48 | ev.next=self.next | |
49 | self.next=ev | |
50 | ||
69
8705e296c7a0
Scheduling list fix and simplifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
51 | def insert_immediately_before(self, ev): |
8705e296c7a0
Scheduling list fix and simplifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
52 | assert(ev.next is None and ev.prev is None) |
8705e296c7a0
Scheduling list fix and simplifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
53 | ev.next=self |
8705e296c7a0
Scheduling list fix and simplifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
54 | ev.prev=self.prev |
8705e296c7a0
Scheduling list fix and simplifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
55 | self.prev=ev |
8705e296c7a0
Scheduling list fix and simplifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
56 | |
49 | 57 | def unlink(self): |
58 | n=self.next | |
59 | p=self.prev | |
60 | if n: | |
61 | n.prev=p | |
62 | if p: | |
63 | p.next=n | |
76
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
64 | self.next=None |
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
65 | self.prev=None |
49 | 66 | |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
67 | class ScheduledEvent(QueuedEvent): |
78
83b43987e61e
Renamed the "sleep" module "dreamtime"
Tuomo Valkonen <tuomov@iki.fi>
parents:
76
diff
changeset
|
68 | #@accepts(ScheduledEvent, dreamtime.Time, threading.Cond, str) |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
69 | def __init__(self, when, cond, name=None): |
54 | 70 | super().__init__(cond, name=name) |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
71 | self.when=when |
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
72 | |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
73 | @staticmethod |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
74 | def snapshot(): |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
75 | return dreamtime.Snapshot() |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
76 | |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
77 | def is_before(self, other, snapshot=None): |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
78 | if not snapshot: |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
79 | snapshot=self.snapshot() |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
80 | return self.when.horizon(snapshot) < other.when.horizon(snapshot) |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
81 | |
49 | 82 | class TerminableThread(Thread): |
83 | def __init__(self, *args, **kwargs): | |
84 | super().__init__(*args, **kwargs) | |
85 | self._terminate=False | |
86 | self._cond=Condition() | |
87 | ||
88 | def terminate(self): | |
89 | with self._cond: | |
90 | _terminate=True | |
91 | self._cond.notify() | |
92 | ||
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
93 | class QueueThread(TerminableThread): |
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
94 | def __init__(self, *args, **kwargs): |
54 | 95 | super().__init__(*args, **kwargs) |
96 | self.daemon = True | |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
97 | self._list = None |
49 | 98 | |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
99 | def _insert(self, ev, snapshot=None): |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
100 | assert(not ev.linked) |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
101 | if not self._list: |
75
2a44b9649212
UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
69
diff
changeset
|
102 | #logger.debug("Insert first") |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
103 | self._list=ev |
54 | 104 | elif ev<self._list: |
75
2a44b9649212
UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
69
diff
changeset
|
105 | #logger.debug("Insert beginning") |
69
8705e296c7a0
Scheduling list fix and simplifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
106 | self._list.insert_immediately_before(ev) |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
107 | self._list=ev |
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
108 | else: |
75
2a44b9649212
UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
69
diff
changeset
|
109 | #logger.debug("Insert after") |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
110 | if not snapshot: |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
111 | snapshot=ev.snapshot() |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
112 | self._list.insert_after(ev, snapshot) |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
113 | ev.linked=True |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
114 | |
54 | 115 | def _unlink(self, ev): |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
116 | assert(ev.linked) |
54 | 117 | if ev==self._list: |
118 | self._list=ev.next | |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
119 | ev.unlink() |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
120 | ev.linked=False |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
121 | |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
122 | def _resort(self, snapshot=None): |
76
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
123 | oldlist=self._list |
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
124 | self._list=None |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
125 | if oldlist and not snapshot: |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
126 | snapshot=oldlist.snapshot() |
76
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
127 | while oldlist: |
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
128 | ev=oldlist |
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
129 | oldlist=oldlist.next |
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
130 | ev.unlink() |
91
f53aa2007a84
Oops; _resort needs to mark ev.linked=False to avoid assertion errors in _insert.
Tuomo Valkonen <tuomov@iki.fi>
parents:
89
diff
changeset
|
131 | ev.linked=False |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
132 | self._insert(ev, snapshot) |
76
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
133 | |
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
134 | |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
135 | |
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
136 | class Scheduler(QueueThread): |
102
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
137 | # Default to precision of 5 minutes: if there are finite-horizon events in |
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
138 | # the queue, the scheduler thread will never sleep longer than that. |
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
139 | # This is to quickly get back on track with the schedule when the computer |
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
140 | # wakes up from sleep, if the sleep monitor is not working or is not |
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
141 | # implemented for the particular operating system. However, if there are |
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
142 | # only infinite-horizon events in the queue (meaning, DreamTime-scheduled |
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
143 | # events, and the system is sleeping or "sleeping"), the scheduler will |
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
144 | # also sleep. Hopefully this will also help the system stay properly asleep. |
0d43cd568f3c
Changed scheduler busylooping method, and decreased precision to 5 minutes:
Tuomo Valkonen <tuomov@iki.fi>
parents:
101
diff
changeset
|
145 | def __init__(self, precision=60*5): |
49 | 146 | self.precision = precision |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
147 | self._next_event_time = None |
54 | 148 | super().__init__(target = self._scheduler_thread, name = 'Scheduler') |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
149 | dreamtime.add_callback(self, self._sleepwake_callback) |
49 | 150 | |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
151 | @protect_noreturn |
54 | 152 | def _scheduler_thread(self): |
75
2a44b9649212
UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
69
diff
changeset
|
153 | logger.debug("Scheduler thread started") |
49 | 154 | with self._cond: |
155 | while not self._terminate: | |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
156 | snapshot = dreamtime.Snapshot() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
157 | if not self._list: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
158 | timeout = None |
113 | 159 | delta = math.inf |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
160 | nextname = None |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
161 | else: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
162 | nextname=self._list.name |
113 | 163 | delta = self._list.when.horizon(snapshot) |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
164 | if delta==math.inf: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
165 | timeout=None |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
166 | else: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
167 | timeout = min(self.precision, delta) |
49 | 168 | |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
169 | if not timeout or timeout>0: |
113 | 170 | logger.debug("Scheduler waiting %s seconds [next event '%s' in %0.2f seconds]" |
171 | % (str(timeout), nextname, delta)) | |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
172 | self._cond.wait(timeout) |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
173 | snapshot = dreamtime.Snapshot() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
174 | logger.debug("Scheduler timed out") |
75
2a44b9649212
UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
69
diff
changeset
|
175 | |
113 | 176 | while self._list and self._list.when.horizon(snapshot) <= 0: |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
177 | ev=self._list |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
178 | logger.debug("Scheduler activating %s" % (ev.name or "(unknown)")) |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
179 | # We are only allowed to remove ev from list when ev.cond allows |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
180 | self._unlink(ev) |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
181 | # We need to release the lock on self._cond before acquire |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
182 | # one ev.cond to avoid race conditions with self._wait |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
183 | self._cond.release() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
184 | with ev.cond: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
185 | ev.cond.notify_all() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
186 | self._cond.acquire() |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
187 | |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
188 | @protect_noreturn |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
189 | def _sleepwake_callback(self, woke): |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
190 | logger.debug("Rescheduling events after sleep/wakeup") |
76
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
191 | with self._cond: |
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
192 | self._resort() |
103
32f2154ef25e
Missing notify in scheduler sleep/wake callback
Tuomo Valkonen <tuomov@iki.fi>
parents:
102
diff
changeset
|
193 | self._cond.notify() |
76
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
194 | |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
195 | # It is required to have acquired the lock on ev.cond on entry |
54 | 196 | def _wait(self, ev): |
197 | with self._cond: | |
198 | self._insert(ev) | |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
199 | self._cond.notify() |
54 | 200 | |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
201 | # This will release the lock on cond, allowing the scheduler |
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
202 | # thread to notify us if we are ready to be released |
54 | 203 | ev.cond.wait() |
204 | ||
205 | # If we were woken up by some other event, not the scheduler, | |
206 | # ensure the event is removed | |
87
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
207 | if ev.linked: |
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
208 | # Deal with race conditions wrt. the two different locks |
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
209 | # in the scheduler |
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
210 | #ev.cond.release() |
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
211 | with self._cond: |
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
212 | self._unlink(ev) |
a214d475aa28
Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents:
86
diff
changeset
|
213 | #ev.cond.acquire() |
49 | 214 | |
215 | # cond has to be acquired on entry! | |
216 | def wait_until(self, when, cond, name=None): | |
104
d33e2d7dbeb1
Added some debug log messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
103
diff
changeset
|
217 | logger.info("Scheduling '%s' in %0.01f seconds / on %s [%s]" % |
113 | 218 | (name, when.remaining(), when.isoformat(), |
104
d33e2d7dbeb1
Added some debug log messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
103
diff
changeset
|
219 | when.__class__.__name__)) |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
220 | self._wait(ScheduledEvent(when, cond, name)) |
49 | 221 |