summaryrefslogtreecommitdiff
path: root/devel/glib2/patches/patch-gio_gunixmounts.c
diff options
context:
space:
mode:
Diffstat (limited to 'devel/glib2/patches/patch-gio_gunixmounts.c')
-rw-r--r--devel/glib2/patches/patch-gio_gunixmounts.c396
1 files changed, 396 insertions, 0 deletions
diff --git a/devel/glib2/patches/patch-gio_gunixmounts.c b/devel/glib2/patches/patch-gio_gunixmounts.c
new file mode 100644
index 00000000000..956273423c0
--- /dev/null
+++ b/devel/glib2/patches/patch-gio_gunixmounts.c
@@ -0,0 +1,396 @@
+$NetBSD: patch-gio_gunixmounts.c,v 1.1 2015/06/10 23:00:05 prlw1 Exp $
+
+Revert commit 548c165a Make GUnixMountMonitor per-context
+https://bugzilla.gnome.org/show_bug.cgi?id=750708
+
+--- gio/gunixmounts.c.orig 2015-03-13 20:48:21.000000000 +0000
++++ gio/gunixmounts.c
+@@ -68,7 +68,6 @@
+ #include "gfilemonitor.h"
+ #include "glibintl.h"
+ #include "gthemedicon.h"
+-#include "gcontextspecificgroup.h"
+
+
+ #ifdef HAVE_MNTENT_H
+@@ -1275,50 +1274,124 @@ static guint signals[LAST_SIGNAL];
+ struct _GUnixMountMonitor {
+ GObject parent;
+
+- GMainContext *context;
++ GFileMonitor *fstab_monitor;
++ GFileMonitor *mtab_monitor;
++
++ GList *mount_poller_mounts;
++
++ GSource *proc_mounts_watch_source;
+ };
+
+ struct _GUnixMountMonitorClass {
+ GObjectClass parent_class;
+ };
+
++static GUnixMountMonitor *the_mount_monitor = NULL;
+
+ G_DEFINE_TYPE (GUnixMountMonitor, g_unix_mount_monitor, G_TYPE_OBJECT);
+
+-static GContextSpecificGroup mount_monitor_group;
+-static GFileMonitor *fstab_monitor;
+-static GFileMonitor *mtab_monitor;
+-static GSource *proc_mounts_watch_source;
+-static GList *mount_poller_mounts;
++static void
++g_unix_mount_monitor_finalize (GObject *object)
++{
++ GUnixMountMonitor *monitor;
++
++ monitor = G_UNIX_MOUNT_MONITOR (object);
++
++ if (monitor->fstab_monitor)
++ {
++ g_file_monitor_cancel (monitor->fstab_monitor);
++ g_object_unref (monitor->fstab_monitor);
++ }
++
++ if (monitor->proc_mounts_watch_source != NULL)
++ g_source_destroy (monitor->proc_mounts_watch_source);
++
++ if (monitor->mtab_monitor)
++ {
++ g_file_monitor_cancel (monitor->mtab_monitor);
++ g_object_unref (monitor->mtab_monitor);
++ }
++
++ g_list_free_full (monitor->mount_poller_mounts, (GDestroyNotify)g_unix_mount_free);
++
++ the_mount_monitor = NULL;
++
++ G_OBJECT_CLASS (g_unix_mount_monitor_parent_class)->finalize (object);
++}
++
++
++static void
++g_unix_mount_monitor_class_init (GUnixMountMonitorClass *klass)
++{
++ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
++
++ gobject_class->finalize = g_unix_mount_monitor_finalize;
++
++ /**
++ * GUnixMountMonitor::mounts-changed:
++ * @monitor: the object on which the signal is emitted
++ *
++ * Emitted when the unix mounts have changed.
++ */
++ signals[MOUNTS_CHANGED] =
++ g_signal_new ("mounts-changed",
++ G_TYPE_FROM_CLASS (klass),
++ G_SIGNAL_RUN_LAST,
++ 0,
++ NULL, NULL,
++ g_cclosure_marshal_VOID__VOID,
++ G_TYPE_NONE, 0);
++
++ /**
++ * GUnixMountMonitor::mountpoints-changed:
++ * @monitor: the object on which the signal is emitted
++ *
++ * Emitted when the unix mount points have changed.
++ */
++ signals[MOUNTPOINTS_CHANGED] =
++ g_signal_new ("mountpoints-changed",
++ G_TYPE_FROM_CLASS (klass),
++ G_SIGNAL_RUN_LAST,
++ 0,
++ NULL, NULL,
++ g_cclosure_marshal_VOID__VOID,
++ G_TYPE_NONE, 0);
++}
+
+ static void
+ fstab_file_changed (GFileMonitor *monitor,
+- GFile *file,
+- GFile *other_file,
+- GFileMonitorEvent event_type,
+- gpointer user_data)
++ GFile *file,
++ GFile *other_file,
++ GFileMonitorEvent event_type,
++ gpointer user_data)
+ {
++ GUnixMountMonitor *mount_monitor;
++
+ if (event_type != G_FILE_MONITOR_EVENT_CHANGED &&
+ event_type != G_FILE_MONITOR_EVENT_CREATED &&
+ event_type != G_FILE_MONITOR_EVENT_DELETED)
+ return;
+
+- g_context_specific_group_emit (&mount_monitor_group, signals[MOUNTPOINTS_CHANGED]);
++ mount_monitor = user_data;
++ g_signal_emit (mount_monitor, signals[MOUNTPOINTS_CHANGED], 0);
+ }
+
+ static void
+ mtab_file_changed (GFileMonitor *monitor,
+- GFile *file,
+- GFile *other_file,
+- GFileMonitorEvent event_type,
+- gpointer user_data)
++ GFile *file,
++ GFile *other_file,
++ GFileMonitorEvent event_type,
++ gpointer user_data)
+ {
++ GUnixMountMonitor *mount_monitor;
++
+ if (event_type != G_FILE_MONITOR_EVENT_CHANGED &&
+ event_type != G_FILE_MONITOR_EVENT_CREATED &&
+ event_type != G_FILE_MONITOR_EVENT_DELETED)
+ return;
+-
+- g_context_specific_group_emit (&mount_monitor_group, signals[MOUNTS_CHANGED]);
++
++ mount_monitor = user_data;
++ g_signal_emit (mount_monitor, signals[MOUNTS_CHANGED], 0);
+ }
+
+ static gboolean
+@@ -1326,21 +1399,23 @@ proc_mounts_changed (GIOChannel *chann
+ GIOCondition cond,
+ gpointer user_data)
+ {
++ GUnixMountMonitor *mount_monitor = G_UNIX_MOUNT_MONITOR (user_data);
+ if (cond & G_IO_ERR)
+- g_context_specific_group_emit (&mount_monitor_group, signals[MOUNTS_CHANGED]);
+-
++ g_signal_emit (mount_monitor, signals[MOUNTS_CHANGED], 0);
+ return TRUE;
+ }
+
+ static gboolean
+ mount_change_poller (gpointer user_data)
+ {
++ GUnixMountMonitor *mount_monitor;
+ GList *current_mounts, *new_it, *old_it;
+ gboolean has_changed = FALSE;
+
++ mount_monitor = user_data;
+ current_mounts = _g_get_unix_mounts ();
+
+- for ( new_it = current_mounts, old_it = mount_poller_mounts;
++ for ( new_it = current_mounts, old_it = mount_monitor->mount_poller_mounts;
+ new_it != NULL && old_it != NULL;
+ new_it = g_list_next (new_it), old_it = g_list_next (old_it) )
+ {
+@@ -1353,55 +1428,34 @@ mount_change_poller (gpointer user_data)
+ if (!(new_it == NULL && old_it == NULL))
+ has_changed = TRUE;
+
+- g_list_free_full (mount_poller_mounts, (GDestroyNotify) g_unix_mount_free);
++ g_list_free_full (mount_monitor->mount_poller_mounts,
++ (GDestroyNotify)g_unix_mount_free);
+
+- mount_poller_mounts = current_mounts;
++ mount_monitor->mount_poller_mounts = current_mounts;
+
+ if (has_changed)
+ {
+- mount_poller_time = (guint64) g_get_monotonic_time ();
+- g_context_specific_group_emit (&mount_monitor_group, signals[MOUNTPOINTS_CHANGED]);
++ mount_poller_time = (guint64)g_get_monotonic_time ();
++ g_signal_emit (mount_monitor, signals[MOUNTS_CHANGED], 0);
+ }
+
+ return TRUE;
+ }
+
+-
+-static void
+-mount_monitor_stop (void)
+-{
+- if (fstab_monitor)
+- {
+- g_file_monitor_cancel (fstab_monitor);
+- g_object_unref (fstab_monitor);
+- }
+-
+- if (proc_mounts_watch_source != NULL)
+- g_source_destroy (proc_mounts_watch_source);
+-
+- if (mtab_monitor)
+- {
+- g_file_monitor_cancel (mtab_monitor);
+- g_object_unref (mtab_monitor);
+- }
+-
+- g_list_free_full (mount_poller_mounts, (GDestroyNotify) g_unix_mount_free);
+-}
+-
+ static void
+-mount_monitor_start (void)
++g_unix_mount_monitor_init (GUnixMountMonitor *monitor)
+ {
+ GFile *file;
+-
++
+ if (get_fstab_file () != NULL)
+ {
+ file = g_file_new_for_path (get_fstab_file ());
+- fstab_monitor = g_file_monitor_file (file, 0, NULL, NULL);
++ monitor->fstab_monitor = g_file_monitor_file (file, 0, NULL, NULL);
+ g_object_unref (file);
+-
+- g_signal_connect (fstab_monitor, "changed", (GCallback)fstab_file_changed, NULL);
++
++ g_signal_connect (monitor->fstab_monitor, "changed", (GCallback)fstab_file_changed, monitor);
+ }
+-
++
+ if (get_mtab_monitor_file () != NULL)
+ {
+ const gchar *mtab_path;
+@@ -1423,93 +1477,39 @@ mount_monitor_start (void)
+ }
+ else
+ {
+- proc_mounts_watch_source = g_io_create_watch (proc_mounts_channel, G_IO_ERR);
+- g_source_set_callback (proc_mounts_watch_source,
++ monitor->proc_mounts_watch_source = g_io_create_watch (proc_mounts_channel, G_IO_ERR);
++ g_source_set_callback (monitor->proc_mounts_watch_source,
+ (GSourceFunc) proc_mounts_changed,
+- NULL, NULL);
+- g_source_attach (proc_mounts_watch_source,
++ monitor,
++ NULL);
++ g_source_attach (monitor->proc_mounts_watch_source,
+ g_main_context_get_thread_default ());
+- g_source_unref (proc_mounts_watch_source);
++ g_source_unref (monitor->proc_mounts_watch_source);
+ g_io_channel_unref (proc_mounts_channel);
+ }
+ }
+ else
+ {
+ file = g_file_new_for_path (mtab_path);
+- mtab_monitor = g_file_monitor_file (file, 0, NULL, NULL);
++ monitor->mtab_monitor = g_file_monitor_file (file, 0, NULL, NULL);
+ g_object_unref (file);
+- g_signal_connect (mtab_monitor, "changed", (GCallback)mtab_file_changed, NULL);
++ g_signal_connect (monitor->mtab_monitor, "changed", (GCallback)mtab_file_changed, monitor);
+ }
+ }
+ else
+ {
+- proc_mounts_watch_source = g_timeout_source_new_seconds (3);
+- mount_poller_mounts = _g_get_unix_mounts ();
++ monitor->proc_mounts_watch_source = g_timeout_source_new_seconds (3);
++ monitor->mount_poller_mounts = _g_get_unix_mounts ();
+ mount_poller_time = (guint64)g_get_monotonic_time ();
+- g_source_set_callback (proc_mounts_watch_source,
+- mount_change_poller,
+- NULL, NULL);
+- g_source_attach (proc_mounts_watch_source,
++ g_source_set_callback (monitor->proc_mounts_watch_source,
++ (GSourceFunc)mount_change_poller,
++ monitor, NULL);
++ g_source_attach (monitor->proc_mounts_watch_source,
+ g_main_context_get_thread_default ());
+- g_source_unref (proc_mounts_watch_source);
++ g_source_unref (monitor->proc_mounts_watch_source);
+ }
+ }
+
+-static void
+-g_unix_mount_monitor_finalize (GObject *object)
+-{
+- GUnixMountMonitor *monitor;
+-
+- monitor = G_UNIX_MOUNT_MONITOR (object);
+-
+- g_context_specific_group_remove (&mount_monitor_group, monitor->context, monitor, mount_monitor_stop);
+-
+- G_OBJECT_CLASS (g_unix_mount_monitor_parent_class)->finalize (object);
+-}
+-
+-static void
+-g_unix_mount_monitor_class_init (GUnixMountMonitorClass *klass)
+-{
+- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+-
+- gobject_class->finalize = g_unix_mount_monitor_finalize;
+-
+- /**
+- * GUnixMountMonitor::mounts-changed:
+- * @monitor: the object on which the signal is emitted
+- *
+- * Emitted when the unix mounts have changed.
+- */
+- signals[MOUNTS_CHANGED] =
+- g_signal_new ("mounts-changed",
+- G_TYPE_FROM_CLASS (klass),
+- G_SIGNAL_RUN_LAST,
+- 0,
+- NULL, NULL,
+- g_cclosure_marshal_VOID__VOID,
+- G_TYPE_NONE, 0);
+-
+- /**
+- * GUnixMountMonitor::mountpoints-changed:
+- * @monitor: the object on which the signal is emitted
+- *
+- * Emitted when the unix mount points have changed.
+- */
+- signals[MOUNTPOINTS_CHANGED] =
+- g_signal_new ("mountpoints-changed",
+- G_TYPE_FROM_CLASS (klass),
+- G_SIGNAL_RUN_LAST,
+- 0,
+- NULL, NULL,
+- g_cclosure_marshal_VOID__VOID,
+- G_TYPE_NONE, 0);
+-}
+-
+-static void
+-g_unix_mount_monitor_init (GUnixMountMonitor *monitor)
+-{
+-}
+-
+ /**
+ * g_unix_mount_monitor_set_rate_limit:
+ * @mount_monitor: a #GUnixMountMonitor
+@@ -1537,16 +1537,12 @@ g_unix_mount_monitor_set_rate_limit (GUn
+ /**
+ * g_unix_mount_monitor_get:
+ *
+- * Gets the #GUnixMountMonitor for the current thread-default main
+- * context.
++ * Gets the #GUnixMountMonitor.
+ *
+ * The mount monitor can be used to monitor for changes to the list of
+ * mounted filesystems as well as the list of mount points (ie: fstab
+ * entries).
+ *
+- * You must only call g_object_unref() on the return value from under
+- * the same main context as you called this function.
+- *
+ * Returns: (transfer full): the #GUnixMountMonitor.
+ *
+ * Since: 2.44
+@@ -1554,10 +1550,13 @@ g_unix_mount_monitor_set_rate_limit (GUn
+ GUnixMountMonitor *
+ g_unix_mount_monitor_get (void)
+ {
+- return g_context_specific_group_get (&mount_monitor_group,
+- G_TYPE_UNIX_MOUNT_MONITOR,
+- G_STRUCT_OFFSET(GUnixMountMonitor, context),
+- mount_monitor_start);
++ if (the_mount_monitor == NULL)
++ {
++ the_mount_monitor = g_object_new (G_TYPE_UNIX_MOUNT_MONITOR, NULL);
++ return the_mount_monitor;
++ }
++
++ return g_object_ref (the_mount_monitor);
+ }
+
+ /**