Sha256: 21a7359dd5b590660e440ee08a897345b5f7f8ff2d0db231fc951ea05edf5a0c

Contents?: true

Size: 1.59 KB

Versions: 8

Compression:

Stored size: 1.59 KB

Contents

# frozen_string_literal: true


module ActiveSupport
  module IsolatedExecutionState # :nodoc:
    @isolation_level = nil

    Thread.attr_accessor :active_support_execution_state
    Fiber.attr_accessor :active_support_execution_state

    class << self
      attr_reader :isolation_level, :scope

      def isolation_level=(level)
        return if level == @isolation_level

        unless %i(thread fiber).include?(level)
          raise ArgumentError, "isolation_level must be `:thread` or `:fiber`, got: `#{level.inspect}`"
        end

        clear if @isolation_level

        @scope =
          case level
          when :thread; Thread
          when :fiber; Fiber
          end

        @isolation_level = level
      end

      def unique_id
        self[:__id__] ||= Object.new
      end

      def [](key)
        state[key]
      end

      def []=(key, value)
        state[key] = value
      end

      def key?(key)
        state.key?(key)
      end

      def delete(key)
        state.delete(key)
      end

      def clear
        state.clear
      end

      def context
        scope.current
      end

      def share_with(other)
        # Action Controller streaming spawns a new thread and copy thread locals.
        # We do the same here for backward compatibility, but this is very much a hack
        # and streaming should be rethought.
        context.active_support_execution_state = other.active_support_execution_state.dup
      end

      private
        def state
          context.active_support_execution_state ||= {}
        end
    end

    self.isolation_level = :thread
  end
end

Version data entries

8 entries across 8 versions & 2 rubygems

Version Path
activesupport-8.0.0.beta1 lib/active_support/isolated_execution_state.rb
omg-activesupport-8.0.0.alpha9 lib/active_support/isolated_execution_state.rb
omg-activesupport-8.0.0.alpha8 lib/active_support/isolated_execution_state.rb
omg-activesupport-8.0.0.alpha7 lib/active_support/isolated_execution_state.rb
omg-activesupport-8.0.0.alpha4 lib/active_support/isolated_execution_state.rb
omg-activesupport-8.0.0.alpha3 lib/active_support/isolated_execution_state.rb
omg-activesupport-8.0.0.alpha2 lib/active_support/isolated_execution_state.rb
omg-activesupport-8.0.0.alpha1 lib/active_support/isolated_execution_state.rb