Class: ActiveRecord::ConnectionAdapters::ConnectionPool::BiasableQueue::BiasedConditionVariable

Inherits:
Object
  • Object
show all
Defined in:
activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb

Overview

:nodoc:

Instance Method Summary collapse

Constructor Details

#initialize(lock, other_cond, preferred_thread) ⇒ BiasedConditionVariable

semantics of condition variables guarantee that broadcast, broadcast_on_biased, signal and wait methods are only called while holding a lock



142
143
144
145
146
147
# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb', line 142

def initialize(lock, other_cond, preferred_thread)
  @real_cond = lock.new_cond
  @other_cond = other_cond
  @preferred_thread = preferred_thread
  @num_waiting_on_real_cond = 0
end

Instance Method Details

#broadcastObject



149
150
151
152
# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb', line 149

def broadcast
  broadcast_on_biased
  @other_cond.broadcast
end

#broadcast_on_biasedObject



154
155
156
157
# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb', line 154

def broadcast_on_biased
  @num_waiting_on_real_cond = 0
  @real_cond.broadcast
end

#signalObject



159
160
161
162
163
164
165
166
# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb', line 159

def signal
  if @num_waiting_on_real_cond > 0
    @num_waiting_on_real_cond -= 1
    @real_cond
  else
    @other_cond
  end.signal
end

#wait(timeout) ⇒ Object



168
169
170
171
172
173
174
175
# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb', line 168

def wait(timeout)
  if Thread.current == @preferred_thread
    @num_waiting_on_real_cond += 1
    @real_cond
  else
    @other_cond
  end.wait(timeout)
end