Sha256: c0d3b48646052f22283f9e548336fd7278895fb2a429d901da9990fe5d3bac7d

Contents?: true

Size: 1.72 KB

Versions: 13

Compression:

Stored size: 1.72 KB

Contents

# frozen_string_literal: true

module Datadog
  module Core
    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.
          if RUBY_VERSION >= '3'
            def initialize(*args, **kwargs, &block)
              super(*args, **kwargs, &block)
              update_fork_pid!
            end
          else
            def initialize(*args, &block)
              super(*args, &block)
              update_fork_pid!
            end
          end
        end
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
datadog-2.9.0 lib/datadog/core/utils/forking.rb
datadog-2.8.0 lib/datadog/core/utils/forking.rb
datadog-2.7.1 lib/datadog/core/utils/forking.rb
datadog-2.7.0 lib/datadog/core/utils/forking.rb
datadog-2.6.0 lib/datadog/core/utils/forking.rb
datadog-2.5.0 lib/datadog/core/utils/forking.rb
datadog-2.4.0 lib/datadog/core/utils/forking.rb
datadog-2.3.0 lib/datadog/core/utils/forking.rb
datadog-2.2.0 lib/datadog/core/utils/forking.rb
datadog-2.1.0 lib/datadog/core/utils/forking.rb
datadog-2.0.0 lib/datadog/core/utils/forking.rb
datadog-2.0.0.beta2 lib/datadog/core/utils/forking.rb
datadog-2.0.0.beta1 lib/datadog/core/utils/forking.rb