mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
c91c266872
This reduce the stack size which is beneficial for exceptions performance. See: https://gist.github.com/byroot/cb3bcadcc3701c2518d002fb8d3a4e7a However the cop is unsafe because it might change the block arity, so it can run into some false positives.
49 lines
1.1 KiB
Ruby
49 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "active_support/concurrency/share_lock"
|
|
|
|
module ActiveSupport # :nodoc:
|
|
module Dependencies # :nodoc:
|
|
class Interlock
|
|
def initialize # :nodoc:
|
|
@lock = ActiveSupport::Concurrency::ShareLock.new
|
|
end
|
|
|
|
def loading(&block)
|
|
@lock.exclusive(purpose: :load, compatible: [:load], after_compatible: [:load], &block)
|
|
end
|
|
|
|
def unloading(&block)
|
|
@lock.exclusive(purpose: :unload, compatible: [:load, :unload], after_compatible: [:load, :unload], &block)
|
|
end
|
|
|
|
def start_unloading
|
|
@lock.start_exclusive(purpose: :unload, compatible: [:load, :unload])
|
|
end
|
|
|
|
def done_unloading
|
|
@lock.stop_exclusive(compatible: [:load, :unload])
|
|
end
|
|
|
|
def start_running
|
|
@lock.start_sharing
|
|
end
|
|
|
|
def done_running
|
|
@lock.stop_sharing
|
|
end
|
|
|
|
def running(&block)
|
|
@lock.sharing(&block)
|
|
end
|
|
|
|
def permit_concurrent_loads(&block)
|
|
@lock.yield_shares(compatible: [:load], &block)
|
|
end
|
|
|
|
def raw_state(&block) # :nodoc:
|
|
@lock.raw_state(&block)
|
|
end
|
|
end
|
|
end
|
|
end
|