Attempting to fix deadlock
This commit is contained in:
parent
c727a21239
commit
b9ffe6bc66
38
goldsmith.go
38
goldsmith.go
@ -26,6 +26,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -144,20 +145,43 @@ func (gs *goldsmith) makeStage() stage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gs *goldsmith) chain(s stage, c Chainer) {
|
func (gs *goldsmith) chain(s stage, c Chainer) {
|
||||||
|
var (
|
||||||
|
wg sync.WaitGroup
|
||||||
|
output = make(chan *File)
|
||||||
|
input = make(chan *File)
|
||||||
|
)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
wg.Wait()
|
||||||
|
close(s.output)
|
||||||
|
}()
|
||||||
|
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
for file := range output {
|
||||||
|
s.output <- file
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
close(input)
|
||||||
|
wg.Done()
|
||||||
|
}()
|
||||||
|
|
||||||
f, _ := c.(Filterer)
|
f, _ := c.(Filterer)
|
||||||
|
|
||||||
allowed := make(chan *File)
|
|
||||||
defer close(allowed)
|
|
||||||
|
|
||||||
go c.Chain(gs, allowed, s.output)
|
|
||||||
|
|
||||||
for file := range s.input {
|
for file := range s.input {
|
||||||
if file.flags&FileFlagStatic != 0 || (f != nil && f.Filter(file.Path)) {
|
if file.flags&FileFlagStatic != 0 || (f != nil && f.Filter(file.Path)) {
|
||||||
s.output <- file
|
s.output <- file
|
||||||
} else {
|
} else {
|
||||||
allowed <- file
|
input <- file
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
go c.Chain(gs, input, output)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gs *goldsmith) NewFile(path string) *File {
|
func (gs *goldsmith) NewFile(path string) *File {
|
||||||
|
Loading…
Reference in New Issue
Block a user