class Garcon::Event
When an ‘Event` is created it is in the `unset` state. Threads can choose to `#wait` on the event, blocking until released by another thread. When one thread wants to alert all blocking threads it calls the `#set` method which will then wake up all listeners. Once an `Event` has been set it remains set. New threads calling `#wait` will return immediately. An `Event` may be `#reset` at any time once it has been set.
Public Class Methods
Creates a new ‘Event` in the unset state. Threads calling `#wait` on the `Event` will block.
# File lib/garcon/task/event.rb, line 37 def initialize @set = false @mutex = Mutex.new @condition = Condition.new end
Public Instance Methods
Reset a previously set event back to the ‘unset` state. Has no effect if the `Event` has not yet been set.
@return [Boolean]
should always return `true`
# File lib/garcon/task/event.rb, line 90 def reset @mutex.lock @set = false true ensure @mutex.unlock end
Trigger the event, setting the state to ‘set` and releasing all threads waiting on the event. Has no effect if the `Event` has already been set.
@return [Boolean]
should always return `true`
# File lib/garcon/task/event.rb, line 59 def set @mutex.lock unless @set @set = true @condition.broadcast end true ensure @mutex.unlock end
Is the object in the set state?
@return [Boolean]
indicating whether or not the `Event` has been set
# File lib/garcon/task/event.rb, line 47 def set? @mutex.lock @set ensure @mutex.unlock end
# File lib/garcon/task/event.rb, line 70 def try? @mutex.lock if @set false else @set = true @condition.broadcast true end ensure @mutex.unlock end
Wait a given number of seconds for the ‘Event` to be set by another thread. Will wait forever when no `timeout` value is given. Returns immediately if the `Event` has already been set.
@return [Boolean]
true if the `Event` was set before timeout else false
# File lib/garcon/task/event.rb, line 104 def wait(timeout = nil) @mutex.lock unless @set remaining = Condition::Result.new(timeout) while !@set && remaining.can_wait? remaining = @condition.wait(@mutex, remaining.remaining_time) end end @set ensure @mutex.unlock end