]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
Fix inotify shutdown
authorColin Walters <walters@verbum.org>
Tue, 2 Feb 2010 17:37:17 +0000 (12:37 -0500)
committerColin Walters <walters@verbum.org>
Tue, 2 Feb 2010 20:04:45 +0000 (15:04 -0500)
We were incorrectly passing NULL for a DBusList when the usage expected
is a pointer to a NULL DBusList pointer.  Also during dbus_shutdown
we need to actually close the inotify fd, and remove our watch.

Move the shutdown handler out of bus.c and into inotify where we
can do all of this cleanly.

bus/bus.c
bus/dir-watch-inotify.c

index bfd398e6389cebecb88896585d441583aead87e9..8150df249f079ca241803ced1ea7ceadd59f1a73 100644 (file)
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -551,12 +551,6 @@ process_config_postinit (BusContext      *context,
   return TRUE;
 }
 
-static void
-bus_shutdown_all_directory_watches (void *data)
-{
-  bus_set_watched_dirs ((BusContext *) data, NULL);
-}
-
 BusContext*
 bus_context_new (const DBusString *config_file,
                  ForceForkSetting  force_fork,
@@ -588,8 +582,6 @@ bus_context_new (const DBusString *config_file,
 
   _dbus_generate_uuid (&context->uuid);
 
-  _dbus_register_shutdown_func (bus_shutdown_all_directory_watches, context);
-
   if (!_dbus_string_copy_data (config_file, &context->config_file))
     {
       BUS_SET_OOM (error);
index f87a6347e3eaf79e349534066198924d9ca0ed5f..bb71394c89acaac0c0e79e8e1c0bad8977197da1 100644 (file)
@@ -92,59 +92,16 @@ _handle_inotify_watch (DBusWatch *passed_watch, unsigned int flags, void *data)
   return TRUE;
 }
 
-static int
-_init_inotify (BusContext *context)
-{
-  int ret = 0;
-
-  if (inotify_fd == -1) {
-#ifdef HAVE_INOTIFY_INIT1
-     inotify_fd = inotify_init1 (IN_CLOEXEC);
-#else
-     inotify_fd = inotify_init ();
-#endif
-     if (inotify_fd <= 0) {
-      _dbus_warn ("Cannot initialize inotify\n");
-      goto out;
-     } 
-     loop = bus_context_get_loop (context);
-
-     watch = _dbus_watch_new (inotify_fd, DBUS_WATCH_READABLE, TRUE,
-                              _handle_inotify_watch, NULL, NULL);
-
-     if (watch == NULL)
-       {
-         _dbus_warn ("Unable to create inotify watch\n");
-         goto out;
-       }
-
-     if (!_dbus_loop_add_watch (loop, watch, _inotify_watch_callback,
-                                NULL, NULL))
-       {
-         _dbus_warn ("Unable to add reload watch to main loop");
-        _dbus_watch_unref (watch);
-        watch = NULL;
-         goto out;
-       }
-  }
+#include <stdio.h>
 
-  ret = 1;
-
-out:
-  return ret;
-}
-
-void
-bus_set_watched_dirs (BusContext *context, DBusList **directories)
+static void
+_set_watched_dirs_internal (DBusList **directories)
 {
   int new_wds[MAX_DIRS_TO_WATCH];
   char *new_dirs[MAX_DIRS_TO_WATCH];
   DBusList *link;
   int i, j, wd;
 
-  if (!_init_inotify (context))
-    goto out;
-
   for (i = 0; i < MAX_DIRS_TO_WATCH; i++)
     {
       new_wds[i] = -1;
@@ -226,3 +183,82 @@ bus_set_watched_dirs (BusContext *context, DBusList **directories)
 
  out:;
 }
+
+#include <stdio.h>
+static void
+_shutdown_inotify (void *data)
+{
+  DBusList *empty = NULL;
+
+  if (inotify_fd == -1)
+    return;
+
+  _set_watched_dirs_internal (&empty);
+
+  close (inotify_fd);
+  inotify_fd = -1;
+  if (watch != NULL)
+    {
+      _dbus_loop_remove_watch (loop, watch, _inotify_watch_callback, NULL);
+      _dbus_watch_unref (watch);
+      _dbus_loop_unref (loop);
+    }
+  watch = NULL;
+  loop = NULL;
+}
+
+static int
+_init_inotify (BusContext *context)
+{
+  int ret = 0;
+
+  if (inotify_fd == -1)
+    {
+#ifdef HAVE_INOTIFY_INIT1
+      inotify_fd = inotify_init1 (IN_CLOEXEC);
+#else
+      inotify_fd = inotify_init ();
+#endif
+      if (inotify_fd <= 0)
+        {
+          _dbus_warn ("Cannot initialize inotify\n");
+          goto out;
+        }
+      loop = bus_context_get_loop (context);
+      _dbus_loop_ref (loop);
+
+      watch = _dbus_watch_new (inotify_fd, DBUS_WATCH_READABLE, TRUE,
+                               _handle_inotify_watch, NULL, NULL);
+
+      if (watch == NULL)
+        {
+          _dbus_warn ("Unable to create inotify watch\n");
+          goto out;
+        }
+
+      if (!_dbus_loop_add_watch (loop, watch, _inotify_watch_callback,
+                                 NULL, NULL))
+        {
+          _dbus_warn ("Unable to add reload watch to main loop");
+          _dbus_watch_unref (watch);
+          watch = NULL;
+          goto out;
+        }
+
+      _dbus_register_shutdown_func (_shutdown_inotify, NULL);
+    }
+
+  ret = 1;
+
+out:
+  return ret;
+}
+
+void
+bus_set_watched_dirs (BusContext *context, DBusList **directories)
+{
+  if (!_init_inotify (context))
+    return;
+
+  _set_watched_dirs_internal (directories);
+}