Event chan *FileEvent // Events are returned on this channel
done chan bool // Channel for sending a "quit message" to the reader goroutine
isClosed bool // Set to true when Close() is first called
- kbuf [1]syscall.Kevent_t // An event buffer for Add/Remove watch
- bufmut sync.Mutex // Protects access to kbuf.
}
// NewWatcher creates and returns a new kevent instance using kqueue(2)
w.enFlags[path] = flags
w.enmut.Unlock()
- w.bufmut.Lock()
- watchEntry := &w.kbuf[0]
+ var kbuf [1]syscall.Kevent_t
+ watchEntry := &kbuf[0]
watchEntry.Fflags = flags
syscall.SetKevent(watchEntry, watchfd, syscall.EVFILT_VNODE, syscall.EV_ADD|syscall.EV_CLEAR)
entryFlags := watchEntry.Flags
- w.bufmut.Unlock()
-
- wd, errno := syscall.Kevent(w.kq, w.kbuf[:], nil, nil)
- if wd == -1 {
+ success, errno := syscall.Kevent(w.kq, kbuf[:], nil, nil)
+ if success == -1 {
return errno
} else if (entryFlags & syscall.EV_ERROR) == syscall.EV_ERROR {
return errors.New("kevent add error")
if !ok {
return errors.New(fmt.Sprintf("can't remove non-existent kevent watch for: %s", path))
}
- w.bufmut.Lock()
- watchEntry := &w.kbuf[0]
+ var kbuf [1]syscall.Kevent_t
+ watchEntry := &kbuf[0]
syscall.SetKevent(watchEntry, watchfd, syscall.EVFILT_VNODE, syscall.EV_DELETE)
- success, errno := syscall.Kevent(w.kq, w.kbuf[:], nil, nil)
- w.bufmut.Unlock()
+ entryFlags := watchEntry.Flags
+ success, errno := syscall.Kevent(w.kq, kbuf[:], nil, nil)
if success == -1 {
return os.NewSyscallError("kevent_rm_watch", errno)
- } else if (watchEntry.Flags & syscall.EV_ERROR) == syscall.EV_ERROR {
+ } else if (entryFlags & syscall.EV_ERROR) == syscall.EV_ERROR {
return errors.New("kevent rm error")
}
syscall.Close(watchfd)