Class: FiberMon::RBFiberMon::ConditionVariable

Inherits:
Object
  • Object
show all
Defined in:
lib/fiber-mon.rb

Instance Method Summary collapse

Constructor Details

#initialize(monitor) ⇒ ConditionVariable

Returns a new instance of ConditionVariable.



201
202
203
204
205
206
# File 'lib/fiber-mon.rb', line 201

def initialize(monitor)
  @mon = monitor

  @waitings = []
  @waitings_mx = Mutex.new
end

Instance Method Details

#broadcast(&block) ⇒ Object



224
225
226
227
228
229
230
231
232
233
234
# File 'lib/fiber-mon.rb', line 224

def broadcast(&block)
  @waitings_mx.synchronize do
    if block_given?
      yield
    end

    return if @waitings.empty?
    fbs, @waitings = @waitings, []
    @mon.entry_wait_resume(*fbs)
  end
end

#signal(&block) ⇒ Object



212
213
214
215
216
217
218
219
220
221
222
# File 'lib/fiber-mon.rb', line 212

def signal(&block)
  @waitings_mx.synchronize do
    if block_given?
      yield
    end

    if fb =  @waitings.shift
      @mon.entry_wait_resume(fb)
    end
  end
end

#synchronize(&block) ⇒ Object



208
209
210
# File 'lib/fiber-mon.rb', line 208

def synchronize(&block)
  @waitings_mx.synchronize(&block)
end

#waitObject



236
237
238
239
240
241
# File 'lib/fiber-mon.rb', line 236

def wait
  @waitings_mx.synchronize do
    @waitings.push @mon.current
  end
  @mon.fiber_yield
end

#wait_until(&cond) ⇒ Object



243
244
245
246
247
# File 'lib/fiber-mon.rb', line 243

def wait_until(&cond)
  until cond.call
    wait
  end 
end

#wait_while(&cond) ⇒ Object



249
250
251
252
253
# File 'lib/fiber-mon.rb', line 249

def wait_while(&cond)
  while cond.call
    wait
  end 
end