Skip to content

Commit fcb543d

Browse files
committed
added exec scheduler
1 parent 91982d2 commit fcb543d

File tree

7 files changed

+372
-13
lines changed

7 files changed

+372
-13
lines changed

amitools/vamos/astructs/astruct.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ def free(self):
375375
free_ref.free_ref()
376376
super().free()
377377

378-
def __str__(self):
378+
def __repr__(self):
379379
return "[AStruct:%s,@%06x+%06x]" % (
380380
self.sdef.get_type_name(),
381381
self._addr,

amitools/vamos/dos/run.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ def run_sub_process(scheduler, runner, proc):
1414

1515
# hack cur task
1616
cur_task = scheduler.cur_task
17-
event = SchedulerEvent(SchedulerEvent.Type.ACTIVE_TASK, task)
18-
scheduler.event_hook(event)
17+
scheduler._report_event(SchedulerEvent.Type.ACTIVE_TASK, task)
1918

2019
# return value
2120
code = task.get_code()
@@ -27,8 +26,7 @@ def run_sub_process(scheduler, runner, proc):
2726
proc.free()
2827

2928
# restore cur task
30-
event = SchedulerEvent(SchedulerEvent.Type.ACTIVE_TASK, cur_task)
31-
scheduler.event_hook(event)
29+
scheduler._report_event(SchedulerEvent.Type.ACTIVE_TASK, cur_task)
3230

3331
return ret_code
3432

amitools/vamos/libtypes/list_.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ def __len__(self):
4242
l += 1
4343
return l
4444

45+
def to_list(self):
46+
return [a for a in self]
47+
4548
def iter_at(self, node):
4649
return ListIter(self, node)
4750

amitools/vamos/schedule/scheduler.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ def __init__(self, machine, config=None):
4141
# state
4242
self.ready_tasks = []
4343
self.waiting_tasks = []
44-
self.event_hook = None
44+
self.event_hooks = []
4545
self.cur_task = None
4646
self.num_tasks = 0
4747
self.main_glet = greenlet.getcurrent()
4848
self.num_switch_same = 0
4949
self.num_switch_other = 0
50+
self.running = False
5051

5152
@classmethod
5253
def from_cfg(cls, machine, schedule_cfg):
@@ -58,7 +59,7 @@ def get_machine(self):
5859

5960
def set_event_callback(self, func):
6061
"""the function will receive ScheduleEvent"""
61-
self.event_hook = func
62+
self.event_hooks.append(func)
6263

6364
def get_num_tasks(self):
6465
"""count the active tasks"""
@@ -81,6 +82,13 @@ def schedule(self):
8182
if len(self.ready_tasks) == 0:
8283
raise RuntimeError("no tasks to schedule!")
8384

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+
8492
# main loop
8593
while True:
8694
log_schedule.debug(
@@ -143,6 +151,7 @@ def schedule(self):
143151

144152
# end of scheduling
145153
self._make_current(None)
154+
self.running = False
146155

147156
log_schedule.info(
148157
"schedule(): done (switches: same=%d, other=%d)",
@@ -200,8 +209,9 @@ def add_task(self, task):
200209
# configure task
201210
task.config(self, self.config.slice_cycles)
202211
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)
205215
return True
206216

207217
def rem_task(self, task):
@@ -224,14 +234,16 @@ def rem_task(self, task):
224234
# mark as removed
225235
task.set_state(TaskState.TS_REMOVED)
226236
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)
229240
return True
230241

231242
def _report_event(self, event, task):
232-
if self.event_hook:
243+
if len(self.event_hooks) > 0:
233244
event = SchedulerEvent(event, task)
234-
self.event_hook(event)
245+
for hook in self.event_hooks:
246+
hook(event)
235247

236248
def reschedule(self):
237249
"""callback from tasks to reschedule"""

amitools/vamos/task/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
from .maptask import MappedTask
33
from .exectask import ExecTask
44
from .dosproc import DosProcess
5+
from .execscheduler import ExecScheduler
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from amitools.vamos.schedule import SchedulerEvent
2+
3+
4+
class ExecScheduler:
5+
"""The ExecScheduler syns the scheduler state into the ExecLibrary"""
6+
7+
def __init__(self, scheduler, exec_lib):
8+
self.scheduler = scheduler
9+
self.exec_lib = exec_lib
10+
# handle scheduler events
11+
self.old_task = None
12+
self.scheduler.set_event_callback(self.event_handler)
13+
14+
def event_handler(self, event):
15+
ev = event.type
16+
# lookup scheduler and ami task
17+
sched_task = event.task
18+
if sched_task:
19+
ami_task = sched_task.map_task.ami_task
20+
else:
21+
ami_task = None
22+
23+
if ev == SchedulerEvent.Type.ACTIVE_TASK:
24+
# remove from task_ready
25+
if ami_task:
26+
ami_task.node.remove()
27+
# store in ThisTask
28+
self.exec_lib.this_task.ref = ami_task
29+
elif ev == SchedulerEvent.Type.READY_TASK:
30+
# add to task_ready
31+
self.exec_lib.task_ready.add_head(ami_task.node)
32+
elif ev == SchedulerEvent.Type.WAITING_TASK:
33+
# add to task_wait
34+
self.exec_lib.task_wait.add_head(ami_task.node)
35+
elif ev == SchedulerEvent.Type.WAKE_UP_TASK:
36+
# remove from task_wait and add to ready
37+
ami_task.node.remove()
38+
self.exec_lib.task_ready.add_head(ami_task.node)
39+
elif ev == SchedulerEvent.Type.ADD_TASK:
40+
self.exec_lib.task_ready.add_tail(ami_task.node)

0 commit comments

Comments
 (0)