]> go.fuhry.dev Git - fsnotify.git/commitdiff
Make wakeup pipe non-blocking
authorPieter Droogendijk <pieter@binky.org.uk>
Sun, 8 Feb 2015 01:34:12 +0000 (02:34 +0100)
committerNathan Youngman <git@nathany.com>
Sun, 8 Feb 2015 20:22:32 +0000 (13:22 -0700)
inotify_poller.go

index 1433a2212438461d7ae59bf8e8e6188e054db5c1..029c199c294e3e9c5b511d45f913b46c8309be6f 100644 (file)
@@ -43,7 +43,7 @@ func newFdPoller(fd int) (_ *fdPoller, errno error) {
                return nil, errno
        }
        // Create pipe; pipe[0] is the read end, pipe[1] the write end.
-       errno = syscall.Pipe(poller.pipe[:])
+       errno = syscall.Pipe2(poller.pipe[:], syscall.O_NONBLOCK)
        if errno != nil {
                return nil, errno
        }
@@ -148,6 +148,10 @@ func (poller *fdPoller) wake() error {
        buf := make([]byte, 1)
        n, errno := syscall.Write(poller.pipe[1], buf)
        if n == -1 {
+               if errno == syscall.EAGAIN {
+                       // Buffer is full, poller will wake.
+                       return nil
+               }
                return errno
        }
        return nil
@@ -158,6 +162,10 @@ func (poller *fdPoller) clearWake() error {
        buf := make([]byte, 100)
        n, errno := syscall.Read(poller.pipe[0], buf)
        if n == -1 {
+               if errno == syscall.EAGAIN {
+                       // Buffer is empty, someone else cleared our wake.
+                       return nil
+               }
                return errno
        }
        return nil