From 917d2b38699d8e8c24d32bd88fade4c84b9aabc1 Mon Sep 17 00:00:00 2001
From: guinux <nuxgui@gmail.com>
Date: Sat, 15 Jun 2019 16:07:40 +0200
Subject: [PATCH] fix lock troubles

---
 src/alpm_utils.vala     |  4 ++++
 src/cli.vala            |  8 +-------
 src/manager_window.vala | 13 ++++---------
 src/system_daemon.vala  | 24 +++++++++++++++---------
 4 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/src/alpm_utils.vala b/src/alpm_utils.vala
index 17ef45fb..1695f9a5 100644
--- a/src/alpm_utils.vala
+++ b/src/alpm_utils.vala
@@ -726,6 +726,10 @@ namespace Pamac {
 					success = false;
 				}
 			}
+			if (cancellable.is_cancelled ()) {
+				trans_release ();
+				return false;
+			}
 			return success;
 		}
 
diff --git a/src/cli.vala b/src/cli.vala
index 72493a03..a2bfb69e 100644
--- a/src/cli.vala
+++ b/src/cli.vala
@@ -585,12 +585,6 @@ namespace Pamac {
 			transaction = new TransactionCli (database);
 			transaction.finished.connect (on_transaction_finished);
 			transaction.sysupgrade_finished.connect (on_transaction_finished);
-			transaction.start_preparing.connect (() => {
-				trans_cancellable = true;
-			});
-			transaction.stop_preparing.connect (() => {
-				trans_cancellable = false;
-			});
 			transaction.start_downloading.connect (() => {
 				trans_cancellable = true;
 			});
@@ -623,7 +617,7 @@ namespace Pamac {
 			} else {
 				stdout.printf ("\n");
 			}
-			return false;
+			return true;
 		}
 
 		int get_term_width () {
diff --git a/src/manager_window.vala b/src/manager_window.vala
index 2093dcad..8b547b46 100644
--- a/src/manager_window.vala
+++ b/src/manager_window.vala
@@ -2646,12 +2646,8 @@ namespace Pamac {
 
 		[GtkCallback]
 		void on_preferences_button_clicked () {
-			if (transaction.get_lock ()) {
-				this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
-				run_preferences_dialog ();
-			} else {
-				transaction.display_error (dgettext (null, "Waiting for another package manager to quit"), {});
-			}
+			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
+			run_preferences_dialog ();
 		}
 
 		public void run_preferences_dialog () {
@@ -2670,7 +2666,6 @@ namespace Pamac {
 		}
 
 		void on_run_preferences_dialog_finished () {
-			transaction.unlock ();
 			if (browse_stack.visible_child_name == "updates") {
 				database.get_updates.begin (on_get_updates_finished);
 				origin_stack.visible_child_name = "checking";
@@ -2752,7 +2747,7 @@ namespace Pamac {
 			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
 			sysupgrade_running = true;
 			apply_button.sensitive = false;
-			cancel_button.sensitive = true;
+			cancel_button.sensitive = false;
 			string[] temp_ign_pkgs = {};
 			foreach (unowned string name in temporary_ignorepkgs) {
 				temp_ign_pkgs += name;
@@ -2854,7 +2849,7 @@ namespace Pamac {
 
 		void on_start_preparing () {
 			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
-			cancel_button.sensitive = true;
+			cancel_button.sensitive = false;
 		}
 
 		void on_stop_preparing () {
diff --git a/src/system_daemon.vala b/src/system_daemon.vala
index 44c55fc6..664deec4 100644
--- a/src/system_daemon.vala
+++ b/src/system_daemon.vala
@@ -111,9 +111,13 @@ namespace Pamac {
 				downloading_updates_finished ();
 			});
 			alpm_utils.trans_prepare_finished.connect ((success) => {
+				if (!success) {
+					unlock_priv ();
+				}
 				trans_prepare_finished (success);
 			});
 			alpm_utils.trans_commit_finished.connect ((success) => {
+				unlock_priv ();
 				database_modified ();
 				trans_commit_finished (success);
 			});
@@ -242,17 +246,13 @@ namespace Pamac {
 
 		public bool unlock (GLib.BusName sender) throws Error {
 			if (lock_id == sender) {
-				lock_id = new BusName ("");
-				authorized = false;
+				unlock_priv ();
 				return true;
 			}
 			return false;
 		}
 
 		private async bool check_authorization (GLib.BusName sender) {
-			if (lock_id != sender) {
-				return false;
-			}
 			if (authorized) {
 				return true;
 			}
@@ -387,10 +387,6 @@ namespace Pamac {
 		}
 
 		public void start_refresh (bool force, GLib.BusName sender) throws Error {
-			if (lock_id != sender) {
-				refresh_finished (false);
-				return;
-			}
 			alpm_utils.force_refresh = force;
 			if (alpm_utils.downloading_updates) {
 				alpm_utils.cancellable.cancel ();
@@ -520,6 +516,9 @@ namespace Pamac {
 		}
 
 		public void start_trans_commit (GLib.BusName sender) throws Error {
+			if (lock_id != sender) {
+				return;
+			}
 			check_authorization.begin (sender, (obj, res) => {
 				bool authorized = check_authorization.end (res);
 				if (authorized) {
@@ -540,6 +539,7 @@ namespace Pamac {
 				return;
 			}
 			alpm_utils.trans_release ();
+			unlock_priv ();
 		}
 
 		public void trans_cancel (GLib.BusName sender) throws Error {
@@ -547,6 +547,12 @@ namespace Pamac {
 				return;
 			}
 			alpm_utils.trans_cancel ();
+			unlock_priv ();
+		}
+
+		private void unlock_priv () {
+			lock_id = new BusName ("");
+			authorized = false;
 		}
 
 		[DBus (no_reply = true)]
-- 
GitLab