Skip to content

Commit afbe370

Browse files
committed
usertest: Simplify using vload and vstore macro
1 parent 3f0cef2 commit afbe370

File tree

5 files changed

+23
-23
lines changed

5 files changed

+23
-23
lines changed

user/src/bin/adder_peterson_spin.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ extern crate user_lib;
88
extern crate alloc;
99

1010
use alloc::vec::Vec;
11-
use core::ptr::{addr_of, addr_of_mut, read_volatile};
11+
use core::ptr::addr_of_mut;
1212
use core::sync::atomic::{compiler_fence, Ordering};
1313
use user_lib::{exit, get_time, thread_create, waittid};
1414

@@ -39,7 +39,7 @@ unsafe fn lock(id: usize) {
3939
// Otherwise the compiler will assume that they will never
4040
// be changed on this thread. Thus, they will be accessed
4141
// only once!
42-
while read_volatile(addr_of!(FLAG[j])) && read_volatile(addr_of!(TURN)) == j {}
42+
while vload!(FLAG[j]) && vload!(TURN) == j {}
4343
}
4444

4545
unsafe fn unlock(id: usize) {

user/src/bin/adder_simple_spin.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ extern crate user_lib;
66
extern crate alloc;
77

88
use alloc::vec::Vec;
9-
use core::ptr::{addr_of, addr_of_mut, read_volatile};
9+
use core::ptr::addr_of_mut;
1010
use user_lib::{exit, get_time, thread_create, waittid};
1111

1212
static mut A: usize = 0;
@@ -25,7 +25,7 @@ unsafe fn critical_section(t: &mut usize) {
2525
}
2626

2727
unsafe fn lock() {
28-
while read_volatile(addr_of!(OCCUPIED)) {}
28+
while vload!(OCCUPIED) {}
2929
OCCUPIED = true;
3030
}
3131

user/src/bin/eisenberg.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ extern crate core;
88

99
use alloc::vec::Vec;
1010
use core::{
11-
ptr::{addr_of, addr_of_mut, read_volatile, write_volatile},
1211
sync::atomic::{AtomicUsize, Ordering},
1312
};
1413
use user_lib::{exit, sleep, thread_create, waittid};
@@ -44,15 +43,15 @@ unsafe fn eisenberg_enter_critical(id: usize) {
4443
/* announce that we want to enter */
4544
loop {
4645
println!("Thread[{}] try enter", id);
47-
write_volatile(addr_of_mut!(FLAG[id]), FlagState::Want);
46+
vstore!(FLAG[id], FlagState::Want);
4847
loop {
4948
/* check if any with higher priority is `Want` or `In` */
5049
let mut prior_thread: Option<usize> = None;
51-
let turn = read_volatile(addr_of!(TURN));
50+
let turn = vload!(TURN);
5251
let ring_id = if id < turn { id + THREAD_NUM } else { id };
5352
// FLAG.iter() may lead to some errors, use for-loop instead
5453
for i in turn..ring_id {
55-
if read_volatile(addr_of!(FLAG[i % THREAD_NUM])) != FlagState::Out {
54+
if vload!(FLAG[i % THREAD_NUM]) != FlagState::Out {
5655
prior_thread = Some(i % THREAD_NUM);
5756
break;
5857
}
@@ -68,13 +67,13 @@ unsafe fn eisenberg_enter_critical(id: usize) {
6867
sleep(1);
6968
}
7069
/* now tentatively claim the resource */
71-
write_volatile(addr_of_mut!(FLAG[id]), FlagState::In);
70+
vstore!(FLAG[id], FlagState::In);
7271
/* enforce the order of `claim` and `conflict check`*/
7372
memory_fence!();
7473
/* check if anthor thread is also `In`, which imply a conflict*/
7574
let mut conflict = false;
7675
for i in 0..THREAD_NUM {
77-
if i != id && read_volatile(addr_of!(FLAG[i])) == FlagState::In {
76+
if i != id && vload!(FLAG[i]) == FlagState::In {
7877
conflict = true;
7978
}
8079
}
@@ -85,7 +84,7 @@ unsafe fn eisenberg_enter_critical(id: usize) {
8584
/* no need to sleep */
8685
}
8786
/* clain the trun */
88-
write_volatile(addr_of_mut!(TURN), id);
87+
vstore!(TURN, id);
8988
println!("Thread[{}] enter", id);
9089
}
9190

@@ -95,14 +94,14 @@ unsafe fn eisenberg_exit_critical(id: usize) {
9594
let ring_id = id + THREAD_NUM;
9695
for i in (id + 1)..ring_id {
9796
let idx = i % THREAD_NUM;
98-
if read_volatile(addr_of!(FLAG[idx])) == FlagState::Want {
97+
if vload!(FLAG[idx]) == FlagState::Want {
9998
next = idx;
10099
break;
101100
}
102101
}
103-
write_volatile(addr_of_mut!(TURN), next);
102+
vstore!(TURN, next);
104103
/* All done */
105-
write_volatile(addr_of_mut!(FLAG[id]), FlagState::Out);
104+
vstore!(FLAG[id], FlagState::Out);
106105
println!("Thread[{}] exit, give turn to {}", id, next);
107106
}
108107

user/src/bin/peterson.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ extern crate alloc;
77
extern crate core;
88

99
use alloc::vec::Vec;
10-
use core::ptr::{addr_of, addr_of_mut, read_volatile, write_volatile};
1110
use core::sync::atomic::{AtomicUsize, Ordering};
1211
use user_lib::{exit, sleep, thread_create, waittid};
1312
const N: usize = 1000;
@@ -30,10 +29,10 @@ fn critical_test_exit() {
3029

3130
unsafe fn peterson_enter_critical(id: usize, peer_id: usize) {
3231
// println!("Thread[{}] try enter", id);
33-
write_volatile(addr_of_mut!(FLAG[id]), true);
34-
write_volatile(addr_of_mut!(TURN), peer_id);
32+
vstore!(FLAG[id], true);
33+
vstore!(TURN, peer_id);
3534
memory_fence!();
36-
while read_volatile(addr_of!(FLAG[peer_id])) && read_volatile(addr_of!(TURN)) == peer_id {
35+
while vload!(FLAG[peer_id]) && vload!(TURN) == peer_id {
3736
// println!("Thread[{}] enter fail", id);
3837
sleep(1);
3938
// println!("Thread[{}] retry enter", id);
@@ -42,7 +41,7 @@ unsafe fn peterson_enter_critical(id: usize, peer_id: usize) {
4241
}
4342

4443
unsafe fn peterson_exit_critical(id: usize) {
45-
write_volatile(addr_of_mut!(FLAG[id]), false);
44+
vstore!(FLAG[id], false);
4645
// println!("Thread[{}] exit", id);
4746
}
4847

user/src/lib.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,17 @@ fn main(_argc: usize, _argv: &[&str]) -> i32 {
7070

7171
#[macro_export]
7272
macro_rules! vstore {
73-
($var_ref: expr, $value: expr) => {
74-
unsafe { core::intrinsics::volatile_store($var_ref as *const _ as _, $value) }
73+
($var: expr, $value: expr) => {
74+
// unsafe { core::intrinsics::volatile_store($var_ref as *const _ as _, $value) }
75+
unsafe { core::ptr::write_volatile(core::ptr::addr_of_mut!($var), $value); }
7576
};
7677
}
7778

7879
#[macro_export]
7980
macro_rules! vload {
80-
($var_ref: expr) => {
81-
unsafe { core::intrinsics::volatile_load($var_ref as *const _ as _) }
81+
($var: expr) => {
82+
// unsafe { core::intrinsics::volatile_load($var_ref as *const _ as _) }
83+
unsafe { core::ptr::read_volatile(core::ptr::addr_of!($var)) }
8284
};
8385
}
8486

0 commit comments

Comments
 (0)