make AllLocations accept a context (#2518)

The previous implementation would leak a goroutine if the caller of
AllLocations stopped iterating early. Now, accept a context so that the
caller can cancel the AllLocations iterator rather than leak the
goroutine.

Signed-off-by: Will Murphy <will.murphy@anchore.com>
This commit is contained in:
William Murphy
2024-01-22 11:05:59 -05:00
committed by GitHub
parent 3046d43a8a
commit c6ce1de928
22 changed files with 156 additions and 42 deletions
+8 -2
View File
@@ -1,6 +1,7 @@
package file
import (
"context"
"fmt"
"io"
"os"
@@ -144,12 +145,17 @@ func (r MockResolver) RelativeFileByPath(_ Location, path string) *Location {
return &paths[0]
}
func (r MockResolver) AllLocations() <-chan Location {
func (r MockResolver) AllLocations(ctx context.Context) <-chan Location {
results := make(chan Location)
go func() {
defer close(results)
for _, l := range r.locations {
results <- l
select {
case <-ctx.Done():
return
case results <- l:
continue
}
}
}()
return results