starry_api/imp/task/
exit.rsuse axprocess::Pid;
use axtask::{TaskExtRef, current};
use crate::ptr::{PtrWrapper, UserPtr};
pub fn do_exit(exit_code: i32, group_exit: bool) -> ! {
let curr = current();
let curr_ext = curr.task_ext();
let thread = &curr_ext.thread;
info!("{:?} exit with code: {}", thread, exit_code);
let clear_child_tid = UserPtr::<Pid>::from(curr_ext.thread_data().clear_child_tid());
if let Ok(clear_tid) = clear_child_tid.get() {
unsafe { clear_tid.write(0) };
}
let process = thread.process();
if thread.exit(exit_code) {
process.exit();
}
if group_exit && !process.is_group_exited() {
process.group_exit();
}
axtask::exit(exit_code)
}
pub fn sys_exit(exit_code: i32) -> ! {
do_exit(exit_code << 8, false)
}
pub fn sys_exit_group(exit_code: i32) -> ! {
do_exit(exit_code << 8, true)
}