Skip to content

Commit

Permalink
added exec scheduler
Browse files Browse the repository at this point in the history
  • Loading branch information
cnvogelg committed Jan 25, 2025
1 parent 91982d2 commit fcb543d
Show file tree
Hide file tree
Showing 7 changed files with 372 additions and 13 deletions.
2 changes: 1 addition & 1 deletion amitools/vamos/astructs/astruct.py
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ def free(self):
free_ref.free_ref()
super().free()

def __str__(self):
def __repr__(self):
return "[AStruct:%s,@%06x+%06x]" % (
self.sdef.get_type_name(),
self._addr,
Expand Down
6 changes: 2 additions & 4 deletions amitools/vamos/dos/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ def run_sub_process(scheduler, runner, proc):

# hack cur task
cur_task = scheduler.cur_task
event = SchedulerEvent(SchedulerEvent.Type.ACTIVE_TASK, task)
scheduler.event_hook(event)
scheduler._report_event(SchedulerEvent.Type.ACTIVE_TASK, task)

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

# restore cur task
event = SchedulerEvent(SchedulerEvent.Type.ACTIVE_TASK, cur_task)
scheduler.event_hook(event)
scheduler._report_event(SchedulerEvent.Type.ACTIVE_TASK, cur_task)

return ret_code

Expand Down
3 changes: 3 additions & 0 deletions amitools/vamos/libtypes/list_.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ def __len__(self):
l += 1
return l

def to_list(self):
return [a for a in self]

def iter_at(self, node):
return ListIter(self, node)

Expand Down
28 changes: 20 additions & 8 deletions amitools/vamos/schedule/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,13 @@ def __init__(self, machine, config=None):
# state
self.ready_tasks = []
self.waiting_tasks = []
self.event_hook = None
self.event_hooks = []
self.cur_task = None
self.num_tasks = 0
self.main_glet = greenlet.getcurrent()
self.num_switch_same = 0
self.num_switch_other = 0
self.running = False

@classmethod
def from_cfg(cls, machine, schedule_cfg):
Expand All @@ -58,7 +59,7 @@ def get_machine(self):

def set_event_callback(self, func):
"""the function will receive ScheduleEvent"""
self.event_hook = func
self.event_hooks.append(func)

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

self.running = True

# report events for previously added tasks
if len(self.event_hooks) > 0:
for task in self.ready_tasks:
self._report_event(SchedulerEvent.Type.ADD_TASK, task)

# main loop
while True:
log_schedule.debug(
Expand Down Expand Up @@ -143,6 +151,7 @@ def schedule(self):

# end of scheduling
self._make_current(None)
self.running = False

log_schedule.info(
"schedule(): done (switches: same=%d, other=%d)",
Expand Down Expand Up @@ -200,8 +209,9 @@ def add_task(self, task):
# configure task
task.config(self, self.config.slice_cycles)
log_schedule.info("add_task: %s", task.name)
# report via event
self._report_event(SchedulerEvent.Type.ADD_TASK, task)
# report via event if running or postpone it
if self.running:
self._report_event(SchedulerEvent.Type.ADD_TASK, task)
return True

def rem_task(self, task):
Expand All @@ -224,14 +234,16 @@ def rem_task(self, task):
# mark as removed
task.set_state(TaskState.TS_REMOVED)
log_schedule.info("rem_task: %s", task.name)
# report via event
self._report_event(SchedulerEvent.Type.REMOVE_TASK, task)
# report via event if running or suppress otherwise
if self.running:
self._report_event(SchedulerEvent.Type.REMOVE_TASK, task)
return True

def _report_event(self, event, task):
if self.event_hook:
if len(self.event_hooks) > 0:
event = SchedulerEvent(event, task)
self.event_hook(event)
for hook in self.event_hooks:
hook(event)

def reschedule(self):
"""callback from tasks to reschedule"""
Expand Down
1 change: 1 addition & 0 deletions amitools/vamos/task/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
from .maptask import MappedTask
from .exectask import ExecTask
from .dosproc import DosProcess
from .execscheduler import ExecScheduler
40 changes: 40 additions & 0 deletions amitools/vamos/task/execscheduler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from amitools.vamos.schedule import SchedulerEvent


class ExecScheduler:
"""The ExecScheduler syns the scheduler state into the ExecLibrary"""

def __init__(self, scheduler, exec_lib):
self.scheduler = scheduler
self.exec_lib = exec_lib
# handle scheduler events
self.old_task = None
self.scheduler.set_event_callback(self.event_handler)

def event_handler(self, event):
ev = event.type
# lookup scheduler and ami task
sched_task = event.task
if sched_task:
ami_task = sched_task.map_task.ami_task
else:
ami_task = None

if ev == SchedulerEvent.Type.ACTIVE_TASK:
# remove from task_ready
if ami_task:
ami_task.node.remove()
# store in ThisTask
self.exec_lib.this_task.ref = ami_task
elif ev == SchedulerEvent.Type.READY_TASK:
# add to task_ready
self.exec_lib.task_ready.add_head(ami_task.node)
elif ev == SchedulerEvent.Type.WAITING_TASK:
# add to task_wait
self.exec_lib.task_wait.add_head(ami_task.node)
elif ev == SchedulerEvent.Type.WAKE_UP_TASK:
# remove from task_wait and add to ready
ami_task.node.remove()
self.exec_lib.task_ready.add_head(ami_task.node)
elif ev == SchedulerEvent.Type.ADD_TASK:
self.exec_lib.task_ready.add_tail(ami_task.node)
Loading

0 comments on commit fcb543d

Please sign in to comment.