From 68267a4cfedf35065f9619751ecd89de6c47f5db Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Tue, 8 Jun 2021 15:18:45 +0000 Subject: [PATCH] river: don't extend timeout on transaction preemption This avoids locking up the compositor if a client is unresponsive and the user continuously initiates new transactions through their actions. --- river/Root.zig | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/river/Root.zig b/river/Root.zig index 2431bda..5f600e2 100644 --- a/river/Root.zig +++ b/river/Root.zig @@ -282,6 +282,7 @@ pub fn startTransaction(self: *Self) void { // If a new transaction is started while another is in progress, we need // to reset the pending count to 0 and clear serials from the views + const preempting = self.pending_configures > 0; self.pending_configures = 0; // Iterate over all views of all outputs @@ -317,16 +318,18 @@ pub fn startTransaction(self: *Self) void { } if (self.pending_configures > 0) { - std.log.scoped(.transaction).debug( - "started transaction with {} pending configure(s)", - .{self.pending_configures}, - ); + std.log.scoped(.transaction).debug("started transaction with {} pending configure(s)", .{ + self.pending_configures, + }); - // Set timeout to 200ms - self.transaction_timer.timerUpdate(200) catch { - std.log.scoped(.transaction).err("failed to update timer", .{}); - self.commitTransaction(); - }; + // Timeout the transaction after 200ms. If we are preempting an + // already in progress transaction, don't extend the timeout. + if (!preempting) { + self.transaction_timer.timerUpdate(200) catch { + std.log.scoped(.transaction).err("failed to update timer", .{}); + self.commitTransaction(); + }; + } } else { // No views need configures, clear the current timer in case we are // interrupting another transaction and commit.