[gnome-software: 7/9] packagekit: Use a new PkTask for each remaining operation
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software: 7/9] packagekit: Use a new PkTask for each remaining operation
- Date: Wed, 1 Jun 2022 13:37:38 +0000 (UTC)
commit 1928b17824eb550978234cb1e5ab72e3f9e47bfa
Author: Philip Withnall <pwithnall endlessos org>
Date: Tue May 31 17:54:44 2022 +0100
packagekit: Use a new PkTask for each remaining operation
See the previous commits.
Signed-off-by: Philip Withnall <pwithnall endlessos org>
Helps: #1762
plugins/packagekit/gs-plugin-packagekit.c | 147 ++++++++++++++++--------------
1 file changed, 77 insertions(+), 70 deletions(-)
---
diff --git a/plugins/packagekit/gs-plugin-packagekit.c b/plugins/packagekit/gs-plugin-packagekit.c
index 785bbbd45..3ee471c84 100644
--- a/plugins/packagekit/gs-plugin-packagekit.c
+++ b/plugins/packagekit/gs-plugin-packagekit.c
@@ -53,9 +53,6 @@
struct _GsPluginPackagekit {
GsPlugin parent;
- PkTask *task;
- GMutex task_mutex;
-
PkControl *control_refine;
PkControl *control_proxy;
@@ -104,11 +101,6 @@ gs_plugin_packagekit_init (GsPluginPackagekit *self)
{
GsPlugin *plugin = GS_PLUGIN (self);
- /* core */
- g_mutex_init (&self->task_mutex);
- self->task = gs_packagekit_task_new (plugin);
- pk_client_set_interactive (PK_CLIENT (self->task), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
-
/* refine */
self->control_refine = pk_control_new ();
g_signal_connect (self->control_refine, "updates-changed",
@@ -166,9 +158,6 @@ gs_plugin_packagekit_dispose (GObject *object)
g_cancellable_cancel (self->proxy_settings_cancellable);
g_clear_object (&self->proxy_settings_cancellable);
- /* core */
- g_clear_object (&self->task);
-
/* refine */
g_clear_object (&self->control_refine);
@@ -193,7 +182,6 @@ gs_plugin_packagekit_finalize (GObject *object)
{
GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (object);
- g_mutex_clear (&self->task_mutex);
g_mutex_clear (&self->prepared_updates_mutex);
G_OBJECT_CLASS (gs_plugin_packagekit_parent_class)->finalize (object);
@@ -261,12 +249,12 @@ gs_plugin_add_sources_related (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
- GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
guint i;
GsApp *app;
GsApp *app_tmp;
PkBitfield filter;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_related = NULL;
const gchar *id;
gboolean ret = TRUE;
g_autoptr(GsAppList) installed = gs_app_list_new ();
@@ -277,14 +265,17 @@ gs_plugin_add_sources_related (GsPlugin *plugin,
PK_FILTER_ENUM_ARCH,
PK_FILTER_ENUM_NOT_COLLECTIONS,
-1);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_GET_SOURCES,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_client_get_packages (PK_CLIENT(self->task),
+
+ task_related = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_related), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_related), GS_PLUGIN_ACTION_GET_SOURCES,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_packages (PK_CLIENT (task_related),
filter,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
+
if (!gs_plugin_packagekit_results_valid (results, error)) {
g_prefix_error (error, "failed to get sources related: ");
return FALSE;
@@ -326,10 +317,10 @@ gs_plugin_add_sources (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
- GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
PkBitfield filter;
PkRepoDetail *rd;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_sources = NULL;
const gchar *id;
guint i;
g_autoptr(GHashTable) hash = NULL;
@@ -340,14 +331,17 @@ gs_plugin_add_sources (GsPlugin *plugin,
filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NOT_SOURCE,
PK_FILTER_ENUM_NOT_DEVELOPMENT,
-1);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_GET_SOURCES,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_client_get_repo_list (PK_CLIENT(self->task),
+
+ task_sources = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_sources), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_sources), GS_PLUGIN_ACTION_GET_SOURCES,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_repo_list (PK_CLIENT (task_sources),
filter,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
+
if (!gs_plugin_packagekit_results_valid (results, error))
return FALSE;
hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
@@ -386,6 +380,7 @@ gs_plugin_add_sources (GsPlugin *plugin,
static gboolean
gs_plugin_app_origin_repo_enable (GsPluginPackagekit *self,
+ PkTask *task_enable_repo,
GsApp *app,
GCancellable *cancellable,
GError **error)
@@ -408,15 +403,12 @@ gs_plugin_app_origin_repo_enable (GsPluginPackagekit *self,
/* do sync call */
gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_INSTALL,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_client_repo_enable (PK_CLIENT (self->task),
+ results = pk_client_repo_enable (PK_CLIENT (task_enable_repo),
repo_id,
TRUE,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
/* pk_client_repo_enable() returns an error if the repo is already enabled. */
if (results != NULL &&
@@ -450,6 +442,7 @@ gs_plugin_app_install (GsPlugin *plugin,
g_autoptr(GsAppList) addons = NULL;
GPtrArray *source_ids;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_install = NULL;
const gchar *package_id;
guint i;
g_autofree gchar *local_filename = NULL;
@@ -470,6 +463,11 @@ gs_plugin_app_install (GsPlugin *plugin,
return TRUE;
}
+ /* Set up a #PkTask to handle the D-Bus calls to packagekitd. */
+ task_install = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_install), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_install), GS_PLUGIN_ACTION_INSTALL,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
if (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE) {
/* get everything up front we need */
source_ids = gs_app_get_source_ids (app);
@@ -484,7 +482,7 @@ gs_plugin_app_install (GsPlugin *plugin,
package_ids[0] = g_strdup (g_ptr_array_index (source_ids, 0));
/* enable the repo where the unavailable app is coming from */
- if (!gs_plugin_app_origin_repo_enable (self, app, cancellable, error))
+ if (!gs_plugin_app_origin_repo_enable (self, task_install, app, cancellable, error))
return FALSE;
gs_app_set_state (app, GS_APP_STATE_INSTALLING);
@@ -496,14 +494,13 @@ gs_plugin_app_install (GsPlugin *plugin,
/* actually install the package */
gs_packagekit_helper_add_app (helper, app);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_INSTALL,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_task_install_packages_sync (self->task,
+
+ results = pk_task_install_packages_sync (task_install,
package_ids,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
+
if (!gs_plugin_packagekit_results_valid (results, error)) {
gs_app_set_state_recover (app);
return FALSE;
@@ -565,14 +562,13 @@ gs_plugin_app_install (GsPlugin *plugin,
gs_app_set_state (addon, GS_APP_STATE_INSTALLING);
}
gs_packagekit_helper_add_app (helper, app);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_INSTALL,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_task_install_packages_sync (self->task,
+
+ results = pk_task_install_packages_sync (task_install,
(gchar **) array_package_ids->pdata,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
+
if (!gs_plugin_packagekit_results_valid (results, error)) {
for (i = 0; addons != NULL && i < gs_app_list_length (addons); i++) {
GsApp *addon = gs_app_list_index (addons, i);
@@ -607,14 +603,13 @@ gs_plugin_app_install (GsPlugin *plugin,
gs_app_set_state (app, GS_APP_STATE_INSTALLING);
gs_packagekit_helper_add_app (helper, app);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_INSTALL,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_task_install_files_sync (self->task,
+
+ results = pk_task_install_files_sync (task_install,
package_ids,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
+
if (!gs_plugin_packagekit_results_valid (results, error)) {
gs_app_set_state_recover (app);
return FALSE;
@@ -648,11 +643,11 @@ gs_plugin_app_remove (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
- GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
const gchar *package_id;
GPtrArray *source_ids;
g_autoptr(GsAppList) addons = NULL;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_remove = NULL;
guint i;
guint cnt = 0;
g_autoptr(PkResults) results = NULL;
@@ -692,15 +687,18 @@ gs_plugin_app_remove (GsPlugin *plugin,
/* do the action */
gs_app_set_state (app, GS_APP_STATE_REMOVING);
gs_packagekit_helper_add_app (helper, app);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_REMOVE,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_task_remove_packages_sync (self->task,
+
+ task_remove = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_remove), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_remove), GS_PLUGIN_ACTION_REMOVE,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_task_remove_packages_sync (task_remove,
package_ids,
TRUE, GS_PACKAGEKIT_AUTOREMOVE,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
+
if (!gs_plugin_packagekit_results_valid (results, error)) {
gs_app_set_state_recover (app);
return FALSE;
@@ -757,8 +755,8 @@ gs_plugin_packagekit_add_updates (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
- GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_updates = NULL;
g_autoptr(PkResults) results = NULL;
g_autoptr(GPtrArray) array = NULL;
g_autoptr(GsApp) first_app = NULL;
@@ -766,14 +764,17 @@ gs_plugin_packagekit_add_updates (GsPlugin *plugin,
/* do sync call */
gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_GET_UPDATES,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_client_get_updates (PK_CLIENT (self->task),
+
+ task_updates = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_updates), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_updates), GS_PLUGIN_ACTION_GET_UPDATES,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_updates (PK_CLIENT (task_updates),
pk_bitfield_value (PK_FILTER_ENUM_NONE),
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
+
if (!gs_plugin_packagekit_results_valid (results, error))
return FALSE;
@@ -829,9 +830,9 @@ gs_plugin_packagekit_list_apps_async (GsPlugin *plugin,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
PkBitfield filter;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_list_apps = NULL;
g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE);
g_autoptr(GTask) task = NULL;
@@ -843,14 +844,15 @@ gs_plugin_packagekit_list_apps_async (GsPlugin *plugin,
gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
gs_packagekit_helper_set_progress_app (helper, app_dl);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_UNKNOWN, interactive);
+ task_list_apps = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_list_apps), interactive);
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_list_apps), GS_PLUGIN_ACTION_UNKNOWN, interactive);
if (gs_app_query_get_provides_files (query) != NULL) {
filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST,
PK_FILTER_ENUM_ARCH,
-1);
- pk_client_search_files_async (PK_CLIENT (self->task),
+ pk_client_search_files_async (PK_CLIENT (task_list_apps),
filter,
(gchar **) gs_app_query_get_provides_files (query),
cancellable,
@@ -860,8 +862,6 @@ gs_plugin_packagekit_list_apps_async (GsPlugin *plugin,
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"Unsupported query");
}
-
- g_mutex_unlock (&self->task_mutex);
}
static void
@@ -901,9 +901,9 @@ gs_plugin_add_search_what_provides (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
- GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
PkBitfield filter;
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_search = NULL;
g_autoptr(PkResults) results = NULL;
/* do sync call */
@@ -911,15 +911,18 @@ gs_plugin_add_search_what_provides (GsPlugin *plugin,
filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST,
PK_FILTER_ENUM_ARCH,
-1);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_SEARCH_PROVIDES,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_client_what_provides (PK_CLIENT (self->task),
+
+ task_search = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_search), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_search), GS_PLUGIN_ACTION_SEARCH_PROVIDES,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_what_provides (PK_CLIENT (task_search),
filter,
search,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
+
if (!gs_plugin_packagekit_results_valid (results, error))
return FALSE;
@@ -3429,8 +3432,8 @@ gs_plugin_enable_repo (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
- GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_enable_repo = NULL;
g_autoptr(PkResults) results = NULL;
g_autoptr(PkError) error_code = NULL;
g_autoptr(GMainContext) context = NULL;
@@ -3447,15 +3450,17 @@ gs_plugin_enable_repo (GsPlugin *plugin,
gs_plugin_status_update (plugin, repo, GS_PLUGIN_STATUS_WAITING);
gs_app_set_state (repo, GS_APP_STATE_INSTALLING);
gs_packagekit_helper_add_app (helper, repo);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_ENABLE_REPO,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_client_repo_enable (PK_CLIENT (self->task),
+
+ task_enable_repo = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_enable_repo), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_enable_repo), GS_PLUGIN_ACTION_ENABLE_REPO,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_repo_enable (PK_CLIENT (task_enable_repo),
gs_app_get_id (repo),
TRUE,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
/* pk_client_repo_enable() returns an error if the repo is already enabled. */
if (results != NULL &&
@@ -3502,8 +3507,8 @@ gs_plugin_disable_repo (GsPlugin *plugin,
GCancellable *cancellable,
GError **error)
{
- GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_disable_repo = NULL;
g_autoptr(PkResults) results = NULL;
g_autoptr(PkError) error_code = NULL;
@@ -3518,15 +3523,17 @@ gs_plugin_disable_repo (GsPlugin *plugin,
gs_plugin_status_update (plugin, repo, GS_PLUGIN_STATUS_WAITING);
gs_app_set_state (repo, GS_APP_STATE_REMOVING);
gs_packagekit_helper_add_app (helper, repo);
- g_mutex_lock (&self->task_mutex);
- gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (self->task), GS_PLUGIN_ACTION_DISABLE_REPO,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
- results = pk_client_repo_enable (PK_CLIENT (self->task),
+
+ task_disable_repo = gs_packagekit_task_new (plugin);
+ pk_client_set_interactive (PK_CLIENT (task_disable_repo), gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE));
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_disable_repo), GS_PLUGIN_ACTION_DISABLE_REPO,
gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_repo_enable (PK_CLIENT (task_disable_repo),
gs_app_get_id (repo),
FALSE,
cancellable,
gs_packagekit_helper_cb, helper,
error);
- g_mutex_unlock (&self->task_mutex);
/* pk_client_repo_enable() returns an error if the repo is already enabled. */
if (results != NULL &&
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]