class Emit::Scheduler
Attributes
current[R]
Public Class Methods
new()
click to toggle source
# File lib/emit/scheduler.rb, line 18 def initialize reset! end
Public Instance Methods
activate(process)
click to toggle source
# File lib/emit/scheduler.rb, line 50 def activate(process) @next_queue << process end
enqueue(process)
click to toggle source
# File lib/emit/scheduler.rb, line 31 def enqueue(process) @new_queue << process end
Also aliased as: <<
get_next()
click to toggle source
# File lib/emit/scheduler.rb, line 54 def get_next if !@new_queue.empty? @fiber elsif !@next_queue.empty? @current = @next_queue.shift @current else @fiber end end
join(processes)
click to toggle source
# File lib/emit/scheduler.rb, line 36 def join(processes) tmp = @current @done = false processes.each do |process| until process.executed? raise DeadlockException if @done get_next.transfer end end @current = tmp end
reset!()
click to toggle source
# File lib/emit/scheduler.rb, line 22 def reset! @root = MainProcess.instance @current = @root @new_queue = [] @next_queue = [] @fiber = Fiber.new { start_mainloop } @done = false end
Private Instance Methods
start_mainloop()
click to toggle source
# File lib/emit/scheduler.rb, line 67 def start_mainloop loop do if !@new_queue.empty? @current = @new_queue.pop @current.transfer elsif !@next_queue.empty? @current = @next_queue.pop @current.transfer end if @new_queue.empty? && @next_queue.empty? @done = true @root.fiber.transfer end end end