class GoChanel::Chanel

Public Class Methods

new(cap_size = 1, objs = []) click to toggle source
# File lib/go_chanel/chanel.rb, line 10
def initialize(cap_size = 1, objs = [])
  raise ChanelException.new("can not create a 0 size channel") if cap_size < 1

  @obj_mutex = Mutex.new
  @close_mutex = Mutex.new
  @cap_size = cap_size
  @objs = objs
  @closed = false
end

Public Instance Methods

cap() click to toggle source
# File lib/go_chanel/chanel.rb, line 50
def cap
  @cap_size
end
close() click to toggle source
# File lib/go_chanel/chanel.rb, line 54
def close
  @close_mutex.synchronize do
    @closed = true
  end
end
pop() click to toggle source
# File lib/go_chanel/chanel.rb, line 33
def pop
  while @objs.count == 0 do
    return nil, false if @closed
    sleep(0.1)
  end

  obj = @obj_mutex.synchronize do
    @objs.shift
  end

  return obj, true
end
push(obj) click to toggle source
# File lib/go_chanel/chanel.rb, line 20
def push(obj)
  raise ChanelException.new("can not push to closed channel") if @closed

  while @objs.count >= @cap_size do
    raise ChanelException.new("can not push to closed channel") if @closed
    sleep(0.1)
  end

  @obj_mutex.synchronize do
    @objs.push(obj)
  end
end
size() click to toggle source
# File lib/go_chanel/chanel.rb, line 46
def size
  @objs.count
end