Class: ActiveSupport::ExecutionWrapper

Inherits:
Object
  • Object
show all
Includes:
Callbacks
Defined in:
activesupport/lib/active_support/execution_wrapper.rb

Direct Known Subclasses

Executor, Reloader

Defined Under Namespace

Classes: CompleteHook, RunHook

Constant Summary collapse

Null =

:nodoc:

Object.new

Constants included from Callbacks

Callbacks::CALLBACK_FILTER_TYPES

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Callbacks

#run_callbacks

Methods included from Concern

#append_features, #class_methods, extended, #included

Class Attribute Details

.activeObject

Returns the value of attribute active


92
93
94
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 92

def active
  @active
end

Class Method Details

.active?Boolean

:nodoc:

Returns:

  • (Boolean)

102
103
104
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 102

def self.active? # :nodoc:
  @active[Thread.current]
end

.inherited(other) ⇒ Object

:nodoc:


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

def self.inherited(other) # :nodoc:
  super
  other.active = Concurrent::Hash.new
end

.register_hook(hook, outer: false) ⇒ Object

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


47
48
49
50
51
52
53
54
55
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 47

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!Object

Run this execution.

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

Where possible, prefer wrap.


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 63

def self.run!
  if active?
    Null
  else
    new.tap do |instance|
      success = nil
      begin
        instance.run!
        success = true
      ensure
        instance.complete! unless success
      end
    end
  end
end

.to_complete(*args, &block) ⇒ Object


18
19
20
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 18

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

.to_run(*args, &block) ⇒ Object


14
15
16
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 14

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

.wrapObject

Perform the work in the supplied block as an execution.


80
81
82
83
84
85
86
87
88
89
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 80

def self.wrap
  return yield if active?

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

Instance Method Details

#complete!Object

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

Where possible, prefer wrap.


115
116
117
118
119
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 115

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

#run!Object

:nodoc:


106
107
108
109
# File 'activesupport/lib/active_support/execution_wrapper.rb', line 106

def run! # :nodoc:
  self.class.active[Thread.current] = true
  run_callbacks(:run)
end