This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user