@@ -80,6 +80,15 @@ func startSolver() {
80
80
}()
81
81
}
82
82
83
+ func checkExit () error {
84
+ select {
85
+ case <- cmdDone :
86
+ return ErrSolverProcessExited
87
+ default :
88
+ return nil
89
+ }
90
+ }
91
+
83
92
// StartSolver starts the solver's background process. This can be used to
84
93
// detect errors starting the solver process before the first call to Roots.
85
94
func StartSolver () error {
@@ -95,8 +104,8 @@ func RootFactors(a []*big.Int, F *big.Int) ([]*big.Int, []int, error) {
95
104
return nil , nil , err
96
105
}
97
106
98
- if _ , ok := <- cmdDone ; ok {
99
- return nil , nil , ErrSolverProcessExited
107
+ if err := checkExit (); err != nil {
108
+ return nil , nil , err
100
109
}
101
110
102
111
var args struct {
@@ -111,6 +120,9 @@ func RootFactors(a []*big.Int, F *big.Int) ([]*big.Int, []int, error) {
111
120
}
112
121
err := client .Call ("Solver.RootFactors" , args , & result )
113
122
if err != nil {
123
+ if exitErr := checkExit (); exitErr != nil {
124
+ err = exitErr
125
+ }
114
126
return nil , nil , err
115
127
}
116
128
return result .Roots , result .Exponents , nil
@@ -128,8 +140,8 @@ func Roots(a []*big.Int, F *big.Int) ([]*big.Int, error) {
128
140
return nil , err
129
141
}
130
142
131
- if _ , ok := <- cmdDone ; ok {
132
- return nil , ErrSolverProcessExited
143
+ if err := checkExit (); err != nil {
144
+ return nil , err
133
145
}
134
146
135
147
var args struct {
@@ -144,6 +156,9 @@ func Roots(a []*big.Int, F *big.Int) ([]*big.Int, error) {
144
156
}
145
157
err := client .Call ("Solver.Roots" , args , & result )
146
158
if err != nil {
159
+ if exitErr := checkExit (); exitErr != nil {
160
+ err = exitErr
161
+ }
147
162
return nil , err
148
163
}
149
164
if result .RepeatedRoot != nil {
0 commit comments