fix deadlock when log getting pid
This commit is contained in:
		
							parent
							
								
									3defc8b9aa
								
							
						
					
					
						commit
						6d432b0a03
					
				| @ -1,5 +1,5 @@ | |||||||
| pub use self::process::{Status, IDLE_PROCESS}; | pub use self::process::{Status, IDLE_PROCESS}; | ||||||
| pub use self::task::{get_current, run_task}; | pub use self::task::{get_current, run_task, current_pid}; | ||||||
| pub use self::process_table::{get}; | pub use self::process_table::{get}; | ||||||
| pub use self::exit::{do_exit, do_wait4, ChildProcessFilter}; | pub use self::exit::{do_exit, do_wait4, ChildProcessFilter}; | ||||||
| pub use self::spawn::{do_spawn, FileAction}; | pub use self::spawn::{do_spawn, FileAction}; | ||||||
|  | |||||||
| @ -68,6 +68,12 @@ thread_local! { | |||||||
|     static _CURRENT_PROCESS_PTR: Cell<*const SgxMutex<Process>> = { |     static _CURRENT_PROCESS_PTR: Cell<*const SgxMutex<Process>> = { | ||||||
|         Cell::new(0 as *const SgxMutex<Process>) |         Cell::new(0 as *const SgxMutex<Process>) | ||||||
|     }; |     }; | ||||||
|  |     // for log getting pid without locking process
 | ||||||
|  |     static _PID: Cell<pid_t> = Cell::new(0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn current_pid() -> pid_t { | ||||||
|  |     _PID.with(|p| p.get()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn get_current() -> ProcessRef { | pub fn get_current() -> ProcessRef { | ||||||
| @ -81,6 +87,9 @@ pub fn get_current() -> ProcessRef { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn set_current(process: &ProcessRef) { | fn set_current(process: &ProcessRef) { | ||||||
|  |     let pid = process.lock().unwrap().get_pid(); | ||||||
|  |     _PID.with(|p| p.set(pid)); | ||||||
|  | 
 | ||||||
|     let process_ref_clone = process.clone(); |     let process_ref_clone = process.clone(); | ||||||
|     let process_ptr = Arc::into_raw(process_ref_clone); |     let process_ptr = Arc::into_raw(process_ref_clone); | ||||||
| 
 | 
 | ||||||
| @ -90,6 +99,7 @@ fn set_current(process: &ProcessRef) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn reset_current() { | fn reset_current() { | ||||||
|  |     _PID.with(|p| p.set(0)); | ||||||
|     let mut process_ptr = _CURRENT_PROCESS_PTR.with(|cp| cp.replace(0 as *const SgxMutex<Process>)); |     let mut process_ptr = _CURRENT_PROCESS_PTR.with(|cp| cp.replace(0 as *const SgxMutex<Process>)); | ||||||
| 
 | 
 | ||||||
|     // Prevent memory leakage
 |     // Prevent memory leakage
 | ||||||
|  | |||||||
| @ -26,7 +26,7 @@ impl Log for SimpleLogger { | |||||||
|                 "\u{1B}[{}m[{:>5}][{}] {}\u{1B}[0m", |                 "\u{1B}[{}m[{:>5}][{}] {}\u{1B}[0m", | ||||||
|                 color as u8, |                 color as u8, | ||||||
|                 record.level(), |                 record.level(), | ||||||
|                 crate::process::do_getpid(), |                 crate::process::current_pid(), | ||||||
|                 record.args() |                 record.args() | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user