module Datadog::Profiling::Ext::Forking::Kernel

Extensions for kernel

Constants

FORK_STAGES

Public Instance Methods

at_fork(stage = :prepare, &block) click to toggle source
# File lib/ddtrace/profiling/ext/forking.rb, line 78
def at_fork(stage = :prepare, &block)
  raise ArgumentError, 'Bad \'stage\' for ::at_fork' unless FORK_STAGES.include?(stage)

  at_fork_blocks[stage] = [] unless at_fork_blocks.key?(stage)
  at_fork_blocks[stage] << block
end
at_fork_blocks() click to toggle source
# File lib/ddtrace/profiling/ext/forking.rb, line 87
def at_fork_blocks
  # Blocks should be shared across all users of this module,
  # e.g. Process#fork, Kernel#fork, etc. should all invoke the same callbacks.
  # rubocop:disable Style/ClassVars
  @@at_fork_blocks ||= {}
  # rubocop:enable Style/ClassVars
end
fork() { || ... } click to toggle source
Calls superclass method
# File lib/ddtrace/profiling/ext/forking.rb, line 42
def fork
  # If a block is provided, it must be wrapped to trigger callbacks.
  child_block = if block_given?
                  proc do
                    # Trigger :child callback
                    at_fork_blocks[:child].each(&:call) if at_fork_blocks.key?(:child)

                    # Invoke original block
                    yield
                  end
                end

  # Trigger :prepare callback
  at_fork_blocks[:prepare].each(&:call) if at_fork_blocks.key?(:prepare)

  # Start fork
  # If a block is provided, use the wrapped version.
  result = child_block.nil? ? super : super(&child_block)

  # Trigger correct callbacks depending on whether we're in the parent or child.
  # If we're in the fork, result = nil: trigger child callbacks.
  # If we're in the parent, result = fork PID: trigger parent callbacks.
  # rubocop:disable Style/IfInsideElse
  if result.nil?
    # Trigger :child callback
    at_fork_blocks[:child].each(&:call) if at_fork_blocks.key?(:child)
  else
    # Trigger :parent callback
    at_fork_blocks[:parent].each(&:call) if at_fork_blocks.key?(:parent)
  end
  # rubocop:enable Style/IfInsideElse

  # Return PID from #fork
  result
end