diff --git a/solverrpc/rpc.go b/solverrpc/rpc.go index ba7d5c0..8b8dc88 100644 --- a/solverrpc/rpc.go +++ b/solverrpc/rpc.go @@ -80,6 +80,15 @@ func startSolver() { }() } +func checkExit() error { + select { + case <-cmdDone: + return ErrSolverProcessExited + default: + return nil + } +} + // StartSolver starts the solver's background process. This can be used to // detect errors starting the solver process before the first call to Roots. func StartSolver() error { @@ -95,8 +104,8 @@ func RootFactors(a []*big.Int, F *big.Int) ([]*big.Int, []int, error) { return nil, nil, err } - if _, ok := <-cmdDone; ok { - return nil, nil, ErrSolverProcessExited + if err := checkExit(); err != nil { + return nil, nil, err } var args struct { @@ -111,6 +120,9 @@ func RootFactors(a []*big.Int, F *big.Int) ([]*big.Int, []int, error) { } err := client.Call("Solver.RootFactors", args, &result) if err != nil { + if exitErr := checkExit(); exitErr != nil { + err = exitErr + } return nil, nil, err } return result.Roots, result.Exponents, nil @@ -128,8 +140,8 @@ func Roots(a []*big.Int, F *big.Int) ([]*big.Int, error) { return nil, err } - if _, ok := <-cmdDone; ok { - return nil, ErrSolverProcessExited + if err := checkExit(); err != nil { + return nil, err } var args struct { @@ -144,6 +156,9 @@ func Roots(a []*big.Int, F *big.Int) ([]*big.Int, error) { } err := client.Call("Solver.Roots", args, &result) if err != nil { + if exitErr := checkExit(); exitErr != nil { + err = exitErr + } return nil, err } if result.RepeatedRoot != nil {