summaryrefslogtreecommitdiffstats
path: root/livereload
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-04-30 01:10:03 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-04-30 01:10:57 +0200
commit355736ec357c81dfb2eb6851ee019d407090c5ec (patch)
tree7d9b57369b7e43effb3fb193dedb8a84f419dbc6 /livereload
parent93a447c5dd053e1c934036a66ebd05b95250a1d1 (diff)
livereload: Fix data race in close
Fixes #2625
Diffstat (limited to 'livereload')
-rw-r--r--livereload/connection.go11
-rw-r--r--livereload/hub.go4
2 files changed, 13 insertions, 2 deletions
diff --git a/livereload/connection.go b/livereload/connection.go
index 6e31b1baf..4e94e2ee0 100644
--- a/livereload/connection.go
+++ b/livereload/connection.go
@@ -15,6 +15,7 @@ package livereload
import (
"bytes"
+ "sync"
"github.com/gorilla/websocket"
)
@@ -25,6 +26,16 @@ type connection struct {
// Buffered channel of outbound messages.
send chan []byte
+
+ // There is a potential data race, especially visible with large files.
+ // This is protected by synchronisation of the send channel's close.
+ closer sync.Once
+}
+
+func (c *connection) close() {
+ c.closer.Do(func() {
+ close(c.send)
+ })
}
func (c *connection) reader() {
diff --git a/livereload/hub.go b/livereload/hub.go
index 359bac3f1..8ab6083ad 100644
--- a/livereload/hub.go
+++ b/livereload/hub.go
@@ -41,14 +41,14 @@ func (h *hub) run() {
h.connections[c] = true
case c := <-h.unregister:
delete(h.connections, c)
- close(c.send)
+ c.close()
case m := <-h.broadcast:
for c := range h.connections {
select {
case c.send <- m:
default:
delete(h.connections, c)
- close(c.send)
+ c.close()
}
}
}