mirror of
https://github.com/Stichting-MINIX-Research-Foundation/pkgsrc-ng.git
synced 2025-09-23 03:33:34 -04:00
397 lines
12 KiB
C
397 lines
12 KiB
C
$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);
|
|
}
|
|
|
|
/**
|