XdgAppDir helper: Update system_helper threadsafely

tingping/wmclass
Alexander Larsson 2016-04-26 15:45:44 +02:00
parent 990127fe11
commit 64a28a9e7c
1 changed files with 36 additions and 21 deletions

View File

@ -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,