class Opal::BuilderScheduler::Prefork::Fork
def close
def close send(:close) @parent_write.close end
def eof?
def eof? write_io.closed? end
def fork?
def fork? @in_fork end
def goodbye
def goodbye read_io.close unless read_io.closed? end
def initialize(forkset)
def initialize(forkset) @parent_read, @child_write = IO.pipe(binmode: true) @child_read, @parent_write = IO.pipe(binmode: true) @forkset = forkset @in_fork = false @pid = fork do @in_fork = true begin @parent_read.close @parent_write.close yield(self) rescue => error send(:exception, error) ensure send(:close) unless write_io.closed? @child_write.close end end @child_read.close @child_write.close end
def read_io
def read_io fork? ? @child_read : @parent_read end
def recv
def recv recv_message(read_io) end
def recv_message(io)
def recv_message(io) length, = *io.read(8).unpack('Q') Marshal.load(io.read(length)) # rubocop:disable Security/MarshalLoad end
def send(*msg)
def send(*msg) send_message(write_io, msg) end
def send_message(io, msg)
def send_message(io, msg) msg = Marshal.dump(msg) io.write([msg.length].pack('Q') + msg) end
def wait
def wait Process.waitpid(@pid, Process::WNOHANG) end
def write_io
def write_io fork? ? @child_write : @parent_write end