Skip to content

Commit

Permalink
Correctly update atomics in IoDriverMetrics
Browse files Browse the repository at this point in the history
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 .
  • Loading branch information
asomers committed May 30, 2022
1 parent f6c0405 commit 39d1f07
Showing 1 changed file with 3 additions and 9 deletions.
12 changes: 3 additions & 9 deletions tokio/src/runtime/metrics/io.rs
Expand Up @@ -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);
}

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);
}

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);
}
}

0 comments on commit 39d1f07

Please sign in to comment.