summaryrefslogtreecommitdiff
path: root/inotify
diff options
context:
space:
mode:
Diffstat (limited to 'inotify')
-rw-r--r--inotify/bits.go11
-rw-r--r--inotify/inotify.go18
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 {