22use alloc:: sync:: Arc ;
33
44use crate :: {
5- loader:: get_app_data_by_name, mm:: { translated_physaddr, translated_refmut, translated_str, MapPermission , VirtAddr } , task:: { add_task, current_task, current_user_token, exit_current_and_run_next, suspend_current_and_run_next} , timer:: get_time_us
5+ loader:: get_app_data_by_name, mm:: { translated_physaddr, translated_refmut, translated_str, MapPermission , VirtAddr } , task:: { add_task, current_task, current_user_token, exit_current_and_run_next, suspend_current_and_run_next, TaskControlBlock } , timer:: get_time_us
66} ;
77
88#[ repr( C ) ]
@@ -73,6 +73,7 @@ pub fn sys_waitpid(pid: isize, exit_code_ptr: *mut i32) -> isize {
7373 . iter ( )
7474 . any ( |p| pid == -1 || pid as usize == p. getpid ( ) )
7575 {
76+ debug ! ( "no such pid[{}]" , pid) ;
7677 return -1 ;
7778 // ---- release current PCB
7879 }
@@ -90,8 +91,10 @@ pub fn sys_waitpid(pid: isize, exit_code_ptr: *mut i32) -> isize {
9091 let exit_code = child. inner_exclusive_access ( ) . exit_code ;
9192 // ++++ release child PCB
9293 * translated_refmut ( inner. memory_set . token ( ) , exit_code_ptr) = exit_code;
94+ debug ! ( "found pid[{}]" , found_pid) ;
9395 found_pid as isize
9496 } else {
97+ // debug!("pid[{}] is running", pid);
9598 -2
9699 }
97100 // ---- release current PCB automatically
@@ -197,7 +200,18 @@ pub fn sys_spawn(_path: *const u8) -> isize {
197200 "kernel:pid[{}] sys_spawn NOT IMPLEMENTED" ,
198201 current_task( ) . unwrap( ) . pid. 0
199202 ) ;
200- -1
203+ let token = current_user_token ( ) ;
204+ let path = translated_str ( token, _path) ;
205+ if let Some ( data) = get_app_data_by_name ( & path) {
206+ let new_task: Arc < TaskControlBlock > = current_task ( ) . unwrap ( ) . spawn ( data) ;
207+ let pid = new_task. getpid ( ) as isize ;
208+ add_task ( new_task) ;
209+ debug ! ( "add task pid[{}]" , pid) ;
210+ return pid;
211+ } else {
212+ debug ! ( "kernel: sys spawn error..." ) ;
213+ return -1 ;
214+ }
201215}
202216
203217// YOUR JOB: Set task priority.
@@ -206,5 +220,9 @@ pub fn sys_set_priority(_prio: isize) -> isize {
206220 "kernel:pid[{}] sys_set_priority NOT IMPLEMENTED" ,
207221 current_task( ) . unwrap( ) . pid. 0
208222 ) ;
209- -1
223+ if _prio < 2 {
224+ return -1 ;
225+ }
226+ current_task ( ) . unwrap ( ) . set_priority ( _prio as usize ) ;
227+ return _prio;
210228}
0 commit comments