@@ -41,12 +41,13 @@ def __init__(self, machine, config=None):
41
41
# state
42
42
self .ready_tasks = []
43
43
self .waiting_tasks = []
44
- self .event_hook = None
44
+ self .event_hooks = []
45
45
self .cur_task = None
46
46
self .num_tasks = 0
47
47
self .main_glet = greenlet .getcurrent ()
48
48
self .num_switch_same = 0
49
49
self .num_switch_other = 0
50
+ self .running = False
50
51
51
52
@classmethod
52
53
def from_cfg (cls , machine , schedule_cfg ):
@@ -58,7 +59,7 @@ def get_machine(self):
58
59
59
60
def set_event_callback (self , func ):
60
61
"""the function will receive ScheduleEvent"""
61
- self .event_hook = func
62
+ self .event_hooks . append ( func )
62
63
63
64
def get_num_tasks (self ):
64
65
"""count the active tasks"""
@@ -81,6 +82,13 @@ def schedule(self):
81
82
if len (self .ready_tasks ) == 0 :
82
83
raise RuntimeError ("no tasks to schedule!" )
83
84
85
+ self .running = True
86
+
87
+ # report events for previously added tasks
88
+ if len (self .event_hooks ) > 0 :
89
+ for task in self .ready_tasks :
90
+ self ._report_event (SchedulerEvent .Type .ADD_TASK , task )
91
+
84
92
# main loop
85
93
while True :
86
94
log_schedule .debug (
@@ -143,6 +151,7 @@ def schedule(self):
143
151
144
152
# end of scheduling
145
153
self ._make_current (None )
154
+ self .running = False
146
155
147
156
log_schedule .info (
148
157
"schedule(): done (switches: same=%d, other=%d)" ,
@@ -200,8 +209,9 @@ def add_task(self, task):
200
209
# configure task
201
210
task .config (self , self .config .slice_cycles )
202
211
log_schedule .info ("add_task: %s" , task .name )
203
- # report via event
204
- self ._report_event (SchedulerEvent .Type .ADD_TASK , task )
212
+ # report via event if running or postpone it
213
+ if self .running :
214
+ self ._report_event (SchedulerEvent .Type .ADD_TASK , task )
205
215
return True
206
216
207
217
def rem_task (self , task ):
@@ -224,14 +234,16 @@ def rem_task(self, task):
224
234
# mark as removed
225
235
task .set_state (TaskState .TS_REMOVED )
226
236
log_schedule .info ("rem_task: %s" , task .name )
227
- # report via event
228
- self ._report_event (SchedulerEvent .Type .REMOVE_TASK , task )
237
+ # report via event if running or suppress otherwise
238
+ if self .running :
239
+ self ._report_event (SchedulerEvent .Type .REMOVE_TASK , task )
229
240
return True
230
241
231
242
def _report_event (self , event , task ):
232
- if self .event_hook :
243
+ if len ( self .event_hooks ) > 0 :
233
244
event = SchedulerEvent (event , task )
234
- self .event_hook (event )
245
+ for hook in self .event_hooks :
246
+ hook (event )
235
247
236
248
def reschedule (self ):
237
249
"""callback from tasks to reschedule"""
0 commit comments