diff --git a/configure.ac b/configure.ac index f75c0a98820..f56717f16a4 100644 --- a/configure.ac +++ b/configure.ac @@ -4129,26 +4129,28 @@ case $with_file_notification,$NOTIFY_OBJ in fi ;; esac -dnl kqueue is available on BSD-like systems. -case $with_file_notification,$NOTIFY_OBJ in - kqueue,* | yes,) - EMACS_CHECK_MODULES([KQUEUE], [libkqueue]) - if test "$HAVE_KQUEUE" = "yes"; then - AC_DEFINE([HAVE_KQUEUE], [1], [Define to 1 to use kqueue.]) - CPPFLAGS="$CPPFLAGS -I/usr/include/kqueue" - NOTIFY_CFLAGS=$KQUEUE_CFLAGS - NOTIFY_LIBS=$KQUEUE_LIBS - NOTIFY_OBJ=kqueue.o - NOTIFY_SUMMARY="yes -lkqueue" - else - AC_SEARCH_LIBS([kqueue], []) - if test "$ac_cv_search_kqueue" != no; then - AC_DEFINE([HAVE_KQUEUE], [1], [Define to 1 to use kqueue.]) - NOTIFY_OBJ=kqueue.o - NOTIFY_SUMMARY="yes (kqueue)" - fi - fi ;; -esac +AS_IF([test "$opsys" != "haiku"], [ + dnl kqueue is available on BSD-like systems and Haiku, but Haiku's + dnl implementation cannot monitor filesystem activity. + case $with_file_notification,$NOTIFY_OBJ in + kqueue,* | yes,) + EMACS_CHECK_MODULES([KQUEUE], [libkqueue]) + if test "$HAVE_KQUEUE" = "yes"; then + AC_DEFINE([HAVE_KQUEUE], [1], [Define to 1 to use kqueue.]) + CPPFLAGS="$CPPFLAGS -I/usr/include/kqueue" + NOTIFY_CFLAGS=$KQUEUE_CFLAGS + NOTIFY_LIBS=$KQUEUE_LIBS + NOTIFY_OBJ=kqueue.o + NOTIFY_SUMMARY="yes -lkqueue" + else + AC_SEARCH_LIBS([kqueue], []) + if test "$ac_cv_search_kqueue" != no; then + AC_DEFINE([HAVE_KQUEUE], [1], [Define to 1 to use kqueue.]) + NOTIFY_OBJ=kqueue.o + NOTIFY_SUMMARY="yes (kqueue)" + fi + fi ;; + esac]) dnl g_file_monitor exists since glib 2.18. G_FILE_MONITOR_EVENT_MOVED dnl has been added in glib 2.24. It has been tested under diff --git a/src/kqueue.c b/src/kqueue.c index 4693e130208..aabaab6c8c3 100644 --- a/src/kqueue.c +++ b/src/kqueue.c @@ -444,23 +444,29 @@ only when the upper directory of the renamed file is watched. */) if (! NILP (Fmember (Qrevoke, flags))) fflags |= NOTE_REVOKE; /* Register event. */ - EV_SET (&kev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, + EV_SET (&kev, fd, EVFILT_VNODE, (EV_ADD +#ifdef EV_ENABLE + | EV_ENABLE +#endif /* EV_ENABLE */ + | EV_CLEAR), fflags, 0, NULL); - if (kevent (kqueuefd, &kev, 1, NULL, 0, NULL) < 0) { - emacs_close (fd); - report_file_error ("Cannot watch file", file); - } + if (kevent (kqueuefd, &kev, 1, NULL, 0, NULL) < 0) + { + emacs_close (fd); + report_file_error ("Cannot watch file", file); + } /* Store watch object in watch list. */ Lisp_Object watch_descriptor = make_fixnum (fd); if (NILP (Ffile_directory_p (file))) watch_object = list4 (watch_descriptor, file, flags, callback); - else { - dir_list = directory_files_internal (file, Qnil, Qnil, Qnil, true, Qnil, - Qnil); - watch_object = list5 (watch_descriptor, file, flags, callback, dir_list); - } + else + { + dir_list = directory_files_internal (file, Qnil, Qnil, Qnil, true, Qnil, + Qnil); + watch_object = list5 (watch_descriptor, file, flags, callback, dir_list); + } watch_list = Fcons (watch_object, watch_list); return watch_descriptor; @@ -486,11 +492,12 @@ WATCH-DESCRIPTOR should be an object returned by `kqueue-add-watch'. */) /* Remove watch descriptor from watch list. */ watch_list = Fdelq (watch_object, watch_list); - if (NILP (watch_list) && (kqueuefd >= 0)) { - delete_read_fd (kqueuefd); - emacs_close (kqueuefd); - kqueuefd = -1; - } + if (NILP (watch_list) && (kqueuefd >= 0)) + { + delete_read_fd (kqueuefd); + emacs_close (kqueuefd); + kqueuefd = -1; + } return Qt; }