continuserv: guard concurrent accesses to wg

pull/151/head
Daniel Wagner-Hall 9 years ago
parent cfdcf9e5a3
commit bbf9e229a7

@ -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")
mu sync.Mutex // Prevent multiple updates in parallel.
toServe atomic.Value // Always contains valid []byte to serve. May be stale unless wg is zero. 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. wg sync.WaitGroup // Indicates how many updates are pending.
mu sync.Mutex // Prevent multiple updates in parallel.
) )
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…
Cancel
Save