Skip to content

Commit

Permalink
moved watchDir/watchFile to kqueue
Browse files Browse the repository at this point in the history
  • Loading branch information
nbari committed Apr 11, 2017
1 parent 0de4ad1 commit 46bf936
Show file tree
Hide file tree
Showing 4 changed files with 210 additions and 47 deletions.
38 changes: 38 additions & 0 deletions watchfile.go → kqueue.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,44 @@ import (
"syscall"
)

// WatchDir check for changes on a directory via Kqueue EVFILT_VNODE
func WatchDir(dir string, ch chan<- struct{}) error {
file, err := os.Open(dir)
if err != nil {
return err
}

kq, err := syscall.Kqueue()
if err != nil {
return err
}

ev1 := syscall.Kevent_t{
Ident: uint64(file.Fd()),
Filter: syscall.EVFILT_VNODE,
Flags: syscall.EV_ADD | syscall.EV_ENABLE | syscall.EV_ONESHOT,
Fflags: syscall.NOTE_DELETE | syscall.NOTE_WRITE | syscall.NOTE_ATTRIB | syscall.NOTE_LINK | syscall.NOTE_RENAME | syscall.NOTE_REVOKE,
Data: 0,
Udata: nil,
}

// create kevent
events := []syscall.Kevent_t{ev1}
n, err := syscall.Kevent(kq, events, events, nil)
if err != nil {
return err
}

// wait for an event
for {
if n > 0 {
file.Close()
ch <- struct{}{}
return nil
}
}
}

// WatchFile check for changes on a file via kqueue EVFILT_VNODE
func WatchFile(f string, ch chan<- string) error {
file, err := os.Open(f)
Expand Down
86 changes: 86 additions & 0 deletions kqueue_386.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// +build freebsd netbsd openbsd darwin
// +build 386

package immortal

import (
"os"
"syscall"
)

// WatchDir check for changes on a directory via Kqueue EVFILT_VNODE
func WatchDir(dir string, ch chan<- struct{}) error {
file, err := os.Open(dir)
if err != nil {
return err
}

kq, err := syscall.Kqueue()
if err != nil {
return err
}

ev1 := syscall.Kevent_t{
Ident: uint32(file.Fd()),
Filter: syscall.EVFILT_VNODE,
Flags: syscall.EV_ADD | syscall.EV_ENABLE | syscall.EV_ONESHOT,
Fflags: syscall.NOTE_DELETE | syscall.NOTE_WRITE | syscall.NOTE_ATTRIB | syscall.NOTE_LINK | syscall.NOTE_RENAME | syscall.NOTE_REVOKE,
Data: 0,
Udata: nil,
}

// create kevent
events := []syscall.Kevent_t{ev1}
n, err := syscall.Kevent(kq, events, events, nil)
if err != nil {
return err
}

// wait for an event
for {
if n > 0 {
file.Close()
ch <- struct{}{}
return nil
}
}
}

// WatchFile check for changes on a file via kqueue EVFILT_VNODE
func WatchFile(f string, ch chan<- string) error {
file, err := os.Open(f)
if err != nil {
return err
}

kq, err := syscall.Kqueue()
if err != nil {
return err
}

// NOTE_WRITE and NOTE_ATTRIB returns twice, removing NOTE_ATTRIB (touch) will not work
ev1 := syscall.Kevent_t{
Ident: uint32(file.Fd()),
Filter: syscall.EVFILT_VNODE,
Flags: syscall.EV_ADD | syscall.EV_ENABLE | syscall.EV_ONESHOT,
Fflags: syscall.NOTE_DELETE | syscall.NOTE_WRITE | syscall.NOTE_LINK | syscall.NOTE_RENAME | syscall.NOTE_REVOKE,
Data: 0,
Udata: nil,
}

// create kevent
events := []syscall.Kevent_t{ev1}
n, err := syscall.Kevent(kq, events, events, nil)
if err != nil {
return err
}

// wait for an event
for {
if n > 0 {
file.Close()
ch <- f
return nil
}
}
}
86 changes: 86 additions & 0 deletions kqueue_arm.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// +build freebsd netbsd openbsd darwin
// +build arm

package immortal

import (
"os"
"syscall"
)

// WatchDir check for changes on a directory via Kqueue EVFILT_VNODE
func WatchDir(dir string, ch chan<- struct{}) error {
file, err := os.Open(dir)
if err != nil {
return err
}

kq, err := syscall.Kqueue()
if err != nil {
return err
}

ev1 := syscall.Kevent_t{
Ident: uint32(file.Fd()),
Filter: syscall.EVFILT_VNODE,
Flags: syscall.EV_ADD | syscall.EV_ENABLE | syscall.EV_ONESHOT,
Fflags: syscall.NOTE_DELETE | syscall.NOTE_WRITE | syscall.NOTE_ATTRIB | syscall.NOTE_LINK | syscall.NOTE_RENAME | syscall.NOTE_REVOKE,
Data: 0,
Udata: nil,
}

// create kevent
events := []syscall.Kevent_t{ev1}
n, err := syscall.Kevent(kq, events, events, nil)
if err != nil {
return err
}

// wait for an event
for {
if n > 0 {
file.Close()
ch <- struct{}{}
return nil
}
}
}

// WatchFile check for changes on a file via kqueue EVFILT_VNODE
func WatchFile(f string, ch chan<- string) error {
file, err := os.Open(f)
if err != nil {
return err
}

kq, err := syscall.Kqueue()
if err != nil {
return err
}

// NOTE_WRITE and NOTE_ATTRIB returns twice, removing NOTE_ATTRIB (touch) will not work
ev1 := syscall.Kevent_t{
Ident: uint32(file.Fd()),
Filter: syscall.EVFILT_VNODE,
Flags: syscall.EV_ADD | syscall.EV_ENABLE | syscall.EV_ONESHOT,
Fflags: syscall.NOTE_DELETE | syscall.NOTE_WRITE | syscall.NOTE_LINK | syscall.NOTE_RENAME | syscall.NOTE_REVOKE,
Data: 0,
Udata: nil,
}

// create kevent
events := []syscall.Kevent_t{ev1}
n, err := syscall.Kevent(kq, events, events, nil)
if err != nil {
return err
}

// wait for an event
for {
if n > 0 {
file.Close()
ch <- f
return nil
}
}
}
47 changes: 0 additions & 47 deletions watchdir.go

This file was deleted.

0 comments on commit 46bf936

Please sign in to comment.