in internal/kernel/process/process.go [146:190]
func (p *Process) ensureStarted() error {
if p.closed {
return fmt.Errorf("this process has been closed")
}
if p.started {
return nil
}
if err := p.cmd.Start(); err != nil {
p.Close()
return err
}
p.started = true
done := make(chan bool, 1)
go p.consumeStderr(done)
p.stderrDone = done
var handshake handshakeResponse
if err := p.readResponse(&handshake); err != nil {
p.Close()
return err
}
if runtimeVersion, err := handshake.runtimeVersion(); err != nil {
p.Close()
return err
} else if ok, errs := p.compatibleVersions.Validate(runtimeVersion); !ok {
causes := make([]string, len(errs))
for i, err := range errs {
causes[i] = fmt.Sprintf("- %v", err)
}
p.Close()
return fmt.Errorf("incompatible runtime version:\n%v", strings.Join(causes, "\n"))
}
go func() {
err := p.cmd.Wait()
if err != nil {
fmt.Fprintf(os.Stderr, "Runtime process exited abnormally: %v", err.Error())
}
p.Close()
}()
return nil
}