From 8e1879ade947300be8dca5ac3c5501ff42a473bf Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Thu, 6 Dec 2012 07:23:50 +0000 Subject: [PATCH] inotify: revert : i want to keep autotools **modularized**. Instead, use in Eio what has been detected in Ecore_File. SVN revision: 80298 --- configure.ac | 60 +++++++++++++++++++------------ m4/eio_check_options.m4 | 44 +++++++++++++++++++++++ src/Makefile_Eio.am | 2 +- src/lib/eio/eio_monitor_inotify.c | 25 ++++++++++++- 4 files changed, 107 insertions(+), 24 deletions(-) diff --git a/configure.ac b/configure.ac index e0d942f298..72b2529832 100644 --- a/configure.ac +++ b/configure.ac @@ -104,8 +104,6 @@ AC_ARG_ENABLE([coverage], #### Default values -want_inotify="no" - requirements_pc_crypto="" requirements_pc_deps_crypto="" requirements_libs_crypto="" @@ -279,11 +277,6 @@ case "$host_os" in MODULE_ARCH="$host_os-$host_cpu-v_maj.v_min.v_mic" MODULE_EXT=".dll" ;; - linux*) - want_inotify="yes" - MODULE_ARCH="$host_os-$host_cpu-v_maj.v_min.v_mic" - MODULE_EXT=".so" - ;; *) MODULE_ARCH="$host_os-$host_cpu-v_maj.v_min.v_mic" MODULE_EXT=".so" @@ -481,17 +474,6 @@ sys/mman.h \ unistd.h \ ]) -have_inotify="no" -if test "x${want_inotify}" = "xyes" ; then - AC_CHECK_HEADER([sys/inotify.h], - [ - AC_DEFINE([HAVE_INOTIFY], [1], [File monitoring with Inotify]) - have_inotify="yes" - ], - [have_inotify="no"]) -fi -AM_CONDITIONAL([HAVE_INOTIFY], [test "x${have_inotify}" = "xyes"]) - EFL_CHECK_PATH_MAX @@ -1843,13 +1825,19 @@ fi # cserve2 only works on Linux so far. -if test "x${efl_func_shm_open}" = "xno" -o "x${have_inotify}" = "xno"; then +if test "x${efl_func_shm_open}" = "xno" ; then want_evas_cserve2="no" fi -AC_DEFINE_IF([EVAS_CSERVE2], - [test "x${want_evas_cserve2}" = "xyes"], - [1], [Shared cache server.]) +if test "x${want_evas_cserve2}" = "xyes" ; then + AC_CHECK_HEADERS([sys/epoll.h sys/inotify.h sys/signalfd.h], + [], + [want_evas_cserve2="no"]) +fi + +if test "x${want_evas_cserve2}" = "xyes" ; then + AC_DEFINE([EVAS_CSERVE2], [1], [Shared cache server.]) +fi AM_CONDITIONAL([EVAS_CSERVE2], [test "x${want_evas_cserve2}" = "xyes"]) ### Configuration @@ -2398,6 +2386,18 @@ AC_ARG_ENABLE([poll], ], [want_poll="yes"]) +AC_ARG_ENABLE([inotify], + [AC_HELP_STRING([--disable-inotify], + [disable inotify in the ecore_file module. @<:@default=enabled@:>@])], + [ + if test "x${enableval}" = "xyes" ; then + want_inotify="yes" + else + want_inotify="no" + fi + ], + [want_inotify="yes"]) + AC_ARG_ENABLE([atfile-source], [AC_HELP_STRING([--disable-atfile-source], [disable use of atfile source functions as openat and mkdirat @<:@default=detect@:>@])], @@ -2458,6 +2458,19 @@ requirements_pc_ecore_file="ecore-con >= ${PACKAGE_VERSION} ecore >= ${PACKAGE_V ### Checks for header files +have_inotify="no" +if test "x${want_inotify}" = "xyes" ; then + AC_CHECK_HEADER([sys/inotify.h], + [ + AC_DEFINE([HAVE_INOTIFY], [1], [File monitoring with Inotify]) + have_inotify="yes" + ], + [have_inotify="no"]) +fi + +AC_MSG_CHECKING([whether inotify is to be used for filemonitoring]) +AC_MSG_RESULT(${have_inotify}) + ### Checks for types ### Checks for structures @@ -3959,9 +3972,12 @@ setxattr("/", "user.ethumb.md5", NULL, 0, 0); AC_MSG_RESULT([${have_xattr}]) # Check for inotify specificity +have_inotify="no" have_notify_win32="no" +EIO_CHECK_INOTIFY([have_inotify="yes"], [have_inotify="no"]) EIO_CHECK_NOTIFY_WIN32([have_notify_win32="yes"], [have_notify_win32="no"]) +AM_CONDITIONAL([EIO_HAVE_INOTIFY], [test "x${have_inotify}" = "xyes"]) AM_CONDITIONAL([EIO_HAVE_WINCHANGE], [test "x${have_notify_win32}" = "xyes"]) #### End of Eio diff --git a/m4/eio_check_options.m4 b/m4/eio_check_options.m4 index 5fb901273c..485dd85595 100644 --- a/m4/eio_check_options.m4 +++ b/m4/eio_check_options.m4 @@ -1,3 +1,47 @@ +dnl use: EIO_CHECK_INOTIFY([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +AC_DEFUN([EIO_CHECK_INOTIFY], +[ +_eio_have_inotify="no" + +dnl We need to check if the right inotify version is accessible + +dnl It is hard to find a good test on how to check the correct +dnl inotify version. They changed the headers a lot. +dnl in kernel 2.6.13 __NR_inotify_init was added to the defined syscalls +dnl in asm/unistd.h and IN_MOVE_SELF was added to linux/inotify.h +dnl so with this check you need a very new kernel and kernel-headers! + +if ! test "x${have_windows}" = "xyes" ; then + + AC_CHECK_LIB([c], [inotify_init], + [ + AC_DEFINE([HAVE_INOTIFY], [1], [ File monitoring with Inotify ]) + AC_DEFINE([HAVE_SYS_INOTIFY], [1], [ File monitoring with Inotify - sys/inotify.h ]) + _eio_have_inotify="yes" + ], + [ + AC_TRY_COMPILE( + [ +#include +#include + ], + [ +int a = __NR_inotify_init; int b = IN_MOVE_SELF; + ], + [ + AC_DEFINE([HAVE_INOTIFY], [1], [ File monitoring with Inotify ]) + _eio_have_inotify="yes" + ], + [_eio_have_inotify="no"]) + ]) +fi + +AC_MSG_CHECKING([whether inotify is to be used for filemonitoring]) +AC_MSG_RESULT([${_eio_have_inotify}]) + +AS_IF([test "x${_eio_have_inotify}" = "xyes"], [$1], [$2]) +]) + dnl use: EIO_CHECK_NOTIFY_WIN32([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) AC_DEFUN([EIO_CHECK_NOTIFY_WIN32], [ diff --git a/src/Makefile_Eio.am b/src/Makefile_Eio.am index 9624285e13..28286b455b 100644 --- a/src/Makefile_Eio.am +++ b/src/Makefile_Eio.am @@ -18,7 +18,7 @@ lib/eio/eio_single.c \ lib/eio/eio_xattr.c \ lib/eio/eio_private.h -if HAVE_INOTIFY +if EIO_HAVE_INOTIFY lib_eio_libeio_la_SOURCES += lib/eio/eio_monitor_inotify.c else if EIO_HAVE_WINCHANGE diff --git a/src/lib/eio/eio_monitor_inotify.c b/src/lib/eio/eio_monitor_inotify.c index 76e7c93cc5..66abe9c1df 100644 --- a/src/lib/eio/eio_monitor_inotify.c +++ b/src/lib/eio/eio_monitor_inotify.c @@ -20,8 +20,11 @@ #include "eio_private.h" #include "Eio.h" -#ifdef HAVE_INOTIFY +#ifdef HAVE_SYS_INOTIFY # include +#else +# include +# include #endif /*============================================================================* @@ -67,6 +70,26 @@ static const Eio_Inotify_Table match[] = { EIO_INOTIFY_LINE(IN_UNMOUNT, SELF_DELETED, SELF_DELETED) }; +#ifndef HAVE_SYS_INOTIFY +static inline int +inotify_init(void) +{ + return syscall(__NR_inotify_init); +} + +static inline int +inotify_add_watch(int fd, const char *name, __u32 mask) +{ + return syscall(__NR_inotify_add_watch, fd, name, mask); +} + +static inline int +inotify_rm_watch(int fd, __u32 wd) +{ + return syscall(__NR_inotify_rm_watch, fd, wd); +} +#endif + static void _eio_inotify_del(void *data) {