module Covered::Forks::Handler
def _fork
Intercept `Process.fork` and initialize coverage in the child.
def _fork pid = super if pid.zero? Handler.after_fork end return pid end
def after_fork
def after_fork return unless coverage = Handler.coverage pid = Process.pid # Any pre-existing coverage is being tracked by the parent process, so discard it. coverage.clear at_exit do # Don't break forked children: if Process.pid == pid coverage.finish end end end
def coverage
The currently registered coverage wrapper.
def coverage LOCK.synchronize do @coverages&.last end end
def finish(coverage = nil)
def finish(coverage = nil) LOCK.synchronize do if coverage @coverages&.delete(coverage) else @coverages&.pop end end end
def start(coverage)
Register coverage for fork handling.
def start(coverage) LOCK.synchronize do (@coverages ||= []) << coverage end end