lib/theatre/invocation.rb in adhearsion-0.8.3 vs lib/theatre/invocation.rb in adhearsion-0.8.4
- old
+ new
@@ -1,20 +1,20 @@
require 'theatre/guid'
require 'thread'
require 'monitor'
module Theatre
-
+
##
# An Invocation is an object which Theatre generates and returns from Theatre#trigger.
#
class Invocation
-
+
attr_reader :queued_time, :started_time, :finished_time, :unique_id, :callback, :namespace, :error, :returned_value
-
+
class InvalidStateError < Exception; end
-
+
##
# Create a new Invocation.
#
# @param [String] namespace The "/foo/bar/qaz" path to the namespace to which this Invocation belongs.
# @param [Proc] callback The block which should be executed by an Actor scheduler.
@@ -25,38 +25,38 @@
@payload = payload
@unique_id = new_guid.freeze
@callback = callback
@current_state = :new
@state_lock = Mutex.new
-
+
# Used just to protect access to the @returned_value instance variable
@returned_value_lock = Monitor.new
-
+
# Used when wait() is called to notify all waiting threads by using a ConditionVariable
@returned_value_blocker = @returned_value_lock.new_cond#Monitor::ConditionVariable.new @returned_value_lock
end
-
+
def queued
with_state_lock do
raise InvalidStateError unless @current_state == :new
@current_state = :queued
@queued_time = Time.now.freeze
end
true
end
-
+
def current_state
with_state_lock { @current_state }
end
-
+
def start
with_state_lock do
raise InvalidStateError unless @current_state == :queued
@current_state = :running
end
@started_time = Time.now.freeze
-
+
begin
self.returned_value = if @payload.equal? :theatre_no_payload
@callback.call
else
@callback.call @payload
@@ -66,24 +66,24 @@
with_state_lock { @current_state = :error }
ensure
@finished_time = Time.now.freeze
end
end
-
+
def execution_duration
return nil unless @finished_time
@finished_time - @started_time
end
-
+
def error?
current_state.equal? :error
end
-
+
def success?
current_state.equal? :success
end
-
+
##
# When this Invocation has been queued, started, and entered either the :success or :error state, this method will
# finally return. Until then, it blocks the Thread.
#
# @return [Object] The result of invoking this Invocation's callback
@@ -92,13 +92,13 @@
with_returned_value_lock { return @returned_value if defined? @returned_value }
@returned_value_blocker.wait
# Return the returned_value
with_returned_value_lock { @returned_value }
end
-
+
protected
-
+
##
# Protected setter which does some other housework when the returned value is found (such as notifying wait()ers)
#
# @param [returned_value] The value to set this returned value to.
#
@@ -106,16 +106,16 @@
with_returned_value_lock do
@returned_value = returned_value
@returned_value_blocker.broadcast
end
end
-
+
def with_returned_value_lock(&block)
@returned_value_lock.synchronize(&block)
end
-
+
def with_state_lock(&block)
@state_lock.synchronize(&block)
end
-
+
end
end