Sha256: 82710d87b63cbf8ea7d5f8c8e67cdba8ce7d95b1fa0bee7d544a44aa49fb5109

Contents?: true

Size: 1.37 KB

Versions: 5

Compression:

Stored size: 1.37 KB

Contents

# typed: false
module Datadog
  module Utils
    # Helper methods for managing forking behavior
    module Forking
      def self.included(base)
        base.prepend(ClassExtensions) if base.is_a?(Class)
      end

      def self.extended(base)
        # Explicitly update PID here because there's a case where
        # the code path that lazily updates the PID may not be exercised
        # until after a fork occurs, thus causing the event to be missed.
        # By eagerly setting this, we avoid this scenario.
        base.update_fork_pid!
      end

      def after_fork!
        if forked?
          yield
          update_fork_pid!
          true
        else
          false
        end
      end

      def forked?
        Process.pid != fork_pid
      end

      def update_fork_pid!
        @fork_pid = Process.pid
      end

      def fork_pid
        @fork_pid ||= Process.pid
      end

      # Adds additional functionality for Classes that implement Forking
      module ClassExtensions
        # Addresses an edge case where forking before invoking #update_fork_pid! on the
        # object will cause forking to not be detected in the fork when it should have.
        #
        # This wrapper prevents this by initializing the fork PID when the object is created.
        def initialize(*args, &block)
          super
          update_fork_pid!
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ddtrace-0.54.2 lib/ddtrace/utils/forking.rb
ddtrace-0.54.1 lib/ddtrace/utils/forking.rb
ddtrace-0.54.0 lib/ddtrace/utils/forking.rb
ddtrace-0.53.0 lib/ddtrace/utils/forking.rb
ddtrace-0.52.0 lib/ddtrace/utils/forking.rb