From 1c0bbf44044a9a9c3e7a9daa644d02fc8077ba86 Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Sat, 11 Dec 2021 21:40:04 +0800 Subject: [PATCH] add user app: sync_sem.rs --- user/src/bin/sync_sem.rs | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 user/src/bin/sync_sem.rs diff --git a/user/src/bin/sync_sem.rs b/user/src/bin/sync_sem.rs new file mode 100644 index 00000000..d72d520d --- /dev/null +++ b/user/src/bin/sync_sem.rs @@ -0,0 +1,45 @@ +#![no_std] +#![no_main] + +#[macro_use] +extern crate user_lib; + +extern crate alloc; + +use user_lib::{semaphore_create, semaphore_up, semaphore_down}; +use user_lib::{thread_create, waittid, sleep}; +use user_lib::exit; +use alloc::vec::Vec; + +const SEM_SYNC: usize = 0; + + +unsafe fn first() -> ! { + sleep(10); + println!("First work and wakeup Second"); + semaphore_up(SEM_SYNC); + exit(0) +} + +unsafe fn second() -> ! { + println!("Second want to continue,but need to wait first"); + semaphore_down(SEM_SYNC); + println!("Second can work now"); + exit(0) +} + +#[no_mangle] +pub fn main() -> i32 { + // create semaphores + assert_eq!(semaphore_create(0) as usize, SEM_SYNC); + // create threads + let mut threads = Vec::new(); + threads.push(thread_create(first as usize, 0)); + threads.push(thread_create(second as usize, 0)); + // wait for all threads to complete + for thread in threads.iter() { + waittid(*thread as usize); + } + println!("sync_sem passed!"); + 0 +}