module ActiveSupport::IsolatedExecutionState

def [](key)

def [](key)
  current[key]
end

def []=(key, value)

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

def clear

def clear
  current.clear
end

def current_fiber

def current_fiber
  Fiber.current.active_support_execution_state ||= {}
end

def current_thread

def current_thread
  Thread.current.active_support_execution_state ||= {}
end

def delete(key)

def delete(key)
  current.delete(key)
end

def isolation_level=(level)

def isolation_level=(level)
  unless %i(thread fiber).include?(level)
    raise ArgumentError, "isolation_level must be `:thread` or `:fiber`, got: `#{level.inspect}`"
  end
  if level != isolation_level
    clear
    singleton_class.alias_method(:current, "current_#{level}")
    singleton_class.send(:private, :current)
    @isolation_level = level
  end
end

def key?(key)

def key?(key)
  current.key?(key)
end

def share_with(other)

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 = @isolation_level == :thread ? Thread.current : Fiber.current
  context.active_support_execution_state = other.active_support_execution_state.dup
end

def unique_id

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