From: Ian Lance Taylor Date: Tue, 5 Feb 2013 14:11:10 +0000 (-0800) Subject: exp/inotify: close event channel before file descriptor X-Git-Tag: go1.1rc2~1132 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=da35d425214763d7d51d74e0410dc3a431c4a13d;p=gostls13.git exp/inotify: close event channel before file descriptor Closing the inotify file descriptor can take over a second when running on Ubuntu Precise in an NFS directory, leading to the test error in issue 3132. Closing the event channel first lets a client that does not care about the error channel move on. Fixes #3132. R=golang-dev, dave, rsc CC=golang-dev https://golang.org/cl/7300045 --- diff --git a/src/pkg/exp/inotify/inotify_linux.go b/src/pkg/exp/inotify/inotify_linux.go index f989a9224d..f671f47a13 100644 --- a/src/pkg/exp/inotify/inotify_linux.go +++ b/src/pkg/exp/inotify/inotify_linux.go @@ -153,7 +153,7 @@ func (w *Watcher) readEvents() { var buf [syscall.SizeofInotifyEvent * 4096]byte for { - n, err := syscall.Read(w.fd, buf[0:]) + n, err := syscall.Read(w.fd, buf[:]) // See if there is a message on the "done" channel var done bool select { @@ -163,11 +163,13 @@ func (w *Watcher) readEvents() { // If EOF or a "done" message is received if n == 0 || done { + // The syscall.Close can be slow. Close + // w.Event first. + close(w.Event) err := syscall.Close(w.fd) if err != nil { w.Error <- os.NewSyscallError("close", err) } - close(w.Event) close(w.Error) return }