func (ctx *context) solverWorker() { conn := ctx.pool.Get() defer conn.Close() for r := range ctx.solverch { var arg string if r.IsIR { arg = "-action=ir" } else { arg = "-action=inst" } cmd := exec.Command(os.Args[0]+"-backend", arg, os.Args[1]) cmd.Stdin = strings.NewReader(r.Req) var outb, errb bytes.Buffer cmd.Stdout = &outb cmd.Stderr = &errb var sys syscall.SysProcAttr sys.Setpgid = true cmd.SysProcAttr = &sys err := cmd.Start() if err != nil { os.Stdout.Write([]byte("Error invoking solver: " + err.Error() + "\n")) r.result <- solverResp{"", friendlyError{"Error invoking solver", err}} continue } timeout := false timer := time.AfterFunc(10*time.Second, func() { syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) timeout = true }) err = cmd.Wait() timer.Stop() if timeout { os.Stdout.Write([]byte("Solver timeout\n")) r.result <- solverResp{"", friendlyError{"Solver timeout", nil}} } else if err != nil { r.result <- solverResp{"", friendlyError{"Error invoking solver", err}} } else if errb.Len() != 0 { r.result <- solverResp{"", friendlyError{errb.String(), nil}} } else { r.result <- solverResp{outb.String(), nil} } } }