From 64a28a9e7cec4e9841118772c6a61ea62bd66ad1 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 26 Apr 2016 15:45:44 +0200 Subject: [PATCH] XdgAppDir helper: Update system_helper threadsafely --- common/xdg-app-dir.c | 57 ++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/common/xdg-app-dir.c b/common/xdg-app-dir.c index d0a71ec0..7ea98f9f 100644 --- a/common/xdg-app-dir.c +++ b/common/xdg-app-dir.c @@ -37,6 +37,8 @@ #include "errno.h" +#define NO_SYSTEM_HELPER ((XdgAppSystemHelper *)(gpointer)1) + struct XdgAppDir { GObject parent; @@ -47,7 +49,6 @@ struct XdgAppDir { OstreeRepo *child_repo; GLnxLockFile child_repo_lock; - gboolean initialized_system_helper; XdgAppSystemHelper *system_helper; SoupSession *soup_session; @@ -198,35 +199,46 @@ xdg_app_ensure_user_cache_dir_location (GError **error) return g_steal_pointer (&cache_dir); } -static void -xdg_app_dir_init_system_helper (XdgAppDir *self) +static XdgAppSystemHelper * +xdg_app_dir_get_system_helper (XdgAppDir *self) { g_autoptr(GError) error = NULL; - if (self->initialized_system_helper) - return; + if (g_once_init_enter (&self->system_helper)) + { + XdgAppSystemHelper *system_helper; + system_helper = + xdg_app_system_helper_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + "org.freedesktop.XdgApp.SystemHelper", + "/org/freedesktop/XdgApp/SystemHelper", + NULL, &error); + if (error != NULL) + { + g_warning ("Can't find org.freedesktop.XdgApp.SystemHelper: %s\n", error->message); + system_helper = NO_SYSTEM_HELPER; + } - self->system_helper = - xdg_app_system_helper_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | - G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, - "org.freedesktop.XdgApp.SystemHelper", - "/org/freedesktop/XdgApp/SystemHelper", - NULL, &error); - if (error != NULL) - g_warning ("Can't find org.freedesktop.XdgApp.SystemHelper: %s\n", error->message); - self->initialized_system_helper = TRUE; + g_once_init_leave (&self->system_helper, system_helper); + } + + if (self->system_helper != NO_SYSTEM_HELPER) + return self->system_helper; + return NULL; } gboolean xdg_app_dir_use_child_repo (XdgAppDir *self) { + XdgAppSystemHelper *system_helper; + if (self->user || getuid () == 0) return FALSE; - xdg_app_dir_init_system_helper (self); + system_helper = xdg_app_dir_get_system_helper (self); - return self->system_helper != NULL; + return system_helper != NULL; } static OstreeRepo * @@ -2568,10 +2580,11 @@ xdg_app_dir_deploy_install (XdgAppDir *self, if (self->child_repo) { char *empty_subpaths[] = {NULL}; + XdgAppSystemHelper *system_helper = xdg_app_dir_get_system_helper (self); - g_assert (self->system_helper != NULL); + g_assert (system_helper != NULL); - if (!xdg_app_system_helper_call_deploy_sync (self->system_helper, + if (!xdg_app_system_helper_call_deploy_sync (system_helper, gs_file_get_path_cached (ostree_repo_get_path (self->child_repo)), XDG_APP_HELPER_DEPLOY_FLAGS_NONE, ref, @@ -2678,9 +2691,11 @@ xdg_app_dir_deploy_update (XdgAppDir *self, active_checksum = xdg_app_dir_read_active (self, ref, NULL); if (active_checksum == NULL || strcmp (active_checksum, pulled_checksum) != 0) { - g_assert (self->system_helper != NULL); + XdgAppSystemHelper *system_helper = xdg_app_dir_get_system_helper (self); - if (!xdg_app_system_helper_call_deploy_sync (self->system_helper, + g_assert (system_helper != NULL); + + if (!xdg_app_system_helper_call_deploy_sync (system_helper, gs_file_get_path_cached (ostree_repo_get_path (self->child_repo)), XDG_APP_HELPER_DEPLOY_FLAGS_UPDATE, ref,