Class: ProcessShared::BinarySemaphore

Inherits:
Object
  • Object
show all
Extended by:
Forwardable, OpenWithSelf
Defined in:
lib/process_shared/binary_semaphore.rb

Overview

BinarySemaphore is identical to Semaphore except that its value is not permitted to rise above one (it may be either zero or one). When the value is at the maximum, calls to #post will raise an exception.

This is identical to a Semaphore but with extra error checking.

Instance Method Summary collapse

Methods included from OpenWithSelf

open

Constructor Details

#initialize(value = 1) ⇒ BinarySemaphore

Create a new semaphore with initial value +value+. After Kernel#fork, the semaphore will be shared across two (or more) processes. The semaphore must be closed with #close in each process that no longer needs the semaphore.

(An object finalizer is registered that will close the semaphore to avoid memory leaks, but this should be considered a last resort).

Parameters:

  • value (Integer) (defaults to: 1)

    the initial semaphore value



30
31
32
33
# File 'lib/process_shared/binary_semaphore.rb', line 30

def initialize(value = 1)
  raise ArgumentErrror 'value must be 0 or 1' if (value < 0 or value > 1)
  @sem = Semaphore.new(value)
end

Instance Method Details

#postObject

Increment from zero to one.

First, attempt to decrement. If this fails with EAGAIN, the semaphore was at zero, so continue with the post. If this succeeds, the semaphore was not at zero, so increment back to one and raise ProcesError (multiple workers may have acquired the semaphore at this point).



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/process_shared/binary_semaphore.rb', line 42

def post
  begin
    try_wait
    # oops, value was not zero...
    @sem.post
    raise ProcessError, 'post would raise value over bound'
  rescue Errno::EAGAIN
    # ok, value was zero
    @sem.post
  end
end