Add MutexBlocking.

This commit is contained in:
Yifan Wu 2021-10-07 14:33:44 -07:00
parent 8974a29245
commit db6a93e60d
11 changed files with 119 additions and 13 deletions

View file

@ -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;

View 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
}

View file

@ -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;

View file

@ -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); }

View file

@ -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 {