From da35d425214763d7d51d74e0410dc3a431c4a13d Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 5 Feb 2013 06:11:10 -0800 Subject: [PATCH] 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 --- src/pkg/exp/inotify/inotify_linux.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 } -- 2.48.1