123456789_123456789_123456789_123456789_123456789_

Class: ActiveSupport::ExecutionWrapper

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
self, Callbacks
Inherits: Object
Defined in: activesupport/lib/active_support/execution_wrapper.rb

Constant Summary

Callbacks - Included

CALLBACK_FILTER_TYPES

Callbacks - Attributes & Methods

Class Attribute Summary

Class Method Summary

DescendantsTracker - self

clear, descendants, direct_descendants,
store_inherited

This is the only method that is not thread safe, but is only ever called during the eager loading phase.

subclasses

Instance Method Summary

Callbacks - Included

#run_callbacks

Runs the callbacks for the given event.

Class Attribute Details

.__callbacks (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/callbacks.rb', line 67

class_attribute :__callbacks, instance_writer: false, default: {}

.__callbacks?Boolean (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/callbacks.rb', line 67

class_attribute :__callbacks, instance_writer: false, default: {}

.active (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 98

attr_accessor :active

Class Method Details

.register_hook(hook, outer: false)

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.)

[ 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!(reset: false)

Run this execution.

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

Where possible, prefer .wrap.

[ GitHub ]

  
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 66

def self.run!(reset: false)
  if reset
    lost_instance = active.delete(Thread.current)
    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

.to_complete(*args, &block)

[ GitHub ]

  
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 21

def self.to_complete(*args, &block)
  set_callback(:complete, *args, &block)
end

.to_run(*args, &block)

[ GitHub ]

  
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 17

def self.to_run(*args, &block)
  set_callback(:run, *args, &block)
end

.wrap

Perform the work in the supplied block as an execution.

[ GitHub ]

  
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 86

def self.wrap
  return yield if active?

  instance = run!
  begin
    yield
  ensure
    instance.complete!
  end
end

Instance Attribute Details

#__callbacks (readonly)

[ GitHub ]

  
# File 'activesupport/lib/active_support/callbacks.rb', line 67

class_attribute :__callbacks, instance_writer: false, default: {}

#__callbacks?Boolean (readonly)

[ GitHub ]

  
# File 'activesupport/lib/active_support/callbacks.rb', line 67

class_attribute :__callbacks, instance_writer: false, default: {}

Instance Method Details

#complete!

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

Where possible, prefer .wrap.

[ GitHub ]

  
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 121

def complete!
  run_callbacks(:complete)
ensure
  self.class.active.delete Thread.current
end