Blob Blame History Raw
commit 09c9cde8c0cfec3a5f4320ec10bf2e1b0f9b460f
Author: Richard Hughes <richard@hughsie.com>
Date:   Thu Jan 23 13:46:49 2014 +0000

    hawkey: Fix installing i386 packages on a 64bit computer

diff --git a/backends/hawkey/pk-backend-hawkey.c b/backends/hawkey/pk-backend-hawkey.c
index f2ee746..b069396 100644
--- a/backends/hawkey/pk-backend-hawkey.c
+++ b/backends/hawkey/pk-backend-hawkey.c
@@ -3196,10 +3196,12 @@ out:
 }
 
 /**
- * hif_is_installed_package_name:
+ * hif_is_installed_package_name_arch:
  */
 static gboolean
-hif_is_installed_package_name (HySack sack, const gchar *name)
+hif_is_installed_package_name_arch (HySack sack,
+				    const gchar *name,
+				    const gchar *arch)
 {
 	gboolean ret;
 	HyPackageList pkglist = NULL;
@@ -3208,6 +3210,7 @@ hif_is_installed_package_name (HySack sack, const gchar *name)
 	/* run query */
 	query = hy_query_create (sack);
 	hy_query_filter (query, HY_PKG_NAME, HY_EQ, name);
+	hy_query_filter (query, HY_PKG_ARCH, HY_EQ, arch);
 	hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME);
 	pkglist = hy_query_run (query);
 
@@ -3228,7 +3231,9 @@ hif_is_installed_package_id (HySack sack, const gchar *package_id)
 	gboolean ret;
 	gchar **split;
 	split = pk_package_id_split (package_id);
-	ret = hif_is_installed_package_name (sack, split[PK_PACKAGE_ID_NAME]);
+	ret = hif_is_installed_package_name_arch (sack,
+						  split[PK_PACKAGE_ID_NAME],
+						  split[PK_PACKAGE_ID_ARCH]);
 	g_strfreev (split);
 	return ret;
 }
commit 5776000231f81f7d0d764038a9957439c35a7a5d
Author: Richard Hughes <richard@hughsie.com>
Date:   Thu Jan 23 14:25:55 2014 +0000

    hawkey: Release locks early if the state fails

diff --git a/backends/hawkey/hif-lock.c b/backends/hawkey/hif-lock.c
index 97066f4..a644330 100644
--- a/backends/hawkey/hif-lock.c
+++ b/backends/hawkey/hif-lock.c
@@ -91,6 +91,19 @@ hif_lock_type_to_string (HifLockType lock_type)
 }
 
 /**
+ * hif_lock_mode_to_string:
+ **/
+static const gchar *
+hif_lock_mode_to_string (HifLockMode lock_mode)
+{
+	if (lock_mode == HIF_LOCK_MODE_THREAD)
+		return "thread";
+	if (lock_mode == HIF_LOCK_MODE_PROCESS)
+		return "process";
+	return "unknown";
+}
+
+/**
  * hif_lock_get_item_by_type_mode:
  **/
 static HifLockItem *
@@ -337,7 +350,9 @@ hif_lock_take (HifLock *lock,
 				g_set_error (error,
 					     HIF_ERROR,
 					     PK_ERROR_ENUM_CANNOT_GET_LOCK,
-					     "already locked by %s",
+					     "%s[%s] already locked by %s",
+					     hif_lock_type_to_string (type),
+					     hif_lock_mode_to_string (mode),
 					     cmdline);
 				goto out;
 			}
@@ -520,7 +535,7 @@ hif_lock_finalize (GObject *object)
 		if (item->refcount > 0) {
 			g_warning ("held lock %s at shutdown",
 				   hif_lock_type_to_string (item->type));
-			hif_lock_release (lock, item->type, NULL);
+			hif_lock_release (lock, item->id, NULL);
 		}
 	}
 
diff --git a/backends/hawkey/hif-source.c b/backends/hawkey/hif-source.c
index b79f525..fffcc31 100644
--- a/backends/hawkey/hif-source.c
+++ b/backends/hawkey/hif-source.c
@@ -695,6 +695,7 @@ hif_source_update (HifSource *src,
 	if (!ret)
 		goto out;
 out:
+	hif_state_release_locks (state);
 	lr_handle_setopt (src->repo_handle, NULL, LRO_PROGRESSCB, NULL);
 	lr_handle_setopt (src->repo_handle, NULL, LRO_PROGRESSDATA, 0xdeadbeef);
 	return ret;
diff --git a/backends/hawkey/hif-state.c b/backends/hawkey/hif-state.c
index 6cd706f..fc6753c 100644
--- a/backends/hawkey/hif-state.c
+++ b/backends/hawkey/hif-state.c
@@ -273,13 +273,17 @@ hif_state_set_speed (HifState *state, guint64 speed)
 /**
  * hif_state_release_locks:
  **/
-static gboolean
+gboolean
 hif_state_release_locks (HifState *state)
 {
 	gboolean ret = TRUE;
 	guint i;
 	guint lock_id;
 
+	/* release children first */
+	if (state->priv->child != NULL)
+		hif_state_release_locks (state->priv->child);
+
 	/* release each one */
 	for (i = 0; i < state->priv->lock_ids->len; i++) {
 		lock_id = GPOINTER_TO_UINT (g_ptr_array_index (state->priv->lock_ids, i));
diff --git a/backends/hawkey/hif-state.h b/backends/hawkey/hif-state.h
index ffd42e9..b7b26f4 100644
--- a/backends/hawkey/hif-state.h
+++ b/backends/hawkey/hif-state.h
@@ -131,6 +131,7 @@ gboolean	 hif_state_take_lock			(HifState		*state,
 							 HifLockType		 lock_type,
 							 HifLockMode		 lock_mode,
 							 GError			**error);
+gboolean	 hif_state_release_locks		(HifState		*state);
 
 G_END_DECLS
 
diff --git a/backends/hawkey/pk-backend-hawkey.c b/backends/hawkey/pk-backend-hawkey.c
index b069396..40831b9 100644
--- a/backends/hawkey/pk-backend-hawkey.c
+++ b/backends/hawkey/pk-backend-hawkey.c
@@ -521,8 +521,10 @@ pk_backend_stop_job (PkBackend *backend, PkBackendJob *job)
 	PkBackendHifJobData *job_data = pk_backend_job_get_user_data (job);
 
 	g_object_unref (job_data->cancellable);
-	if (job_data->state != NULL)
+	if (job_data->state != NULL) {
+		hif_state_release_locks (job_data->state);
 		g_object_unref (job_data->state);
+	}
 	if (job_data->sources != NULL)
 		g_ptr_array_unref (job_data->sources);
 	g_ptr_array_unref (job_data->packages_to_download);
@@ -2954,6 +2956,7 @@ pk_backend_transaction_commit (PkBackendJob *job, HifState *state, GError **erro
 	if (!ret)
 		goto out;
 out:
+	hif_state_release_locks (state);
 	g_free (verbosity_string);
 	if (commit != NULL) {
 		g_timer_destroy (commit->timer);