e1af94620ca0f8e61b3c28eb3cbc91b112bacf1f
1 __all__
= ["Process", "Timeline"]
5 def __init__(self
, *, is_comb
):
11 self
.runnable
= self
.is_comb
15 raise NotImplementedError
21 self
.deadlines
= dict()
25 self
.deadlines
.clear()
27 def at(self
, run_at
, process
):
28 assert process
not in self
.deadlines
29 self
.deadlines
[process
] = run_at
31 def delay(self
, delay_by
, process
):
35 run_at
= self
.now
+ delay_by
36 self
.at(run_at
, process
)
39 nearest_processes
= set()
40 nearest_deadline
= None
41 for process
, deadline
in self
.deadlines
.items():
43 if nearest_deadline
is not None:
44 nearest_processes
.clear()
45 nearest_processes
.add(process
)
46 nearest_deadline
= self
.now
48 elif nearest_deadline
is None or deadline
<= nearest_deadline
:
49 assert deadline
>= self
.now
50 if nearest_deadline
is not None and deadline
< nearest_deadline
:
51 nearest_processes
.clear()
52 nearest_processes
.add(process
)
53 nearest_deadline
= deadline
55 if not nearest_processes
:
58 for process
in nearest_processes
:
59 process
.runnable
= True
60 del self
.deadlines
[process
]
61 self
.now
= nearest_deadline