class Concurrent::MutexSemaphore
@!macro semaphore @!visibility private @!macro internal_implementation_note
Public Class Methods
new(count)
click to toggle source
@!macro semaphore_method_initialize
Calls superclass method
# File lib/concurrent/atomic/mutex_semaphore.rb, line 11 def initialize(count) unless count.is_a?(Fixnum) && count >= 0 fail ArgumentError, 'count must be an non-negative integer' end super() synchronize { ns_initialize count } end
Public Instance Methods
acquire(permits = 1)
click to toggle source
@!macro semaphore_method_acquire
# File lib/concurrent/atomic/mutex_semaphore.rb, line 20 def acquire(permits = 1) unless permits.is_a?(Fixnum) && permits > 0 fail ArgumentError, 'permits must be an integer greater than zero' end synchronize do try_acquire_timed(permits, nil) nil end end
available_permits()
click to toggle source
@!macro semaphore_method_available_permits
# File lib/concurrent/atomic/mutex_semaphore.rb, line 31 def available_permits synchronize { @free } end
drain_permits()
click to toggle source
@!macro semaphore_method_drain_permits
Acquires and returns all permits that are immediately available. @return [Integer]
# File lib/concurrent/atomic/mutex_semaphore.rb, line 40 def drain_permits synchronize do @free.tap { |_| @free = 0 } end end
reduce_permits(reduction)
click to toggle source
Shrinks the number of available permits by the indicated reduction.
@param [Fixnum] reduction Number of permits to remove.
@raise [ArgumentError] if `reduction` is not an integer or is negative
@raise [ArgumentError] if `@free` - `@reduction` is less than zero
@return [nil]
@!visibility private
# File lib/concurrent/atomic/mutex_semaphore.rb, line 83 def reduce_permits(reduction) unless reduction.is_a?(Fixnum) && reduction >= 0 fail ArgumentError, 'reduction must be an non-negative integer' end synchronize { @free -= reduction } nil end
release(permits = 1)
click to toggle source
@!macro semaphore_method_release
# File lib/concurrent/atomic/mutex_semaphore.rb, line 61 def release(permits = 1) unless permits.is_a?(Fixnum) && permits > 0 fail ArgumentError, 'permits must be an integer greater than zero' end synchronize do @free += permits permits.times { ns_signal } end nil end
try_acquire(permits = 1, timeout = nil)
click to toggle source
@!macro semaphore_method_try_acquire
# File lib/concurrent/atomic/mutex_semaphore.rb, line 47 def try_acquire(permits = 1, timeout = nil) unless permits.is_a?(Fixnum) && permits > 0 fail ArgumentError, 'permits must be an integer greater than zero' end synchronize do if timeout.nil? try_acquire_now(permits) else try_acquire_timed(permits, timeout) end end end
Protected Instance Methods
ns_initialize(count)
click to toggle source
@!visibility private
# File lib/concurrent/atomic/mutex_semaphore.rb, line 94 def ns_initialize(count) @free = count end
Private Instance Methods
try_acquire_now(permits)
click to toggle source
@!visibility private
# File lib/concurrent/atomic/mutex_semaphore.rb, line 101 def try_acquire_now(permits) if @free >= permits @free -= permits true else false end end
try_acquire_timed(permits, timeout)
click to toggle source
@!visibility private
# File lib/concurrent/atomic/mutex_semaphore.rb, line 111 def try_acquire_timed(permits, timeout) ns_wait_until(timeout) { try_acquire_now(permits) } end