From c7868fa405a49ffa36e11a4a18900db658528602 Mon Sep 17 00:00:00 2001 From: Tamas TEVESZ Date: Thu, 18 Mar 2010 19:18:18 +0100 Subject: [PATCH] Make inotify optional This time keeping the ability to fall back to the old polling method. --- WINGs/userdefaults.c | 24 ++++++++++++++++++++++++ configure.ac | 4 +++- src/WindowMaker.h | 3 +++ src/defaults.c | 6 +++++- src/defaults.h | 2 +- src/event.c | 20 ++++++++++++++------ src/main.c | 21 ++++++++++++++++++--- src/shutdown.c | 6 ++++++ src/startup.c | 39 +++++++++++++++++++++++++++++++++++++++ src/wconfig.h.in | 5 +++++ 10 files changed, 118 insertions(+), 12 deletions(-) diff --git a/WINGs/userdefaults.c b/WINGs/userdefaults.c index 943f98c7..ee3a3b73 100644 --- a/WINGs/userdefaults.c +++ b/WINGs/userdefaults.c @@ -39,6 +39,11 @@ static void synchronizeUserDefaults(void *foo); extern char *WMGetApplicationName(); #define DEFAULTS_DIR "/Defaults" +#ifndef HAVE_INOTIFY +/* Check defaults database for changes every this many milliseconds */ +/* XXX: this is shared with src/ stuff, put it in some common header */ +#define UD_SYNC_INTERVAL 2000 +#endif char *wusergnusteppath() { @@ -133,6 +138,19 @@ static void synchronizeUserDefaults(void *foo) } } +#ifndef HAVE_INOTIFY +static void addSynchronizeTimerHandler(void) +{ + static Bool initialized = False; + + if (!initialized) { + WMAddPersistentTimerHandler(UD_SYNC_INTERVAL, + synchronizeUserDefaults, NULL); + initialized = True; + } +} +#endif + void WMEnableUDPeriodicSynchronization(WMUserDefaults * database, Bool enable) { database->dontSync = !enable; @@ -309,6 +327,9 @@ WMUserDefaults *WMGetStandardUserDefaults(void) defaults->next = sharedUserDefaults; sharedUserDefaults = defaults; +#ifndef HAVE_INOTIFY + addSynchronizeTimerHandler(); +#endif registerSaveOnExit(); return defaults; @@ -382,6 +403,9 @@ WMUserDefaults *WMGetDefaultsFromPath(char *path) defaults->next = sharedUserDefaults; sharedUserDefaults = defaults; +#ifndef HAVE_INOTIFY + addSynchronizeTimerHandler(); +#endif registerSaveOnExit(); return defaults; diff --git a/configure.ac b/configure.ac index 7992179d..a4be3a6e 100644 --- a/configure.ac +++ b/configure.ac @@ -128,7 +128,9 @@ if test "x$HAVEDL" = xyes; then AC_CHECK_HEADERS(dlfcn.h) fi - +dnl Check for inotify +dnl ================= +AC_CHECK_HEADERS(sys/inotify.h, AC_DEFINE(HAVE_INOTIFY, 1, Check for inotify)) dnl Check CPP dnl ========= diff --git a/src/WindowMaker.h b/src/WindowMaker.h index cad17392..1a5b3237 100644 --- a/src/WindowMaker.h +++ b/src/WindowMaker.h @@ -425,6 +425,9 @@ typedef struct WPreferences { unsigned int noautolaunch:1; /* don't autolaunch apps */ unsigned int norestore:1; /* don't restore session */ unsigned int create_stdcmap:1; /* create std colormap */ +#ifndef HAVE_INOTIFY + unsigned int nopolling:1; /* don't poll the defaults database for changes */ +#endif unsigned int restarting:2; } flags; /* internal flags */ } WPreferences; diff --git a/src/defaults.c b/src/defaults.c index 6e588adc..4acf51a5 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -897,7 +897,7 @@ void wReadStaticDefaults(WMPropList * dict) } } -void wDefaultsCheckDomains(void) +void wDefaultsCheckDomains(void* arg) { WScreen *scr; struct stat stbuf; @@ -1016,6 +1016,10 @@ void wDefaultsCheckDomains(void) } WDRootMenu->timestamp = stbuf.st_mtime; } +#ifndef HAVE_INOTIFY + if (!arg) + WMAddTimerHandler(DEFAULTS_CHECK_INTERVAL, wDefaultsCheckDomains, arg); +#endif } void wReadDefaults(WScreen * scr, WMPropList * new_dict) diff --git a/src/defaults.h b/src/defaults.h index b5578465..b61fe5db 100644 --- a/src/defaults.h +++ b/src/defaults.h @@ -46,7 +46,7 @@ void wDefaultUpdateIcons(WScreen *scr); void wReadStaticDefaults(WMPropList *dict); -void wDefaultsCheckDomains(void); +void wDefaultsCheckDomains(void *arg); void wSaveDefaults(WScreen *scr); diff --git a/src/event.c b/src/event.c index d29cafc4..633f58e2 100644 --- a/src/event.c +++ b/src/event.c @@ -20,9 +20,12 @@ * USA. */ -#include #include "wconfig.h" +#ifdef HAVE_INOTIFY +#include +#endif + #include #include #include @@ -198,7 +201,7 @@ void DispatchEvent(XEvent * event) Restart(NULL, True); } else if (WCHECK_STATE(WSTATE_NEED_REREAD)) { WCHANGE_STATE(WSTATE_NORMAL); - wDefaultsCheckDomains(); + wDefaultsCheckDomains(NULL); } /* for the case that all that is wanted to be dispatched is @@ -282,6 +285,7 @@ void DispatchEvent(XEvent * event) } } +#ifdef HAVE_INOTIFY /* *---------------------------------------------------------------------- * inotifyHandleEvents- @@ -299,7 +303,7 @@ void DispatchEvent(XEvent * event) #define BUFF_SIZE ((sizeof(struct inotify_event) + 64)*5) void inotifyHandleEvents(int fd, int wd) { - extern void wDefaultsCheckDomains(void); + extern void wDefaultsCheckDomains(void *); ssize_t eventQLength, i = 0; char buff[BUFF_SIZE] = { 0 }; /* Check config only once per read of the event queue */ @@ -335,13 +339,14 @@ void inotifyHandleEvents(int fd, int wd) } if ((pevent->mask & IN_MODIFY) && oneShotFlag == 0) { fprintf(stdout, "wmaker: reading config files in defaults database.\n"); - wDefaultsCheckDomains(); + wDefaultsCheckDomains(NULL); } /* move to next event in the buffer */ i += sizeof(struct inotify_event) + pevent->len; } } +#endif /* HAVE_INOTIFY */ /* *---------------------------------------------------------------------- @@ -359,6 +364,7 @@ void inotifyHandleEvents(int fd, int wd) void EventLoop(void) { XEvent event; +#ifdef HAVE_INOTIFY extern int inotifyFD; extern int inotifyWD; struct timeval time; @@ -367,12 +373,13 @@ void EventLoop(void) if (inotifyFD < 0 || inotifyWD < 0) retVal = -1; +#endif for (;;) { WMNextEvent(dpy, &event); /* Blocks here */ WMHandleEvent(&event); - +#ifdef HAVE_INOTIFY if (retVal != -1) { time.tv_sec = 0; time.tv_usec = 0; @@ -392,6 +399,7 @@ void EventLoop(void) if (FD_ISSET(inotifyFD, &rfds)) inotifyHandleEvents(inotifyFD, inotifyWD); } +#endif } } @@ -918,7 +926,7 @@ static void handleClientMessage(XEvent * event) } } else if (event->xclient.message_type == _XA_WINDOWMAKER_COMMAND) { - wDefaultsCheckDomains(); + wDefaultsCheckDomains(NULL); } else if (event->xclient.message_type == _XA_WINDOWMAKER_WM_FUNCTION) { WApplication *wapp; diff --git a/src/main.c b/src/main.c index 225ce4b9..bd59b687 100644 --- a/src/main.c +++ b/src/main.c @@ -19,10 +19,12 @@ * USA. */ -#include - #include "wconfig.h" +#ifdef HAVE_INOTIFY +#include +#endif + #include #include #include @@ -67,8 +69,10 @@ char *ProgName; unsigned int ValidModMask = 0xff; +#ifdef HAVE_INOTIFY int inotifyFD; int inotifyWD; +#endif /* locale to use. NULL==POSIX or C */ char *Locale = NULL; @@ -436,6 +440,9 @@ void print_help() puts(_(" --create-stdcmap create the standard colormap hint in PseudoColor visuals")); puts(_(" --visual-id visualid visual id of visual to use")); puts(_(" --static do not update or save configurations")); +#ifndef HAVE_INOTIFY + puts(_(" --no-polling do not periodically check for configuration updates")); +#endif puts(_(" --version print version and exit")); puts(_(" --help show this message")); } @@ -460,6 +467,7 @@ void check_defaults() wfree(path); } +#ifdef HAVE_INOTIFY /* * Add watch here, used to notify if configuration * files have changed, using linux kernel inotify mechanism @@ -490,6 +498,7 @@ static void inotifyWatchConfig() } wfree(watchPath); } +#endif /* HAVE_INOTIFY */ static void execInitScript() { @@ -661,7 +670,11 @@ static int real_main(int argc, char **argv) wwarning(_("bad value for visualid: \"%s\""), argv[i]); exit(0); } - } else if (strcmp(argv[i], "-static") == 0 || strcmp(argv[i], "--static") == 0) { + } else if (strcmp(argv[i], "-static") == 0 || strcmp(argv[i], "--static") == 0 +#ifndef HAVE_INOTIFY + || strcmp(argv[i], "--no-polling") == 0 +#endif + ) { wPreferences.flags.noupdates = 1; } else if (strcmp(argv[i], "--help") == 0) { print_help(); @@ -762,7 +775,9 @@ static int real_main(int argc, char **argv) multiHead = False; execInitScript(); +#ifdef HAVE_INOTIFY inotifyWatchConfig(); +#endif EventLoop(); return -1; } diff --git a/src/shutdown.c b/src/shutdown.c index f6f6c278..8b5e86b9 100644 --- a/src/shutdown.c +++ b/src/shutdown.c @@ -56,7 +56,9 @@ static void wipeDesktop(WScreen * scr); void Shutdown(WShutdownMode mode) { int i; +#ifdef HAVE_INOTIFY extern int inotifyFD; +#endif switch (mode) { case WSLogoutMode: @@ -64,7 +66,9 @@ void Shutdown(WShutdownMode mode) case WSExitMode: /* if there is no session manager, send SAVE_YOURSELF to * the clients */ +#ifdef HAVE_INOTIFY close(inotifyFD); +#endif for (i = 0; i < wScreenCount; i++) { WScreen *scr; @@ -92,7 +96,9 @@ void Shutdown(WShutdownMode mode) for (i = 0; i < wScreenCount; i++) { WScreen *scr; +#ifdef HAVE_INOTIFY close(inotifyFD); +#endif scr = wScreenWithNumber(i); if (scr) { if (scr->helper_pid) diff --git a/src/startup.c b/src/startup.c index 817173a5..f4ae9ba6 100644 --- a/src/startup.c +++ b/src/startup.c @@ -134,6 +134,11 @@ extern Atom _XA_WM_IGNORE_FOCUS_EVENTS; /* cursors */ extern Cursor wCursor[WCUR_LAST]; +#ifndef HAVE_INOTIFY +/* special flags */ +extern char WDelayedActionSet; +#endif + /***** Local *****/ static WScreen **wScreen = NULL; @@ -187,6 +192,28 @@ static int handleXIO(Display * xio_dpy) return 0; } +#ifndef HAVE_INOTIFY +/* + *---------------------------------------------------------------------- + * delayedAction- + * Action to be executed after the signal() handler is exited. + *---------------------------------------------------------------------- + */ +static void delayedAction(void *cdata) +{ + if (WDelayedActionSet == 0) + return; + + WDelayedActionSet--; + /* + * Make the event dispatcher do whatever it needs to do, + * including handling zombie processes, restart and exit + * signals. + */ + DispatchEvent(NULL); +} +#endif + /* *---------------------------------------------------------------------- * handleExitSig-- @@ -574,6 +601,11 @@ void StartUp(Bool defaultScreenOnly) XFreePixmap(dpy, cur); } +#ifndef HAVE_INOTIFY + /* signal handler stuff that gets called when a signal is caught */ + WMAddPersistentTimerHandler(500, delayedAction, NULL); +#endif + /* emergency exit... */ sig_action.sa_handler = handleSig; sigemptyset(&sig_action.sa_mask); @@ -757,6 +789,13 @@ void StartUp(Bool defaultScreenOnly) Exit(1); } +#ifndef HAVE_INOTIFY + if (!wPreferences.flags.nopolling && !wPreferences.flags.noupdates) { + /* setup defaults file polling */ + WMAddTimerHandler(3000, wDefaultsCheckDomains, NULL); + } +#endif + } static Bool windowInList(Window window, Window * list, int count) diff --git a/src/wconfig.h.in b/src/wconfig.h.in index 0277474f..d3b38a53 100644 --- a/src/wconfig.h.in +++ b/src/wconfig.h.in @@ -347,6 +347,11 @@ /* max width of window title in window list */ #define MAX_WINDOWLIST_WIDTH 160 +#ifndef HAVE_INOTIFY +/* Check defaults database for changes every this many milliseconds */ +#define DEFAULTS_CHECK_INTERVAL 2000 +#endif + #define KEY_CONTROL_WINDOW_WEIGHT 1 /* if your keyboard don't have arrow keys */ -- 2.11.4.GIT