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 @@ -173,6 +173,9 @@ type rowRepoIter struct {
173
173
err error
174
174
repos chan * Repository
175
175
rows chan sql.Row
176
+
177
+ doneMutex sync.Mutex
178
+ doneClosed bool
176
179
}
177
180
178
181
// NewRowRepoIter initializes a new repository iterator.
@@ -233,6 +236,16 @@ func (i *rowRepoIter) setError(err error) {
233
236
i .err = err
234
237
}
235
238
239
+ func closeIter (i * rowRepoIter ) {
240
+ i .doneMutex .Lock ()
241
+ defer i .doneMutex .Unlock ()
242
+
243
+ if ! i .doneClosed {
244
+ close (i .done )
245
+ i .doneClosed = true
246
+ }
247
+ }
248
+
236
249
func (i * rowRepoIter ) fillRepoChannel () {
237
250
defer close (i .repos )
238
251
@@ -242,7 +255,7 @@ func (i *rowRepoIter) fillRepoChannel() {
242
255
return
243
256
244
257
case <- i .ctx .Done ():
245
- close ( i . done )
258
+ closeIter ( i )
246
259
return
247
260
248
261
default :
@@ -256,7 +269,7 @@ func (i *rowRepoIter) fillRepoChannel() {
256
269
257
270
case <- i .ctx .Done ():
258
271
i .setError (ErrSessionCanceled .New ())
259
- close ( i . done )
272
+ closeIter ( i )
260
273
return
261
274
262
275
case i .repos <- repo :
@@ -268,7 +281,7 @@ func (i *rowRepoIter) fillRepoChannel() {
268
281
return
269
282
270
283
default :
271
- close ( i . done )
284
+ closeIter ( i )
272
285
i .setError (err )
273
286
return
274
287
}
@@ -288,7 +301,7 @@ func (i *rowRepoIter) rowReader(num int) {
288
301
return
289
302
default :
290
303
i .setError (err )
291
- close ( i . done )
304
+ closeIter ( i )
292
305
continue
293
306
}
294
307
}
@@ -322,7 +335,7 @@ func (i *rowRepoIter) rowReader(num int) {
322
335
default :
323
336
iter .Close ()
324
337
i .setError (err )
325
- close ( i . done )
338
+ closeIter ( i )
326
339
return
327
340
}
328
341
}
You can’t perform that action at this time.
0 commit comments