File tree Expand file tree Collapse file tree 1 file changed +18
-5
lines changed Expand file tree Collapse file tree 1 file changed +18
-5
lines changed Original file line number Diff line number Diff line change @@ -169,6 +169,9 @@ type rowRepoIter struct {
169
169
err error
170
170
repos chan * Repository
171
171
rows chan sql.Row
172
+
173
+ doneMutex sync.Mutex
174
+ doneClosed bool
172
175
}
173
176
174
177
// NewRowRepoIter initializes a new repository iterator.
@@ -229,6 +232,16 @@ func (i *rowRepoIter) setError(err error) {
229
232
i .err = err
230
233
}
231
234
235
+ func closeIter (i * rowRepoIter ) {
236
+ i .doneMutex .Lock ()
237
+ defer i .doneMutex .Unlock ()
238
+
239
+ if ! i .doneClosed {
240
+ close (i .done )
241
+ i .doneClosed = true
242
+ }
243
+ }
244
+
232
245
func (i * rowRepoIter ) fillRepoChannel () {
233
246
defer close (i .repos )
234
247
@@ -238,7 +251,7 @@ func (i *rowRepoIter) fillRepoChannel() {
238
251
return
239
252
240
253
case <- i .ctx .Done ():
241
- close ( i . done )
254
+ closeIter ( i )
242
255
return
243
256
244
257
default :
@@ -252,7 +265,7 @@ func (i *rowRepoIter) fillRepoChannel() {
252
265
253
266
case <- i .ctx .Done ():
254
267
i .setError (ErrSessionCanceled .New ())
255
- close ( i . done )
268
+ closeIter ( i )
256
269
return
257
270
258
271
case i .repos <- repo :
@@ -264,7 +277,7 @@ func (i *rowRepoIter) fillRepoChannel() {
264
277
return
265
278
266
279
default :
267
- close ( i . done )
280
+ closeIter ( i )
268
281
i .setError (err )
269
282
return
270
283
}
@@ -284,7 +297,7 @@ func (i *rowRepoIter) rowReader(num int) {
284
297
return
285
298
default :
286
299
i .setError (err )
287
- close ( i . done )
300
+ closeIter ( i )
288
301
continue
289
302
}
290
303
}
@@ -318,7 +331,7 @@ func (i *rowRepoIter) rowReader(num int) {
318
331
default :
319
332
iter .Close ()
320
333
i .setError (err )
321
- close ( i . done )
334
+ closeIter ( i )
322
335
return
323
336
}
324
337
}
You can’t perform that action at this time.
0 commit comments