Sha256: 0621577e433ca5879e4afed67ff6588238fdcde86fe77aa7ab9d325b0f4a5bae
Contents?: true
Size: 1.62 KB
Versions: 1
Compression:
Stored size: 1.62 KB
Contents
# coding: utf-8 require 'thread' require 'keeper/version' # If you are looking for the documentation you’ll most likely want {Keeper::Keeper}. # module Keeper # A thread-safe blocking event pattern for your pleasure. # # @example # events = Keeper::Keeper.new # # [:pang, :boom, :pow].each_with_index do |event, i| # this_many = i + 1 # this_many.times do |i| # Thread.new do # events.wait_for(event) # puts "#{event}:#{i}!" # events.fire(event == :pang ? :boom : :pow) # end # end # puts "#{this_many} threads waiting for #{event}" # end # # print "Pause for effect" # 3.times { sleep 1 and print "." } # puts # # events.fire(:pang) # Thread.list.reject { |th| th == Thread.current }.map(&:join) # class Keeper # Create a new {Keeper::Keeper} instance. def initialize @waiting = {} @mootex = Mutex.new end # Fires the given event, waking up the waiting threads. # # @param [Symbol] event # @return [Keeper] def fire(event) @mootex.synchronize do condition = @waiting.delete(event) condition.broadcast unless condition.nil? end self end # Waits for the given event to fire. # # @param [Symbol] event # @return [Keeper] def wait_for(event) @mootex.synchronize do (@waiting[event] ||= ConditionVariable.new).wait(@mootex) end self end # A list of all events currently being waited for. # # @return [Array<Symbol>] def waiting @mootex.synchronize { @waiting.keys } end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
keeper-1.0.0 | lib/keeper.rb |