Add race_adder_{atomic,loop}.

This commit is contained in:
Yifan Wu 2021-10-07 09:26:34 -07:00
parent 136e26ae6c
commit 43c6b7cf01
3 changed files with 99 additions and 6 deletions

View File

@ -9,21 +9,23 @@ use user_lib::{exit, thread_create, waittid, get_time};
use alloc::vec::Vec; use alloc::vec::Vec;
static mut A: usize = 0; static mut A: usize = 0;
const PER_THREAD: usize = 2000000; const PER_THREAD: usize = 10000;
const THREAD_COUNT: usize = 8; const THREAD_COUNT: usize = 8;
unsafe fn f() -> ! { unsafe fn f() -> ! {
let start = get_time(); let mut t = 2usize;
for _ in 0..PER_THREAD { for _ in 0..PER_THREAD {
let a = &mut A as *mut usize; let a = &mut A as *mut usize;
let cur = a.read_volatile(); let cur = a.read_volatile();
for _ in 0..500 { t = t * t % 10007; }
a.write_volatile(cur + 1); a.write_volatile(cur + 1);
} }
exit((get_time() - start) as i32) exit(t as i32)
} }
#[no_mangle] #[no_mangle]
pub fn main() -> i32 { pub fn main() -> i32 {
let start = get_time();
let mut v = Vec::new(); let mut v = Vec::new();
for _ in 0..THREAD_COUNT { for _ in 0..THREAD_COUNT {
v.push(thread_create(f as usize) as usize); v.push(thread_create(f as usize) as usize);
@ -32,9 +34,7 @@ pub fn main() -> i32 {
for tid in v.iter() { for tid in v.iter() {
time_cost.push(waittid(*tid)); time_cost.push(waittid(*tid));
} }
for (i, cost) in time_cost.iter().enumerate() { println!("time cost is {}ms", get_time() - start);
println!("cost of thread#{} is {}ms", i, cost);
}
assert_eq!(unsafe { A }, PER_THREAD * THREAD_COUNT); assert_eq!(unsafe { A }, PER_THREAD * THREAD_COUNT);
0 0
} }

View File

@ -0,0 +1,46 @@
#![no_std]
#![no_main]
#[macro_use]
extern crate user_lib;
extern crate alloc;
use user_lib::{exit, thread_create, waittid, get_time, yield_};
use alloc::vec::Vec;
use core::sync::atomic::{AtomicBool, Ordering};
static mut A: usize = 0;
static OCCUPIED: AtomicBool = AtomicBool::new(false);
const PER_THREAD: usize = 100000;
const THREAD_COUNT: usize = 8;
unsafe fn f() -> ! {
let mut t = 2usize;
for _ in 0..PER_THREAD {
while OCCUPIED.compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed).is_err() {
yield_();
}
let a = &mut A as *mut usize;
let cur = a.read_volatile();
for _ in 0..500 { t = t * t % 10007; }
a.write_volatile(cur + 1);
OCCUPIED.store(false, Ordering::Relaxed);
}
exit(t as i32)
}
#[no_mangle]
pub fn main() -> i32 {
let start = get_time();
let mut v = Vec::new();
for _ in 0..THREAD_COUNT {
v.push(thread_create(f as usize) as usize);
}
let mut time_cost = Vec::new();
for tid in v.iter() {
time_cost.push(waittid(*tid));
}
println!("time cost is {}ms", get_time() - start);
assert_eq!(unsafe { A }, PER_THREAD * THREAD_COUNT);
0
}

View File

@ -0,0 +1,47 @@
#![no_std]
#![no_main]
#[macro_use]
extern crate user_lib;
extern crate alloc;
use user_lib::{exit, thread_create, waittid, get_time, yield_};
use alloc::vec::Vec;
static mut A: usize = 0;
static mut OCCUPIED: bool = false;
const PER_THREAD: usize = 10000;
const THREAD_COUNT: usize = 8;
unsafe fn f() -> ! {
let mut t = 2usize;
for _ in 0..PER_THREAD {
while OCCUPIED { yield_(); }
OCCUPIED = true;
// enter critical section
let a = &mut A as *mut usize;
let cur = a.read_volatile();
for _ in 0..500 { t = t * t % 10007; }
a.write_volatile(cur + 1);
// exit critical section
OCCUPIED = false;
}
exit(t as i32)
}
#[no_mangle]
pub fn main() -> i32 {
let start = get_time();
let mut v = Vec::new();
for _ in 0..THREAD_COUNT {
v.push(thread_create(f as usize) as usize);
}
let mut time_cost = Vec::new();
for tid in v.iter() {
time_cost.push(waittid(*tid));
}
println!("time cost is {}ms", get_time() - start);
assert_eq!(unsafe { A }, PER_THREAD * THREAD_COUNT);
0
}