diff options
Diffstat (limited to 'inotify')
-rw-r--r-- | inotify/bits.go | 11 | ||||
-rw-r--r-- | inotify/inotify.go | 18 |
2 files changed, 15 insertions, 14 deletions
diff --git a/inotify/bits.go b/inotify/bits.go index 9162435..432933c 100644 --- a/inotify/bits.go +++ b/inotify/bits.go @@ -1,7 +1,5 @@ package inotify -import "sync/atomic" - const ( // Flags for the parameter of InotifyInit1(). // These, oddly, appear to be 24-bit numbers. @@ -11,15 +9,8 @@ const ( // Logically, Fd and Wd should be 'int', not 'int64', to match the OS. // But, because there's no 'sync/atomic.SwapInt', we cast up to int64. -type Wd int64 type Fd int64 - -func swapFd(addr *Fd, new Fd) (old Fd) { - return Fd(atomic.SwapInt64((*int64)(addr), int64(new))) -} -func loadFd(addr *Fd) Fd { - return Fd(atomic.LoadInt64((*int64)(addr))) -} +type Wd int64 type Mask uint32 const ( diff --git a/inotify/inotify.go b/inotify/inotify.go index f7db1b0..9cbae17 100644 --- a/inotify/inotify.go +++ b/inotify/inotify.go @@ -8,6 +8,7 @@ import ( type Inotify struct { fd Fd + fdLock sync.RWMutex fullbuff [4096]byte buff []byte @@ -40,15 +41,22 @@ func InotifyInit1(flags int) (*Inotify, error) { } func (o *Inotify) AddWatch(path string, mask Mask) (Wd, error) { - return inotify_add_watch(loadFd(&o.fd), path, mask) + o.fdLock.RLock() + defer o.fdLock.RUnlock() + return inotify_add_watch(o.fd, path, mask) } func (o *Inotify) RmWatch(wd Wd) error { - return inotify_rm_watch(loadFd(&o.fd), wd) + o.fdLock.RLock() + defer o.fdLock.RUnlock() + return inotify_rm_watch(o.fd, wd) } func (o *Inotify) Close() error { - return sysclose(swapFd(&o.fd, -1)) + o.fdLock.Lock() + defer o.fdLock.Unlock() + defer func() { o.fd = -1; }() + return sysclose(o.fd) } func (o *Inotify) Read() (Event, error) { @@ -56,7 +64,9 @@ func (o *Inotify) Read() (Event, error) { defer o.buffLock.Unlock() if len(o.buff) == 0 { - len, err := sysread(loadFd(&o.fd), o.buff) + o.fdLock.RLock() + len, err := sysread(o.fd, o.fullbuff[:]) + o.fdLock.RUnlock() if len == 0 { return Event{Wd: -1}, o.Close() } else if len < 0 { |