From e7a7306063565f14052ed8b1d34ca19512a4fd66 Mon Sep 17 00:00:00 2001
From: Ryan Dwyer <ryandwyer1@gmail.com>
Date: Sat, 11 Aug 2018 20:04:44 +1000
Subject: Don't progress transaction queue if any are partially complete

This fixes an issue where views might commit to a transaction ahead of
the first one, and applying the first transaction causes us to save a
buffer of the wrong size.
---
 sway/desktop/transaction.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

(limited to 'sway/desktop')

diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index 4e6af86a..edbe34e5 100644
--- a/sway/desktop/transaction.c
+++ b/sway/desktop/transaction.c
@@ -213,6 +213,18 @@ static void transaction_apply(struct sway_transaction *transaction) {
 }
 
 static void transaction_progress_queue() {
+	// Check if any transactions in the queue are in a partially ready state.
+	// If so, we shouldn't progress any transactions, even ones which are fully
+	// ready at the front of the queue, because the views in the ready
+	// transactions might have committed past it to a transaction which isn't
+	// yet ready.
+	for (int i = 0; i < server.transactions->length; ++i) {
+		struct sway_transaction *transaction = server.transactions->items[i];
+		if (transaction->num_waiting != 0 &&
+				transaction->num_waiting != transaction->num_configures) {
+			return;
+		}
+	}
 	while (server.transactions->length) {
 		struct sway_transaction *transaction = server.transactions->items[0];
 		if (transaction->num_waiting) {
-- 
cgit v1.2.3