From 899d24d5c61777448118041408238d0ad8d317b1 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Sun, 18 May 2025 04:24:14 +0300 Subject: [PATCH] engine: optimize turbo state update logic --- src/engine.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/engine.rs b/src/engine.rs index 56ee1da..ce644d2 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -94,8 +94,24 @@ impl TurboHysteresis { /// Update the turbo state for hysteresis fn update_state(&self, new_state: bool) { +q // First store the new state, then mark as initialized + // With this, any thread seeing initialized=true will also see the correct state self.previous_state.store(new_state, Ordering::Release); - self.initialized.store(true, Ordering::Release); + + // Already initialized, no need for compare_exchange + if self.initialized.load(Ordering::Relaxed) { + return; + } + + // Otherwise, try to set initialized=true (but only if it was false) + self.initialized + .compare_exchange( + false, // expected: not initialized + true, // desired: mark as initialized + Ordering::Release, // success ordering: release for memory visibility + Ordering::Relaxed, // failure ordering: we don't care about the current value on failure + ) + .ok(); // Ignore the result - if it fails, it means another thread already initialized it } }