class Pwrake::FiberQueue

Public Class Methods

new(log=nil) click to toggle source
# File lib/pwrake/branch/fiber_queue.rb, line 10
def initialize(log=nil)
  @q = []
  @waiter = []
  @finished = false
  @log = log
end

Public Instance Methods

deq() click to toggle source
# File lib/pwrake/branch/fiber_queue.rb, line 26
def deq
  while @q.empty?
    return nil if @finished
    @waiter.push(Fiber.current)
    Fiber.yield
  end
  return @q.shift
end
deq_nonblock() click to toggle source
# File lib/pwrake/branch/fiber_queue.rb, line 35
def deq_nonblock
  @q.shift
end
enq(x) click to toggle source
# File lib/pwrake/branch/fiber_queue.rb, line 17
def enq(x)
  if @finished
    raise FiberQueueError,"cannot enq to already finished queue"
  end
  @q.push(x)
  f = @waiter.shift
  f.resume if f
end
finish() click to toggle source
# File lib/pwrake/branch/fiber_queue.rb, line 39
def finish
  @finished = true
  while f = @waiter.shift
    begin
      f.resume
    rescue => exc
      if @log
        @log.error(([exc.to_s]+exc.backtrace).join("\n"))
      end
    end
  end
end