78 lines
2.3 KiB
Diff
78 lines
2.3 KiB
Diff
|
|
From 36f7684d56c5d6182398b5db992c1e81ef6cb2f5 Mon Sep 17 00:00:00 2001
|
|||
|
|
From: Rozhuk Ivan <rozhuk.im@gmail.com>
|
|||
|
|
Date: Sun, 18 Oct 2020 03:06:46 +0300
|
|||
|
|
Subject: [PATCH] gunixmounts: Add cache to g_unix_mount_points_get()
|
|||
|
|
MIME-Version: 1.0
|
|||
|
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
|
|||
|
|
`_g_get_unix_mount_points()` parses `/etc/fstab` every time it’s called,
|
|||
|
|
so caching the result can improve performance when mounts are queried
|
|||
|
|
frequently.
|
|||
|
|
|
|||
|
|
The cache will remain in memory until `/etc/fstab` is next modified.
|
|||
|
|
This means that the final copy of the cache will be deliberately
|
|||
|
|
‘leaked’ on process exit.
|
|||
|
|
|
|||
|
|
Conflict:NA
|
|||
|
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/36f7684d56c5d6182398b5db992c1e81ef6cb2f5
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
gio/gunixmounts.c | 31 +++++++++++++++++++++++++++++--
|
|||
|
|
1 file changed, 29 insertions(+), 2 deletions(-)
|
|||
|
|
|
|||
|
|
diff --git a/gio/gunixmounts.c b/gio/gunixmounts.c
|
|||
|
|
index ecfa61de86..9c8ef5d666 100644
|
|||
|
|
--- a/gio/gunixmounts.c
|
|||
|
|
+++ b/gio/gunixmounts.c
|
|||
|
|
@@ -1666,6 +1666,14 @@ g_unix_mount_for (const char *file_path,
|
|||
|
|
return entry;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
+static gpointer
|
|||
|
|
+copy_mount_point_cb (gconstpointer src,
|
|||
|
|
+ gpointer data)
|
|||
|
|
+{
|
|||
|
|
+ GUnixMountPoint *src_mount_point = (GUnixMountPoint *) src;
|
|||
|
|
+ return g_unix_mount_point_copy (src_mount_point);
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
/**
|
|||
|
|
* g_unix_mount_points_get:
|
|||
|
|
* @time_read: (out) (optional): guint64 to contain a timestamp.
|
|||
|
|
@@ -1681,10 +1689,29 @@ g_unix_mount_for (const char *file_path,
|
|||
|
|
GList *
|
|||
|
|
g_unix_mount_points_get (guint64 *time_read)
|
|||
|
|
{
|
|||
|
|
+ static GList *mnt_pts_last = NULL;
|
|||
|
|
+ static guint64 time_read_last = 0;
|
|||
|
|
+ GList *mnt_pts = NULL;
|
|||
|
|
+ guint64 time_read_now;
|
|||
|
|
+ G_LOCK_DEFINE_STATIC (unix_mount_points);
|
|||
|
|
+
|
|||
|
|
+ G_LOCK (unix_mount_points);
|
|||
|
|
+
|
|||
|
|
+ time_read_now = get_mount_points_timestamp ();
|
|||
|
|
+ if (time_read_now != time_read_last || mnt_pts_last == NULL)
|
|||
|
|
+ {
|
|||
|
|
+ time_read_last = time_read_now;
|
|||
|
|
+ g_list_free_full (mnt_pts_last, (GDestroyNotify) g_unix_mount_point_free);
|
|||
|
|
+ mnt_pts_last = _g_get_unix_mount_points ();
|
|||
|
|
+ }
|
|||
|
|
+ mnt_pts = g_list_copy_deep (mnt_pts_last, copy_mount_point_cb, NULL);
|
|||
|
|
+
|
|||
|
|
+ G_UNLOCK (unix_mount_points);
|
|||
|
|
+
|
|||
|
|
if (time_read)
|
|||
|
|
- *time_read = get_mount_points_timestamp ();
|
|||
|
|
+ *time_read = time_read_now;
|
|||
|
|
|
|||
|
|
- return _g_get_unix_mount_points ();
|
|||
|
|
+ return mnt_pts;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
--
|
|||
|
|
GitLab
|
|||
|
|
|