[gnome-software/wip/hughsie/packagekit-thread-safety: 2/2] Add mutexes to protect access to PkClient and PkTask
- From: Kalev Lember <klember src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/hughsie/packagekit-thread-safety: 2/2] Add mutexes to protect access to PkClient and PkTask
- Date: Tue, 12 Feb 2019 09:36:16 +0000 (UTC)
commit d427457242adb99cf7d90c3678ef472c5d91fcd6
Author: Richard Hughes <richard hughsie com>
Date: Thu Feb 7 16:40:55 2019 +0000
Add mutexes to protect access to PkClient and PkTask
This fixes the GUI hanging in an unresponsive state. The libpackagekit-glib
library isn't as thread safe as we'd like, and although we can fix PK to be
safer we can't depend on that very new version just yet.
plugins/packagekit/gs-plugin-packagekit-local.c | 14 +++++
.../packagekit/gs-plugin-packagekit-refine-repos.c | 9 +++
plugins/packagekit/gs-plugin-packagekit-refine.c | 34 ++++++++++++
plugins/packagekit/gs-plugin-packagekit-refresh.c | 14 +++++
plugins/packagekit/gs-plugin-packagekit-upgrade.c | 9 +++
.../packagekit/gs-plugin-packagekit-url-to-app.c | 10 +++-
plugins/packagekit/gs-plugin-packagekit.c | 64 ++++++++++++++++++++++
7 files changed, 153 insertions(+), 1 deletion(-)
---
diff --git a/plugins/packagekit/gs-plugin-packagekit-local.c b/plugins/packagekit/gs-plugin-packagekit-local.c
index e6ebb7fd..be230747 100644
--- a/plugins/packagekit/gs-plugin-packagekit-local.c
+++ b/plugins/packagekit/gs-plugin-packagekit-local.c
@@ -18,12 +18,15 @@
struct GsPluginData {
PkTask *task;
+ GMutex task_mutex;
};
void
gs_plugin_initialize (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
+
+ g_mutex_init (&priv->task_mutex);
priv->task = pk_task_new ();
pk_client_set_background (PK_CLIENT (priv->task), FALSE);
}
@@ -32,6 +35,7 @@ void
gs_plugin_destroy (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_mutex_clear (&priv->task_mutex);
g_object_unref (priv->task);
}
@@ -51,6 +55,11 @@ gs_plugin_packagekit_refresh_guess_app_id (GsPlugin *plugin,
g_auto(GStrv) files = NULL;
g_autoptr(PkResults) results = NULL;
g_autoptr(GPtrArray) array = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* get file list so we can work out ID */
files = g_strsplit (filename, "\t", -1);
@@ -128,6 +137,7 @@ gs_plugin_file_to_app (GsPlugin *plugin,
g_auto(GStrv) split = NULL;
g_autoptr(GPtrArray) array = NULL;
g_autoptr(GsApp) app = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
const gchar *mimetypes[] = {
"application/x-app-package",
"application/x-deb",
@@ -143,6 +153,10 @@ gs_plugin_file_to_app (GsPlugin *plugin,
if (!g_strv_contains (mimetypes, content_type))
return TRUE;
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
+
/* get details */
filename = g_file_get_path (file);
files = g_strsplit (filename, "\t", -1);
diff --git a/plugins/packagekit/gs-plugin-packagekit-refine-repos.c
b/plugins/packagekit/gs-plugin-packagekit-refine-repos.c
index 4e2b20ed..6ba8f2f6 100644
--- a/plugins/packagekit/gs-plugin-packagekit-refine-repos.c
+++ b/plugins/packagekit/gs-plugin-packagekit-refine-repos.c
@@ -24,12 +24,15 @@
struct GsPluginData {
PkClient *client;
+ GMutex client_mutex;
};
void
gs_plugin_initialize (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
+
+ g_mutex_init (&priv->client_mutex);
priv->client = pk_client_new ();
pk_client_set_background (priv->client, FALSE);
pk_client_set_cache_age (priv->client, G_MAXUINT);
@@ -42,6 +45,7 @@ void
gs_plugin_destroy (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_mutex_clear (&priv->client_mutex);
g_object_unref (priv->client);
}
@@ -57,6 +61,11 @@ gs_plugin_packagekit_refine_repo_from_filename (GsPlugin *plugin,
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
g_autoptr(GPtrArray) packages = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->client_mutex);
+ g_assert (locker != NULL);
to_array[0] = filename;
gs_packagekit_helper_add_app (helper, app);
diff --git a/plugins/packagekit/gs-plugin-packagekit-refine.c
b/plugins/packagekit/gs-plugin-packagekit-refine.c
index 6902d485..5230b81d 100644
--- a/plugins/packagekit/gs-plugin-packagekit-refine.c
+++ b/plugins/packagekit/gs-plugin-packagekit-refine.c
@@ -27,6 +27,7 @@
struct GsPluginData {
PkControl *control;
PkClient *client;
+ GMutex client_mutex;
};
static void
@@ -45,6 +46,8 @@ void
gs_plugin_initialize (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
+
+ g_mutex_init (&priv->client_mutex);
priv->client = pk_client_new ();
priv->control = pk_control_new ();
g_signal_connect (priv->control, "updates-changed",
@@ -63,6 +66,7 @@ void
gs_plugin_destroy (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_mutex_clear (&priv->client_mutex);
g_object_unref (priv->client);
g_object_unref (priv->control);
}
@@ -95,6 +99,7 @@ gs_plugin_packagekit_resolve_packages_with_filter (GsPlugin *plugin,
g_autoptr(PkResults) results = NULL;
g_autoptr(GPtrArray) package_ids = NULL;
g_autoptr(GPtrArray) packages = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
package_ids = g_ptr_array_new_with_free_func (g_free);
for (i = 0; i < gs_app_list_length (list); i++) {
@@ -115,6 +120,10 @@ gs_plugin_packagekit_resolve_packages_with_filter (GsPlugin *plugin,
return TRUE;
g_ptr_array_add (package_ids, NULL);
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->client_mutex);
+ g_assert (locker != NULL);
+
/* resolve them all at once */
results = pk_client_resolve (priv->client,
filter,
@@ -202,6 +211,11 @@ gs_plugin_packagekit_refine_from_desktop (GsPlugin *plugin,
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
g_autoptr(GPtrArray) packages = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->client_mutex);
+ g_assert (locker != NULL);
to_array[0] = filename;
gs_packagekit_helper_add_app (helper, app);
@@ -272,6 +286,7 @@ gs_plugin_packagekit_refine_updatedetails (GsPlugin *plugin,
g_autofree const gchar **package_ids = NULL;
g_autoptr(PkResults) results = NULL;
g_autoptr(GPtrArray) array = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
package_ids = g_new0 (const gchar *, gs_app_list_length (list) + 1);
for (guint i = 0; i < gs_app_list_length (list); i++) {
@@ -285,6 +300,10 @@ gs_plugin_packagekit_refine_updatedetails (GsPlugin *plugin,
if (cnt == 0)
return TRUE;
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->client_mutex);
+ g_assert (locker != NULL);
+
/* get any update details */
results = pk_client_get_update_detail (priv->client,
(gchar **) package_ids,
@@ -334,6 +353,7 @@ gs_plugin_packagekit_refine_details2 (GsPlugin *plugin,
g_autoptr(GPtrArray) array = NULL;
g_autoptr(GPtrArray) package_ids = NULL;
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
package_ids = g_ptr_array_new_with_free_func (g_free);
for (i = 0; i < gs_app_list_length (list); i++) {
@@ -348,6 +368,10 @@ gs_plugin_packagekit_refine_details2 (GsPlugin *plugin,
return TRUE;
g_ptr_array_add (package_ids, NULL);
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->client_mutex);
+ g_assert (locker != NULL);
+
/* get any details */
results = pk_client_get_details (priv->client,
(gchar **) package_ids->pdata,
@@ -385,11 +409,16 @@ gs_plugin_packagekit_refine_update_urgency (GsPlugin *plugin,
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkPackageSack) sack = NULL;
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
/* not required */
if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY) == 0)
return TRUE;
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->client_mutex);
+ g_assert (locker != NULL);
+
/* get the list of updates */
filter = pk_bitfield_value (PK_FILTER_ENUM_NONE);
results = pk_client_get_updates (priv->client,
@@ -564,11 +593,16 @@ gs_plugin_packagekit_refine_distro_upgrade (GsPlugin *plugin,
GsPluginData *priv = gs_plugin_get_data (plugin);
guint i;
GsApp *app2;
+ g_autoptr(GMutexLocker) locker = NULL;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
g_autoptr(GsAppList) list = NULL;
guint cache_age_save;
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->client_mutex);
+ g_assert (locker != NULL);
+
/* ask PK to simulate upgrading the system */
cache_age_save = pk_client_get_cache_age (priv->client);
pk_client_set_cache_age (priv->client, 60 * 60 * 24 * 7); /* once per week */
diff --git a/plugins/packagekit/gs-plugin-packagekit-refresh.c
b/plugins/packagekit/gs-plugin-packagekit-refresh.c
index b470e7cb..488f4b85 100644
--- a/plugins/packagekit/gs-plugin-packagekit-refresh.c
+++ b/plugins/packagekit/gs-plugin-packagekit-refresh.c
@@ -22,12 +22,15 @@
struct GsPluginData {
PkTask *task;
+ GMutex task_mutex;
};
void
gs_plugin_initialize (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
+
+ g_mutex_init (&priv->task_mutex);
priv->task = pk_task_new ();
pk_task_set_only_download (priv->task, TRUE);
pk_client_set_background (PK_CLIENT (priv->task), TRUE);
@@ -40,6 +43,7 @@ void
gs_plugin_destroy (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_mutex_clear (&priv->task_mutex);
g_object_unref (priv->task);
}
@@ -53,6 +57,11 @@ _download_only (GsPlugin *plugin, GsAppList *list,
g_autoptr(PkPackageSack) sack = NULL;
g_autoptr(PkResults) results2 = NULL;
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* never refresh the metadata here as this can surprise the frontend if
* we end up downloading a different set of packages than what was
@@ -134,6 +143,11 @@ gs_plugin_refresh (GsPlugin *plugin,
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* cache age of 1 is user-initiated */
pk_client_set_background (PK_CLIENT (priv->task), cache_age > 1);
diff --git a/plugins/packagekit/gs-plugin-packagekit-upgrade.c
b/plugins/packagekit/gs-plugin-packagekit-upgrade.c
index e6e0ec7f..50a74298 100644
--- a/plugins/packagekit/gs-plugin-packagekit-upgrade.c
+++ b/plugins/packagekit/gs-plugin-packagekit-upgrade.c
@@ -17,12 +17,15 @@
struct GsPluginData {
PkTask *task;
+ GMutex task_mutex;
};
void
gs_plugin_initialize (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
+
+ g_mutex_init (&priv->task_mutex);
priv->task = pk_task_new ();
pk_task_set_only_download (priv->task, TRUE);
pk_client_set_background (PK_CLIENT (priv->task), TRUE);
@@ -33,6 +36,7 @@ void
gs_plugin_destroy (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_mutex_clear (&priv->task_mutex);
g_object_unref (priv->task);
}
@@ -52,6 +56,7 @@ gs_plugin_app_upgrade_download (GsPlugin *plugin,
GsPluginData *priv = gs_plugin_get_data (plugin);
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
/* only process this app if was created by this plugin */
if (g_strcmp0 (gs_app_get_management_plugin (app), "packagekit") != 0)
@@ -61,6 +66,10 @@ gs_plugin_app_upgrade_download (GsPlugin *plugin,
if (gs_app_get_kind (app) != AS_APP_KIND_OS_UPGRADE)
return TRUE;
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
+
/* ask PK to download enough packages to upgrade the system */
gs_app_set_state (app, AS_APP_STATE_INSTALLING);
gs_packagekit_helper_add_app (helper, app);
diff --git a/plugins/packagekit/gs-plugin-packagekit-url-to-app.c
b/plugins/packagekit/gs-plugin-packagekit-url-to-app.c
index 3a4da3f3..e7acbc24 100644
--- a/plugins/packagekit/gs-plugin-packagekit-url-to-app.c
+++ b/plugins/packagekit/gs-plugin-packagekit-url-to-app.c
@@ -15,12 +15,15 @@
struct GsPluginData {
PkClient *client;
+ GMutex client_mutex;
};
void
gs_plugin_initialize (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
+
+ g_mutex_init (&priv->client_mutex);
priv->client = pk_client_new ();
pk_client_set_background (priv->client, FALSE);
@@ -31,6 +34,7 @@ void
gs_plugin_destroy (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_mutex_clear (&priv->client_mutex);
g_object_unref (priv->client);
}
@@ -53,6 +57,7 @@ gs_plugin_url_to_app (GsPlugin *plugin,
g_autoptr(GsOsRelease) os_release = NULL;
g_autoptr(GPtrArray) packages = NULL;
g_autoptr(GPtrArray) details = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
path = gs_utils_get_url_path (url);
@@ -79,9 +84,12 @@ gs_plugin_url_to_app (GsPlugin *plugin,
gs_app_set_kind (app, AS_APP_KIND_GENERIC);
gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE);
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->client_mutex);
+ g_assert (locker != NULL);
+
package_ids = g_new0 (gchar *, 2);
package_ids[0] = g_strdup (path);
-
results = pk_client_resolve (priv->client,
pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, PK_FILTER_ENUM_ARCH, -1),
package_ids,
diff --git a/plugins/packagekit/gs-plugin-packagekit.c b/plugins/packagekit/gs-plugin-packagekit.c
index 899525de..0dda7bbb 100644
--- a/plugins/packagekit/gs-plugin-packagekit.c
+++ b/plugins/packagekit/gs-plugin-packagekit.c
@@ -26,12 +26,15 @@
struct GsPluginData {
PkTask *task;
+ GMutex task_mutex;
};
void
gs_plugin_initialize (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_alloc_data (plugin, sizeof(GsPluginData));
+
+ g_mutex_init (&priv->task_mutex);
priv->task = pk_task_new ();
pk_client_set_background (PK_CLIENT (priv->task), FALSE);
pk_client_set_cache_age (PK_CLIENT (priv->task), G_MAXUINT);
@@ -41,6 +44,7 @@ void
gs_plugin_destroy (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
+ g_mutex_clear (&priv->task_mutex);
g_object_unref (priv->task);
}
@@ -60,6 +64,11 @@ gs_plugin_add_sources_related (GsPlugin *plugin,
gboolean ret = TRUE;
g_autoptr(GsAppList) installed = gs_app_list_new ();
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
filter = pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED,
PK_FILTER_ENUM_NEWEST,
@@ -121,6 +130,11 @@ gs_plugin_add_sources (GsPlugin *plugin,
g_autoptr(GHashTable) hash = NULL;
g_autoptr(PkResults) results = NULL;
g_autoptr(GPtrArray) array = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* ask PK for the repo details */
filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NOT_SOURCE,
@@ -173,6 +187,11 @@ gs_plugin_app_origin_repo_enable (GsPlugin *plugin,
GsPluginData *priv = gs_plugin_get_data (plugin);
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* do sync call */
gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING);
@@ -203,6 +222,11 @@ gs_plugin_repo_enable (GsPlugin *plugin,
GsPluginData *priv = gs_plugin_get_data (plugin);
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* do sync call */
gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING);
@@ -242,6 +266,7 @@ gs_plugin_app_install (GsPlugin *plugin,
g_auto(GStrv) package_ids = NULL;
g_autoptr(GPtrArray) array_package_ids = NULL;
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
/* only process this app if was created by this plugin */
if (g_strcmp0 (gs_app_get_management_plugin (app),
@@ -282,6 +307,10 @@ gs_plugin_app_install (GsPlugin *plugin,
* is probably some kind of hard-to-debug race in the daemon. */
g_usleep (G_USEC_PER_SEC * 3);
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
+
/* actually install the package */
gs_packagekit_helper_add_app (helper, app);
results = pk_task_install_packages_sync (priv->task,
@@ -350,6 +379,11 @@ gs_plugin_app_install (GsPlugin *plugin,
"no packages to install");
return FALSE;
}
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
+
gs_app_set_state (app, AS_APP_STATE_INSTALLING);
addons = gs_app_get_addons (app);
for (i = 0; i < gs_app_list_length (addons); i++) {
@@ -382,6 +416,11 @@ gs_plugin_app_install (GsPlugin *plugin,
}
local_filename = g_file_get_path (gs_app_get_local_file (app));
package_ids = g_strsplit (local_filename, "\t", -1);
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
+
gs_app_set_state (app, AS_APP_STATE_INSTALLING);
gs_packagekit_helper_add_app (helper, app);
results = pk_task_install_files_sync (priv->task,
@@ -426,6 +465,11 @@ gs_plugin_repo_disable (GsPlugin *plugin,
GsPluginData *priv = gs_plugin_get_data (plugin);
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* do sync call */
gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING);
@@ -463,6 +507,7 @@ gs_plugin_app_remove (GsPlugin *plugin,
guint cnt = 0;
g_autoptr(PkResults) results = NULL;
g_auto(GStrv) package_ids = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
/* only process this app if was created by this plugin */
if (g_strcmp0 (gs_app_get_management_plugin (app),
@@ -497,6 +542,10 @@ gs_plugin_app_remove (GsPlugin *plugin,
return FALSE;
}
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
+
/* do the action */
gs_app_set_state (app, AS_APP_STATE_REMOVING);
gs_packagekit_helper_add_app (helper, app);
@@ -556,6 +605,11 @@ gs_plugin_add_updates (GsPlugin *plugin,
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
g_autoptr(GPtrArray) array = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* do sync call */
gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
@@ -589,6 +643,11 @@ gs_plugin_add_search_files (GsPlugin *plugin,
PkBitfield filter;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* do sync call */
gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
@@ -619,6 +678,11 @@ gs_plugin_add_search_what_provides (GsPlugin *plugin,
PkBitfield filter;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
g_autoptr(PkResults) results = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+
+ /* packagekit-glib is not threadsafe */
+ locker = g_mutex_locker_new (&priv->task_mutex);
+ g_assert (locker != NULL);
/* do sync call */
gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]