- When returning results from a cache we should always return finished in

an idle loop so we can block and wait for a response
- This fixes the bug where if you have two GetUpdates in the queue the
    second would hang waiting for the first, even though it had already
    finished.
This commit is contained in:
Richard Hughes 2008-09-25 14:00:05 +00:00
parent c26f0f21ad
commit d8ef186343
2 changed files with 117 additions and 1 deletions

View File

@ -8,7 +8,7 @@
Summary: System daemon that is a DBUS abstraction layer for package management
Name: PackageKit
Version: 0.3.4
Release: 4%{?dist}
Release: 5%{?dist}
License: GPLv2+
Group: System Environment/Libraries
URL: http://packagekit.freedesktop.org
@ -24,6 +24,9 @@ Patch1: pk-dont-schedule-the-whole-queue.patch
# upstream: 16bea44b16fd8b1ac36cc5939caf1017eece12eb
Patch2: pk-fix-yum-error-name.patch
# upstream: 58955c21674e37d43d7353d30ab1da3163699e94
Patch3: pk-dont-hang-when-cache-deep.patch
Requires: dbus >= %{dbus_version}
Requires: dbus-glib >= %{dbus_glib_version}
Requires: PackageKit-libs = %{version}-%{release}
@ -151,6 +154,7 @@ using PackageKit.
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%build
%configure --enable-yum --enable-smart --with-default-backend=yum --disable-local
@ -281,6 +285,12 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
%{_includedir}/*
%changelog
* Thu Sep 25 2008 Richard Hughes <rhughes@redhat.com> - 0.3.4-5
- When returning results from a cache we should always return finished in an
idle loop so we can block and wait for a response
- This fixes the bug where if you have two GetUpdates in the queue the second
would hang waiting for the first, even though it had already finished.
* Tue Sep 23 2008 Richard Hughes <rhughes@redhat.com> - 0.3.4-4
- Fix the error dialog when no mirrors are found

View File

@ -0,0 +1,106 @@
commit 58955c21674e37d43d7353d30ab1da3163699e94
Author: Richard Hughes <richard@hughsie.com>
Date: Thu Sep 25 14:32:25 2008 +0100
bugfix: finish a cached transaction in an idle loop
When returning results from a cache we should always return finished in an idle
loop so we can block and wait for a response without having to know if we need
to wait for ::Finished()
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index db68d4d..73f86dc 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1093,6 +1093,19 @@ pk_transaction_commit (PkTransaction *transaction)
}
/**
+ * pk_transaction_finished_idle_cb:
+ **/
+static gboolean
+pk_transaction_finished_idle_cb (PkTransaction *transaction)
+{
+ const gchar *exit_text;
+ exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
+ egg_debug ("emitting finished '%s'", exit_text);
+ g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
+ return FALSE;
+}
+
+/**
* pk_transaction_search_check:
**/
static gboolean
@@ -1236,7 +1249,6 @@ pk_transaction_accept_eula (PkTransaction *transaction, const gchar *eula_id, DB
{
gboolean ret;
GError *error;
- const gchar *exit_text;
gchar *sender;
g_return_if_fail (PK_IS_TRANSACTION (transaction));
@@ -1275,10 +1287,7 @@ pk_transaction_accept_eula (PkTransaction *transaction, const gchar *eula_id, DB
return;
}
- exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
- egg_debug ("emitting finished transaction '%s', %i", exit_text, 0);
- g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
-
+ g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
dbus_g_method_return (context);
}
@@ -1746,18 +1755,13 @@ pk_transaction_get_packages (PkTransaction *transaction, const gchar *filter, DB
gboolean
pk_transaction_get_old_transactions (PkTransaction *transaction, guint number, GError **error)
{
- const gchar *exit_text;
-
g_return_val_if_fail (PK_IS_TRANSACTION (transaction), FALSE);
g_return_val_if_fail (transaction->priv->tid != NULL, FALSE);
egg_debug ("GetOldTransactions method called");
pk_transaction_db_get_list (transaction->priv->transaction_db, number);
-
- exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
- egg_debug ("emitting finished transaction '%s', %i", exit_text, 0);
- g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
+ g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
return TRUE;
}
@@ -2071,10 +2075,7 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
/* if we have nothing to do, i.e. everything was in the cache */
if (array->len == 0) {
- const gchar *exit_text;
- exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
- egg_debug ("emitting finished '%s' as no more to process", exit_text);
- g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
+ g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
goto out;
}
@@ -2152,7 +2153,6 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
if (updates_cache != NULL) {
const PkPackageObj *obj;
const gchar *info_text;
- const gchar *exit_text;
guint i;
guint length;
@@ -2169,10 +2169,7 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
g_free (package_id);
}
- /* we are done */
- exit_text = pk_exit_enum_to_text (PK_EXIT_ENUM_SUCCESS);
- egg_debug ("emitting finished '%s'", exit_text);
- g_signal_emit (transaction, signals [PK_TRANSACTION_FINISHED], 0, exit_text, 0);
+ g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
dbus_g_method_return (context);
return;