From edbf46019302622767d0bd23020ac70c75af04e8 Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 29 May 2022 20:43:59 -0600 Subject: [PATCH] Correctly update atomics in IoDriverMetrics Updating an atomic variable with a load followed by a store is racy. It defeats the entire purpose of using atomic variables, and can result in "lost" updates. Instead, use fetch_add . --- tokio/src/runtime/metrics/io.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tokio/src/runtime/metrics/io.rs b/tokio/src/runtime/metrics/io.rs index 9706bfc9bc2..06efdd42d72 100644 --- a/tokio/src/runtime/metrics/io.rs +++ b/tokio/src/runtime/metrics/io.rs @@ -11,20 +11,14 @@ pub(crate) struct IoDriverMetrics { impl IoDriverMetrics { pub(crate) fn incr_fd_count(&self) { - let prev = self.fd_registered_count.load(Relaxed); - let new = prev.wrapping_add(1); - self.fd_registered_count.store(new, Relaxed); + self.fd_registered_count.fetch_add(1, Relaxed); } pub(crate) fn dec_fd_count(&self) { - let prev = self.fd_deregistered_count.load(Relaxed); - let new = prev.wrapping_add(1); - self.fd_deregistered_count.store(new, Relaxed); + self.fd_deregistered_count.fetch_add(1, Relaxed); } pub(crate) fn incr_ready_count_by(&self, amt: u64) { - let prev = self.ready_count.load(Relaxed); - let new = prev.wrapping_add(amt); - self.ready_count.store(new, Relaxed); + self.ready_count.fetch_add(amt, Relaxed); } }