Skip to content

Commit 4e4ed96

Browse files
committed
feat: remove the uses of CAS atomics
It's not supported by the Armv6-M architecture. Load/store atomics is fine.
1 parent 69871f6 commit 4e4ed96

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

src/constance_port_arm_m_test_driver/src/logger_semihosting.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ impl log::Log for Logger {
1919
}
2020

2121
pub fn init() {
22-
log::set_logger(&Logger).unwrap();
22+
// Note: Some targets don't support CAS atomics. This is why we need to use
23+
// `set_logger_racy` here.
24+
// Safety: There are no other threads calling `set_logger_racy` at the
25+
// same time.
26+
unsafe { log::set_logger_racy(&Logger).unwrap() };
2327
log::set_max_level(log::LevelFilter::Trace);
2428
}

src/constance_test_suite/src/kernel_tests/compute_round_robin.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ fn worker_body<System: Kernel, D: Driver<App<System>>>(worker_id: usize) {
137137
// Safety: A mutable reference to `ref_output` doesn't exist at this point
138138
let ref_output = unsafe { &*state.ref_output.get() };
139139

140+
let run_count = &state.run_count[worker_id];
141+
140142
let mut i = 0;
141143

142144
while !state.stop.load(Ordering::Relaxed) {
@@ -156,7 +158,10 @@ fn worker_body<System: Kernel, D: Driver<App<System>>>(worker_id: usize) {
156158
}
157159

158160
log::trace!("[{}] Iteration {}: complete", worker_id, i);
159-
state.run_count[worker_id].fetch_add(1, Ordering::Relaxed);
161+
162+
// Note: Some targets don't support CAS atomics. Non-atomic load/store
163+
// suffices because `run_count` is only written by this task.
164+
run_count.store(run_count.load(Ordering::Relaxed) + 1, Ordering::Relaxed);
160165
}
161166
}
162167

src/constance_test_suite/src/utils.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,10 @@ impl SeqTracker {
3030
/// `new`.
3131
#[track_caller]
3232
pub(crate) fn expect_and_replace(&self, old: usize, new: usize) {
33-
log::debug!(
34-
"{} (expected: {}) → {}",
35-
self.counter.load(Ordering::Relaxed),
36-
old,
37-
new
38-
);
39-
let got = self.counter.compare_and_swap(old, new, Ordering::Relaxed);
33+
// Note: Some targets don't support CAS atomics
34+
let got = self.counter.load(Ordering::Relaxed);
35+
log::debug!("{} (expected: {}) → {}", got, old, new);
4036
assert_eq!(got, old, "expected {}, got {}", old, got);
37+
self.counter.store(new, Ordering::Relaxed);
4138
}
4239
}

0 commit comments

Comments
 (0)