about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-10-22 07:20:06 +0000
committerbors <bors@rust-lang.org>2023-10-22 07:20:06 +0000
commitf35c36af19dd24569d760c77388036fffad0be1a (patch)
tree89bf8c1ecc49818cbd9640e98f74dd3443cd02b6
parentf6be93fc61fb487c496c94ebe76ee999572fc927 (diff)
parentb53c34f7b823e74eed970be80dcd5622cee9cd56 (diff)
downloadrust-f35c36af19dd24569d760c77388036fffad0be1a.tar.gz
rust-f35c36af19dd24569d760c77388036fffad0be1a.zip
Auto merge of #3135 - RalfJung:nonatomic-clock, r=RalfJung
avoid AtomicU64 when a Cell is enough
-rw-r--r--src/tools/miri/src/clock.rs13
-rw-r--r--src/tools/miri/src/lib.rs1
2 files changed, 7 insertions, 7 deletions
diff --git a/src/tools/miri/src/clock.rs b/src/tools/miri/src/clock.rs
index 24bf90f104f..fd0c121626b 100644
--- a/src/tools/miri/src/clock.rs
+++ b/src/tools/miri/src/clock.rs
@@ -1,4 +1,4 @@
-use std::sync::atomic::{AtomicU64, Ordering};
+use std::cell::Cell;
 use std::time::{Duration, Instant as StdInstant};
 
 /// When using a virtual clock, this defines how many nanoseconds we pretend are passing for each
@@ -59,7 +59,7 @@ enum ClockKind {
     },
     Virtual {
         /// The "current virtual time".
-        nanoseconds: AtomicU64,
+        nanoseconds: Cell<u64>,
     },
 }
 
@@ -82,7 +82,7 @@ impl Clock {
                 // Time will pass without us doing anything.
             }
             ClockKind::Virtual { nanoseconds } => {
-                nanoseconds.fetch_add(NANOSECONDS_PER_BASIC_BLOCK, Ordering::SeqCst);
+                nanoseconds.update(|x| x + NANOSECONDS_PER_BASIC_BLOCK);
             }
         }
     }
@@ -93,7 +93,8 @@ impl Clock {
             ClockKind::Host { .. } => std::thread::sleep(duration),
             ClockKind::Virtual { nanoseconds } => {
                 // Just pretend that we have slept for some time.
-                nanoseconds.fetch_add(duration.as_nanos().try_into().unwrap(), Ordering::SeqCst);
+                let nanos: u64 = duration.as_nanos().try_into().unwrap();
+                nanoseconds.update(|x| x + nanos);
             }
         }
     }
@@ -110,9 +111,7 @@ impl Clock {
         match &self.kind {
             ClockKind::Host { .. } => Instant { kind: InstantKind::Host(StdInstant::now()) },
             ClockKind::Virtual { nanoseconds } =>
-                Instant {
-                    kind: InstantKind::Virtual { nanoseconds: nanoseconds.load(Ordering::SeqCst) },
-                },
+                Instant { kind: InstantKind::Virtual { nanoseconds: nanoseconds.get() } },
         }
     }
 }
diff --git a/src/tools/miri/src/lib.rs b/src/tools/miri/src/lib.rs
index 68b9164dec0..b12aae6d414 100644
--- a/src/tools/miri/src/lib.rs
+++ b/src/tools/miri/src/lib.rs
@@ -1,4 +1,5 @@
 #![feature(rustc_private)]
+#![feature(cell_update)]
 #![feature(float_gamma)]
 #![feature(map_try_insert)]
 #![feature(never_type)]