class Concurrent::MutexSemaphore
@!macro semaphore @!visibility private @!macro internal_implementation_note
Public Class Methods
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 12 def initialize(count) Utility::NativeInteger.ensure_integer_and_bounds count super() synchronize { ns_initialize count } end
@!macro semaphore_method_initialize
Calls superclass method
Public Instance Methods
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 20 def acquire(permits = 1) Utility::NativeInteger.ensure_integer_and_bounds permits Utility::NativeInteger.ensure_positive permits synchronize do try_acquire_timed(permits, nil) nil end end
@!macro semaphore_method_acquire
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 31 def available_permits synchronize { @free } end
@!macro semaphore_method_available_permits
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 40 def drain_permits synchronize do @free.tap { |_| @free = 0 } end end
@!macro semaphore_method_drain_permits
Acquires and returns all permits that are immediately available. @return [Integer]
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 83 def reduce_permits(reduction) Utility::NativeInteger.ensure_integer_and_bounds reduction Utility::NativeInteger.ensure_positive reduction synchronize { @free -= reduction } nil end
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
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 61 def release(permits = 1) Utility::NativeInteger.ensure_integer_and_bounds permits Utility::NativeInteger.ensure_positive permits synchronize do @free += permits permits.times { ns_signal } end nil end
@!macro semaphore_method_release
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 47 def try_acquire(permits = 1, timeout = nil) Utility::NativeInteger.ensure_integer_and_bounds permits Utility::NativeInteger.ensure_positive permits synchronize do if timeout.nil? try_acquire_now(permits) else try_acquire_timed(permits, timeout) end end end
@!macro semaphore_method_try_acquire
Protected Instance Methods
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 94 def ns_initialize(count) @free = count end
@!visibility private
Private Instance Methods
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 101 def try_acquire_now(permits) if @free >= permits @free -= permits true else false end end
@!visibility private
Source
# File lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb, line 111 def try_acquire_timed(permits, timeout) ns_wait_until(timeout) { try_acquire_now(permits) } end
@!visibility private