diff options
Diffstat (limited to 'devel/glib2/patches/patch-gio_gunixmounts.c')
-rw-r--r-- | devel/glib2/patches/patch-gio_gunixmounts.c | 396 |
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); + } + + /** |