continuserv: guard concurrent accesses to wg
This commit is contained in:
parent
cfdcf9e5a3
commit
bbf9e229a7
1 changed files with 9 additions and 3 deletions
|
@ -25,9 +25,11 @@ import (
|
||||||
var (
|
var (
|
||||||
port = flag.Int("port", 8000, "Port on which to serve HTTP")
|
port = flag.Int("port", 8000, "Port on which to serve HTTP")
|
||||||
|
|
||||||
toServe atomic.Value // Always contains valid []byte to serve. May be stale unless wg is zero.
|
|
||||||
wg sync.WaitGroup // Indicates how many updates are pending.
|
|
||||||
mu sync.Mutex // Prevent multiple updates in parallel.
|
mu sync.Mutex // Prevent multiple updates in parallel.
|
||||||
|
toServe atomic.Value // Always contains valid []byte to serve. May be stale unless wg is zero.
|
||||||
|
|
||||||
|
wgMu sync.Mutex // Prevent multiple calls to wg.Wait() or wg.Add(positive number) in parallel.
|
||||||
|
wg sync.WaitGroup // Indicates how many updates are pending.
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -111,7 +113,9 @@ func filter(e fsnotify.Event) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func serve(w http.ResponseWriter, req *http.Request) {
|
func serve(w http.ResponseWriter, req *http.Request) {
|
||||||
|
wgMu.Lock()
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
wgMu.Unlock()
|
||||||
b := toServe.Load().([]byte)
|
b := toServe.Load().([]byte)
|
||||||
w.Write(b)
|
w.Write(b)
|
||||||
}
|
}
|
||||||
|
@ -143,7 +147,9 @@ func doPopulate(ch chan struct{}, dir string) {
|
||||||
select {
|
select {
|
||||||
case <-ch:
|
case <-ch:
|
||||||
if pending == 0 {
|
if pending == 0 {
|
||||||
|
wgMu.Lock()
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
|
wgMu.Unlock()
|
||||||
}
|
}
|
||||||
pending++
|
pending++
|
||||||
case <-time.After(10 * time.Millisecond):
|
case <-time.After(10 * time.Millisecond):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue