Class: QuackConcurrency::UninterruptibleConditionVariable

Inherits:
Object
  • Object
show all
Defined in:
lib/quack_concurrency/uninterruptible_condition_variable.rb

Instance Method Summary collapse

Constructor Details

#initializeUninterruptibleConditionVariable

Returns a new instance of UninterruptibleConditionVariable.



4
5
6
7
# File 'lib/quack_concurrency/uninterruptible_condition_variable.rb', line 4

def initialize
  @waiting_threads_sleepers = []
  @mutex = ::Mutex.new
end

Instance Method Details

#any_waiting_threads?Boolean

Returns:

  • (Boolean)


9
10
11
# File 'lib/quack_concurrency/uninterruptible_condition_variable.rb', line 9

def any_waiting_threads?
  waiting_threads_count >= 1
end

#broadcastObject



13
14
15
16
17
18
# File 'lib/quack_concurrency/uninterruptible_condition_variable.rb', line 13

def broadcast
  @mutex.synchronize do
    signal_next until @waiting_threads_sleepers.empty?
  end
  self
end

#signalObject



20
21
22
23
24
25
# File 'lib/quack_concurrency/uninterruptible_condition_variable.rb', line 20

def signal
  @mutex.synchronize do
    signal_next if @waiting_threads_sleepers.any?
  end
  self
end

#wait(mutex = nil, timeout = nil) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/quack_concurrency/uninterruptible_condition_variable.rb', line 27

def wait(mutex = nil, timeout = nil)
  validate_mutex(mutex)
  if timeout != nil && !timeout.is_a?(Numeric)
    raise ArgumentError, "'timeout' argument must be nil or a Numeric"
  end
  sleeper = UninterruptibleSleeper.for_current
  @mutex.synchronize { @waiting_threads_sleepers.push(sleeper) }
  if mutex
    if mutex.respond_to?(:unlock!)
      mutex.unlock! { sleep(sleeper, timeout) }
    else
      mutex.unlock
      sleep(sleeper, timeout)
      mutex.lock
    end
  else
    sleep(sleeper, timeout)
  end
  @mutex.synchronize { @waiting_threads_sleepers.delete(sleeper) }
  self
end

#waiting_threads_countObject



49
50
51
# File 'lib/quack_concurrency/uninterruptible_condition_variable.rb', line 49

def waiting_threads_count
  @waiting_threads_sleepers.length
end