Skip to Content Skip to Search

class ActiveSupport::ExecutionWrapper

Inherits From

Public class methods

Register an object to be invoked during both the run and complete steps.

hook.complete will be passed the value returned from hook.run, and will only be invoked if run has previously been called. (Mostly, this means it won’t be invoked if an exception occurs in a preceding to_run block; all ordinary to_complete blocks are invoked in that situation.)

Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 50
def self.register_hook(hook, outer: false)
  if outer
    to_run RunHook.new(hook), prepend: true
    to_complete :after, CompleteHook.new(hook)
  else
    to_run RunHook.new(hook)
    to_complete CompleteHook.new(hook)
  end
end

Run this execution.

Returns an instance, whose complete! method must be invoked after the work has been performed.

Where possible, prefer wrap.

Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 66
def self.run!(reset: false)
  if reset
    lost_instance = IsolatedExecutionState.delete(active_key)
    lost_instance&.complete!
  else
    return Null if active?
  end

  new.tap do |instance|
    success = nil
    begin
      instance.run!
      success = true
    ensure
      instance.complete! unless success
    end
  end
end
Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 21
def self.to_complete(*args, &block)
  set_callback(:complete, *args, &block)
end
Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 17
def self.to_run(*args, &block)
  set_callback(:run, *args, &block)
end

Perform the work in the supplied block as an execution.

Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 86
def self.wrap(source: "application.active_support")
  return yield if active?

  instance = run!
  begin
    yield
  rescue => error
    error_reporter&.report(error, handled: false, source: source)
    raise
  ensure
    instance.complete!
  end
end

Public instance methods

Complete this in-flight execution. This method must be called exactly once on the result of any call to run!.

Where possible, prefer wrap.

Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 135
def complete!
  complete
ensure
  IsolatedExecutionState.delete(self.class.active_key)
end

Definition files