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

<<(process)
Alias for: enqueue
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