summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@redhat.com>2012-05-18 17:23:01 +0200
committerTomas Bzatek <tbzatek@redhat.com>2012-05-21 15:50:28 +0200
commit8f8628960d724c1d01ebd53a9f3e6060fed4b404 (patch)
tree573e2e746d66c585c390d1430e8ee79887bf6798
parent43d68f9b0230c960f41693c64c1a1d11a022f371 (diff)
downloadgvfs-8f8628960d724c1d01ebd53a9f3e6060fed4b404.tar.gz
gdbus: Use shared metadata proxy for every thread
This helps to avoid constant metadata proxy creation for every call. Instead, create it on first use and store it as thread-local data. It gets unreff'ed on thread end automatically.
-rw-r--r--client/gdaemonfile.c30
-rw-r--r--client/gdaemonvfs.c48
2 files changed, 47 insertions, 31 deletions
diff --git a/client/gdaemonfile.c b/client/gdaemonfile.c
index 4f400fae..514cf672 100644
--- a/client/gdaemonfile.c
+++ b/client/gdaemonfile.c
@@ -55,6 +55,8 @@ G_DEFINE_TYPE_WITH_CODE (GDaemonFile, g_daemon_file, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_FILE,
g_daemon_file_file_iface_init))
+static GPrivate metadata_proxy = G_PRIVATE_INIT (g_object_unref);
+
static void
g_daemon_file_finalize (GObject *object)
{
@@ -2207,6 +2209,26 @@ g_daemon_file_query_writable_namespaces (GFile *file,
return list;
}
+static GVfsMetadata *
+get_metadata_proxy (GCancellable *cancellable, GError **error)
+{
+ GVfsMetadata *proxy;
+
+ proxy = g_private_get (&metadata_proxy);
+ if (proxy == NULL)
+ {
+ proxy = gvfs_metadata_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ G_VFS_DBUS_METADATA_NAME,
+ G_VFS_DBUS_METADATA_PATH,
+ cancellable,
+ error);
+ g_private_replace (&metadata_proxy, proxy);
+ }
+
+ return proxy;
+}
+
static gboolean
set_metadata_attribute (GFile *file,
const char *attribute,
@@ -2231,12 +2253,7 @@ set_metadata_attribute (GFile *file,
g_free (treename);
res = FALSE;
- proxy = gvfs_metadata_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- G_VFS_DBUS_METADATA_NAME,
- G_VFS_DBUS_METADATA_PATH,
- cancellable,
- error);
+ proxy = get_metadata_proxy (cancellable, error);
if (proxy)
{
@@ -2270,7 +2287,6 @@ set_metadata_attribute (GFile *file,
res = FALSE;
g_variant_builder_unref (builder);
- g_object_unref (proxy);
}
meta_tree_unref (tree);
diff --git a/client/gdaemonvfs.c b/client/gdaemonvfs.c
index df2a33d1..cb367715 100644
--- a/client/gdaemonvfs.c
+++ b/client/gdaemonvfs.c
@@ -77,6 +77,7 @@ struct _GDaemonVfsClass
G_DEFINE_DYNAMIC_TYPE (GDaemonVfs, g_daemon_vfs, G_TYPE_VFS)
static GDaemonVfs *the_vfs = NULL;
+static GPrivate metadata_proxy = G_PRIVATE_INIT (g_object_unref);
G_LOCK_DEFINE_STATIC(mount_cache);
@@ -1281,6 +1282,26 @@ _g_daemon_vfs_append_metadata_for_set (GVariantBuilder *builder,
return res;
}
+static GVfsMetadata *
+get_metadata_proxy (GError **error)
+{
+ GVfsMetadata *proxy;
+
+ proxy = g_private_get (&metadata_proxy);
+ if (proxy == NULL)
+ {
+ proxy = gvfs_metadata_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ G_VFS_DBUS_METADATA_NAME,
+ G_VFS_DBUS_METADATA_PATH,
+ NULL,
+ error);
+ g_private_replace (&metadata_proxy, proxy);
+ }
+
+ return proxy;
+}
+
static gboolean
g_daemon_vfs_local_file_set_attributes (GVfs *vfs,
const char *filename,
@@ -1333,13 +1354,7 @@ g_daemon_vfs_local_file_set_attributes (GVfs *vfs,
FALSE,
&tree_path);
- proxy = gvfs_metadata_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- G_VFS_DBUS_METADATA_NAME,
- G_VFS_DBUS_METADATA_PATH,
- NULL,
- error);
-
+ proxy = get_metadata_proxy (error);
if (proxy == NULL)
{
res = FALSE;
@@ -1397,7 +1412,6 @@ g_daemon_vfs_local_file_set_attributes (GVfs *vfs,
}
g_variant_builder_unref (builder);
- g_object_unref (proxy);
meta_lookup_cache_free (cache);
meta_tree_unref (tree);
@@ -1429,13 +1443,7 @@ g_daemon_vfs_local_file_removed (GVfs *vfs,
&tree_path);
if (tree)
{
- proxy = gvfs_metadata_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- G_VFS_DBUS_METADATA_NAME,
- G_VFS_DBUS_METADATA_PATH,
- NULL,
- NULL);
-
+ proxy = get_metadata_proxy (NULL);
if (proxy)
{
metatreefile = meta_tree_get_filename (tree);
@@ -1444,7 +1452,6 @@ g_daemon_vfs_local_file_removed (GVfs *vfs,
tree_path,
NULL,
NULL);
- g_object_unref (proxy);
}
meta_tree_unref (tree);
@@ -1478,13 +1485,7 @@ g_daemon_vfs_local_file_moved (GVfs *vfs,
&tree_path2);
if (tree1 && tree2 && tree1 == tree2)
{
- proxy = gvfs_metadata_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- G_VFS_DBUS_METADATA_NAME,
- G_VFS_DBUS_METADATA_PATH,
- NULL,
- NULL);
-
+ proxy = get_metadata_proxy (NULL);
if (proxy)
{
metatreefile = meta_tree_get_filename (tree1);
@@ -1494,7 +1495,6 @@ g_daemon_vfs_local_file_moved (GVfs *vfs,
tree_path2,
NULL,
NULL);
- g_object_unref (proxy);
}
}