Add MutexBlocking.
This commit is contained in:
parent
8974a29245
commit
db6a93e60d
11 changed files with 119 additions and 13 deletions
|
@ -9,8 +9,8 @@ use user_lib::{exit, thread_create, waittid, get_time};
|
|||
use alloc::vec::Vec;
|
||||
|
||||
static mut A: usize = 0;
|
||||
const PER_THREAD: usize = 10000;
|
||||
const THREAD_COUNT: usize = 8;
|
||||
const PER_THREAD: usize = 1000;
|
||||
const THREAD_COUNT: usize = 16;
|
||||
|
||||
unsafe fn f() -> ! {
|
||||
let mut t = 2usize;
|
||||
|
|
44
user/src/bin/race_adder_mutex_blocking.rs
Normal file
44
user/src/bin/race_adder_mutex_blocking.rs
Normal file
|
@ -0,0 +1,44 @@
|
|||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
#[macro_use]
|
||||
extern crate user_lib;
|
||||
extern crate alloc;
|
||||
|
||||
use user_lib::{exit, thread_create, waittid, get_time};
|
||||
use user_lib::{mutex_blocking_create, mutex_lock, mutex_unlock};
|
||||
use alloc::vec::Vec;
|
||||
|
||||
static mut A: usize = 0;
|
||||
const PER_THREAD: usize = 10000;
|
||||
const THREAD_COUNT: usize = 8;
|
||||
|
||||
unsafe fn f() -> ! {
|
||||
let mut t = 2usize;
|
||||
for _ in 0..PER_THREAD {
|
||||
mutex_lock(0);
|
||||
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);
|
||||
mutex_unlock(0);
|
||||
}
|
||||
exit(t as i32)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn main() -> i32 {
|
||||
let start = get_time();
|
||||
assert_eq!(mutex_blocking_create(), 0);
|
||||
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
|
||||
}
|
|
@ -10,8 +10,8 @@ use user_lib::{mutex_create, mutex_lock, mutex_unlock};
|
|||
use alloc::vec::Vec;
|
||||
|
||||
static mut A: usize = 0;
|
||||
const PER_THREAD: usize = 10000;
|
||||
const THREAD_COUNT: usize = 8;
|
||||
const PER_THREAD: usize = 1000;
|
||||
const THREAD_COUNT: usize = 16;
|
||||
|
||||
unsafe fn f() -> ! {
|
||||
let mut t = 2usize;
|
||||
|
|
|
@ -118,7 +118,8 @@ pub fn waittid(tid: usize) -> isize {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn mutex_create() -> isize { sys_mutex_create() }
|
||||
pub fn mutex_create() -> isize { sys_mutex_create(false) }
|
||||
pub fn mutex_blocking_create() -> isize { sys_mutex_create(true) }
|
||||
pub fn mutex_lock(mutex_id: usize) { sys_mutex_lock(mutex_id); }
|
||||
pub fn mutex_unlock(mutex_id: usize) { sys_mutex_unlock(mutex_id); }
|
||||
|
||||
|
|
|
@ -97,8 +97,8 @@ pub fn sys_waittid(tid: usize) -> isize {
|
|||
syscall(SYSCALL_WAITTID, [tid, 0, 0])
|
||||
}
|
||||
|
||||
pub fn sys_mutex_create() -> isize {
|
||||
syscall(SYSCALL_MUTEX_CREATE, [0, 0, 0])
|
||||
pub fn sys_mutex_create(blocking: bool) -> isize {
|
||||
syscall(SYSCALL_MUTEX_CREATE, [blocking as usize, 0, 0])
|
||||
}
|
||||
|
||||
pub fn sys_mutex_lock(id: usize) -> isize {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue