summaryrefslogtreecommitdiff
path: root/community/gnome-packagekit/packagekit-0.8.patch
blob: e1b1b2f9700aec910bc23b321b2e1dd7f58aeb25 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
From 4077ba3ea30354ef070d640a5af4b6a913e97f4b Mon Sep 17 00:00:00 2001
From: Richard Hughes <richard@hughsie.com>
Date: Tue, 18 Jun 2013 12:56:05 +0000
Subject: 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
---
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);
--
cgit v0.9.2