metrics: correctly update atomics in IoDriverMetrics (#4725)

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 .
This commit is contained in:
Alan Somers 2022-05-30 03:14:56 -06:00 committed by GitHub
parent f6c0405084
commit 6c0a9942ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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