[gnome-packagekit] Ignore package progress updates when the transaction is being simulated



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]