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