[gnome-packagekit] Ignore package progress updates when the transaction is being simulated
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-packagekit] Ignore package progress updates when the transaction is being simulated
- Date: Wed, 19 Jun 2013 07:34:31 +0000 (UTC)
commit 4077ba3ea30354ef070d640a5af4b6a913e97f4b
Author: Richard Hughes <richard hughsie com>
Date: Tue Jun 18 13:56:05 2013 +0100
Ignore package progress updates when the transaction is being simulated
PackageKit backends do not have to issue INFO_FINISHED when simulating, and most
don't bother. As we didn't special-case simulation, we set up the activity
spinner on the Package(INFO_UPDATING) event and do not cancel the signal.
This leaves every row in the update viewer with a spinning cursor, which due to
the way the code was structured lead to an O(n*n) exposion of updates to the
cell renderers for each update. For a dozen or so updates it was not noticable,
and nobody noticed the slight increase of CPU usage.
Now that TeX Live has officially jumped the shark and has many hundreds of
sub-packages, it's quite plausible to have *thousands* of small packages to
update. This means that the O(n*n) bug stops being a minor increase in CPU and
starts to use the CPU at 100% for many hours before completing.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=969852
src/gpk-update-viewer.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
---
diff --git a/src/gpk-update-viewer.c b/src/gpk-update-viewer.c
index 53be9cf..a2182a1 100644
--- a/src/gpk-update-viewer.c
+++ b/src/gpk-update-viewer.c
@@ -841,6 +841,7 @@ gpk_update_viewer_progress_cb (PkProgress *progress,
gchar *text;
gint percentage;
GtkWidget *widget;
+ guint64 transaction_flags;
PkInfoEnum info;
PkRoleEnum role;
PkStatusEnum status;
@@ -853,6 +854,7 @@ gpk_update_viewer_progress_cb (PkProgress *progress,
"percentage", &percentage,
"package", &package,
"allow-cancel", &allow_cancel,
+ "transaction-flags", &transaction_flags,
NULL);
if (type == PK_PROGRESS_TYPE_PACKAGE) {
@@ -864,6 +866,10 @@ gpk_update_viewer_progress_cb (PkProgress *progress,
GtkTreePath *path;
gboolean scroll;
+ /* ignore simulation phase */
+ if (pk_bitfield_contain (transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
+ goto out;
+
/* add the results, not the progress */
if (role == PK_ROLE_ENUM_GET_UPDATES)
goto out;
@@ -1040,6 +1046,10 @@ gpk_update_viewer_progress_cb (PkProgress *progress,
guint size_display;
PkItemProgress *item_progress;
+ /* ignore simulation phase */
+ if (pk_bitfield_contain (transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE))
+ goto out;
+
g_object_get (progress,
"item-progress", &item_progress,
NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]