57 lines
1.0 KiB
Ruby
57 lines
1.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Sass
|
|
# The {ForkTracker} module.
|
|
#
|
|
# It tracks objects that need to be closed after `Process.fork`.
|
|
module ForkTracker
|
|
module_function
|
|
|
|
if Process.respond_to?(:_fork)
|
|
SET = Set.new.compare_by_identity
|
|
|
|
MUTEX = Mutex.new
|
|
|
|
private_constant :SET, :MUTEX
|
|
|
|
def add(object)
|
|
MUTEX.synchronize do
|
|
SET.add(object)
|
|
end
|
|
end
|
|
|
|
def delete(object)
|
|
MUTEX.synchronize do
|
|
SET.delete(object)
|
|
end
|
|
end
|
|
|
|
def each(&)
|
|
MUTEX.synchronize do
|
|
SET.to_a
|
|
end.each(&)
|
|
end
|
|
|
|
# The {CoreExt} module.
|
|
#
|
|
# It closes objects after `Process.fork`.
|
|
module CoreExt
|
|
def _fork
|
|
pid = super
|
|
ForkTracker.each(&:close) if pid.zero?
|
|
pid
|
|
end
|
|
end
|
|
|
|
private_constant :CoreExt
|
|
|
|
Process.singleton_class.prepend(CoreExt)
|
|
else
|
|
def add(object); end
|
|
def delete(object); end
|
|
end
|
|
end
|
|
|
|
private_constant :ForkTracker
|
|
end
|