@@ -158,8 +158,8 @@ type results struct {
158
158
query Query
159
159
res <- chan Result
160
160
161
- ctx context.Context
162
161
cancel context.CancelFunc
162
+ closed chan struct {}
163
163
}
164
164
165
165
func (r * results ) Next () <- chan Result {
@@ -179,7 +179,7 @@ func (r *results) Rest() ([]Entry, error) {
179
179
}
180
180
es = append (es , e .Entry )
181
181
}
182
- <- r .ctx . Done () // wait till the processing finishes.
182
+ <- r .Done () // wait till the processing finishes.
183
183
return es , nil
184
184
}
185
185
@@ -192,7 +192,7 @@ func (r *results) Query() Query {
192
192
}
193
193
194
194
func (r * results ) Done () <- chan struct {} {
195
- return r .ctx . Done ()
195
+ return r .closed
196
196
}
197
197
198
198
// ResultBuilder is what implementors use to construct results
@@ -211,6 +211,7 @@ type ResultBuilder struct {
211
211
212
212
ctx context.Context
213
213
cancel context.CancelFunc
214
+ closed chan struct {}
214
215
wg sync.WaitGroup
215
216
}
216
217
@@ -220,8 +221,8 @@ func (rb *ResultBuilder) Results() Results {
220
221
query : rb .Query ,
221
222
res : rb .Output ,
222
223
223
- ctx : rb .ctx ,
224
224
cancel : rb .cancel ,
225
+ closed : rb .closed ,
225
226
}
226
227
}
227
228
@@ -236,11 +237,14 @@ func NewResultBuilder(q Query) *ResultBuilder {
236
237
b := & ResultBuilder {
237
238
Query : q ,
238
239
Output : make (chan Result , bufSize ),
240
+ closed : make (chan struct {}),
239
241
}
242
+
240
243
b .ctx , b .cancel = context .WithCancel (context .Background ())
241
244
context .AfterFunc (b .ctx , func () {
242
245
b .wg .Wait ()
243
246
close (b .Output )
247
+ close (b .closed )
244
248
})
245
249
return b
246
250
}
@@ -307,12 +311,12 @@ func ResultsReplaceQuery(r Results, q Query) Results {
307
311
switch r := r .(type ) {
308
312
case * results :
309
313
// note: not using field names to make sure all fields are copied
310
- return & results {q , r .res , r .ctx , r .cancel }
314
+ return & results {q , r .res , r .cancel , r .closed }
311
315
case * resultsIter :
312
316
// note: not using field names to make sure all fields are copied
313
317
lr := r .legacyResults
314
318
if lr != nil {
315
- lr = & results {q , lr .res , lr .ctx , lr .cancel }
319
+ lr = & results {q , lr .res , lr .cancel , lr .closed }
316
320
}
317
321
return & resultsIter {q , r .next , r .close , lr }
318
322
default :
0 commit comments