Add MutexSpin and several syscalls.

This commit is contained in:
Yifan Wu 2021-10-07 12:40:47 -07:00
parent d1e55d85d8
commit 8974a29245
8 changed files with 159 additions and 2 deletions

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_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_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

@ -117,3 +117,8 @@ pub fn waittid(tid: usize) -> isize {
}
}
}
pub fn mutex_create() -> isize { sys_mutex_create() }
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

@ -14,6 +14,9 @@ const SYSCALL_WAITPID: usize = 260;
const SYSCALL_THREAD_CREATE: usize = 1000;
const SYSCALL_GETTID: usize = 1001;
const SYSCALL_WAITTID: usize = 1002;
const SYSCALL_MUTEX_CREATE: usize = 1010;
const SYSCALL_MUTEX_LOCK: usize = 1011;
const SYSCALL_MUTEX_UNLOCK: usize = 1012;
fn syscall(id: usize, args: [usize; 3]) -> isize {
let mut ret: isize;
@ -93,3 +96,15 @@ pub fn sys_gettid() -> isize {
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_lock(id: usize) -> isize {
syscall(SYSCALL_MUTEX_LOCK, [id, 0, 0])
}
pub fn sys_mutex_unlock(id: usize) -> isize {
syscall(SYSCALL_MUTEX_UNLOCK, [id, 0, 0])
}