Class: Gilmour::Waiter

Inherits:
Object
  • Object
show all
Defined in:
lib/gilmour/waiter.rb

Instance Method Summary collapse

Constructor Details

#initializeWaiter

Returns a new instance of Waiter.



3
4
5
6
7
8
# File 'lib/gilmour/waiter.rb', line 3

def initialize
  @count = 0
  @done = false
  @waiter_m = Mutex.new
  @waiter_c = ConditionVariable.new
end

Instance Method Details

#add(n = 1) ⇒ Object



10
11
12
# File 'lib/gilmour/waiter.rb', line 10

def add n = 1
  synchronize { @count += n }
end

#doneObject



14
15
16
17
18
19
20
21
22
# File 'lib/gilmour/waiter.rb', line 14

def done
  synchronize do
    @count -= 1
    if @count <= 0
      @done = true
      @waiter_c.broadcast
    end
  end
end

#signalObject



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/gilmour/waiter.rb', line 28

def signal
  if @count != 0
    raise 'Cannot use signal alongside add/done'
  end

  synchronize do
    @done = true
    @count = 0
    @waiter_c.signal
  end
end

#synchronize(&blk) ⇒ Object



24
25
26
# File 'lib/gilmour/waiter.rb', line 24

def synchronize(&blk)
  @waiter_m.synchronize(&blk)
end

#wait(timeout = nil) ⇒ Object



40
41
42
43
# File 'lib/gilmour/waiter.rb', line 40

def wait(timeout=nil)
  synchronize { @waiter_c.wait(@waiter_m, timeout) unless @done }
  yield if block_given?
end