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