Fix fdPoller.close to only close when fds have been assigned
diff --git a/inotify_poller.go b/inotify_poller.go
index 0097038..796a171 100644
--- a/inotify_poller.go
+++ b/inotify_poller.go
@@ -17,10 +17,19 @@
pipe [2]int // Pipe for waking up
}
+func emptyPoller(fd int) *fdPoller {
+ poller := new(fdPoller)
+ poller.fd = fd
+ poller.epfd = -1
+ poller.pipe[0] = -1
+ poller.pipe[1] = -1
+ return poller
+}
+
// Create a new inotify poller.
// This creates an inotify handler, and an epoll handler.
func newFdPoller(fd int) (_ *fdPoller, errno error) {
- poller := new(fdPoller)
+ poller := emptyPoller(fd)
defer func() {
if errno != nil {
poller.close()
@@ -155,7 +164,13 @@
// Close all poller file descriptors, but not the one passed to it.
func (poller *fdPoller) close() {
- syscall.Close(poller.pipe[1])
- syscall.Close(poller.pipe[0])
- syscall.Close(poller.epfd)
+ if poller.pipe[1] != -1 {
+ syscall.Close(poller.pipe[1])
+ }
+ if poller.pipe[0] != -1 {
+ syscall.Close(poller.pipe[0])
+ }
+ if poller.epfd != -1 {
+ syscall.Close(poller.epfd)
+ }
}