Mon, 05 Feb 2018 10:25:17 +0000
Added exeption protection decorators to callbacks.
If callbacks crash, there's rarely anything in the logs otherwise.
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 | now = snapshot.monotonic() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
158 | if not self._list: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
159 | timeout = None |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
160 | delta = None |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
161 | nextname = None |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
162 | else: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
163 | nextname=self._list.name |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
164 | delta = self._list.when.horizon(snapshot)-now |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
165 | if delta==math.inf: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
166 | timeout=None |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
167 | else: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
168 | timeout = min(self.precision, delta) |
49 | 169 | |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
170 | if not timeout or timeout>0: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
171 | logger.debug("Scheduler waiting %s seconds [next event '%s' in %s seconds]" |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
172 | % (str(timeout), nextname, str(delta))) |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
173 | self._cond.wait(timeout) |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
174 | snapshot = dreamtime.Snapshot() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
175 | now = snapshot.monotonic() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
176 | logger.debug("Scheduler timed out") |
75
2a44b9649212
UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
69
diff
changeset
|
177 | |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
178 | while self._list and self._list.when.horizon(snapshot) <= now: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
179 | ev=self._list |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
180 | 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
|
181 | # 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
|
182 | self._unlink(ev) |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
183 | # 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
|
184 | # 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
|
185 | self._cond.release() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
186 | with ev.cond: |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
187 | ev.cond.notify_all() |
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
188 | 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
|
189 | |
106
a7bdc239ef62
Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
190 | @protect_noreturn |
101
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
191 | def _sleepwake_callback(self, woke): |
3068b0de12ee
Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents:
91
diff
changeset
|
192 | logger.debug("Rescheduling events after sleep/wakeup") |
76
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
193 | with self._cond: |
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
194 | self._resort() |
103
32f2154ef25e
Missing notify in scheduler sleep/wake callback
Tuomo Valkonen <tuomov@iki.fi>
parents:
102
diff
changeset
|
195 | self._cond.notify() |
76
4b08fca3ce34
Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents:
75
diff
changeset
|
196 | |
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
|
197 | # It is required to have acquired the lock on ev.cond on entry |
54 | 198 | def _wait(self, ev): |
199 | with self._cond: | |
200 | 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
|
201 | self._cond.notify() |
54 | 202 | |
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
|
203 | # 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
|
204 | # thread to notify us if we are ready to be released |
54 | 205 | ev.cond.wait() |
206 | ||
207 | # If we were woken up by some other event, not the scheduler, | |
208 | # 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
|
209 | 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
|
210 | # 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
|
211 | # 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
|
212 | #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
|
213 | 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
|
214 | 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
|
215 | #ev.cond.acquire() |
49 | 216 | |
217 | # cond has to be acquired on entry! | |
218 | def wait_until(self, when, cond, name=None): | |
104
d33e2d7dbeb1
Added some debug log messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
103
diff
changeset
|
219 | logger.info("Scheduling '%s' in %0.01f seconds / on %s [%s]" % |
d33e2d7dbeb1
Added some debug log messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
103
diff
changeset
|
220 | (name, when.seconds_to(), when.isoformat(), |
d33e2d7dbeb1
Added some debug log messages
Tuomo Valkonen <tuomov@iki.fi>
parents:
103
diff
changeset
|
221 | when.__class__.__name__)) |
53
442c558bd632
Generalisation of scheduler thread to general queue threads
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
222 | self._wait(ScheduledEvent(when, cond, name)) |
49 | 223 |