From c31f5334d7d1b3b8625ab3c789b68630c80c258c Mon Sep 17 00:00:00 2001 From: "Tate, Hongliang Tian" Date: Fri, 4 Jan 2019 21:50:28 +0800 Subject: [PATCH] Small fix to Waiter and WaitQueue --- src/libos/src/process/exit.rs | 3 +-- src/libos/src/process/wait.rs | 14 +++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/libos/src/process/exit.rs b/src/libos/src/process/exit.rs index 356475fa..21ec212e 100644 --- a/src/libos/src/process/exit.rs +++ b/src/libos/src/process/exit.rs @@ -15,7 +15,6 @@ unsafe impl Send for ChildProcessFilter {} pub fn do_exit(exit_status: i32) { let current_ref = get_current(); let mut current = current_ref.lock().unwrap(); - // Update current current.exit_status = exit_status; current.status = Status::ZOMBIE; @@ -98,7 +97,7 @@ pub fn do_wait4(child_filter: &ChildProcessFilter, exit_status: &mut i32) waiter }; - let child_pid = waiter.wait_on(); + let child_pid = Waiter::sleep_until_woken_with_result(waiter); if child_pid == 0 { panic!("THIS SHOULD NEVER HAPPEN!"); } { diff --git a/src/libos/src/process/wait.rs b/src/libos/src/process/wait.rs index 7cf4d37f..aabb9ddf 100644 --- a/src/libos/src/process/wait.rs +++ b/src/libos/src/process/wait.rs @@ -14,7 +14,7 @@ unsafe impl Send for Waiter where D: Sized + Copy, R: Sized + Copy { struct WaiterInner where D: Sized + Copy, R: Sized + Copy { - has_waken: bool, + is_woken: bool, data: D, result: Option, } @@ -26,7 +26,7 @@ impl Waiter Waiter { thread: unsafe { sgx_thread_get_self() }, inner: Arc::new(SgxMutex::new(WaiterInner { - has_waken: false, + is_woken: false, data: *data, result: None, })), @@ -37,14 +37,14 @@ impl Waiter self.inner.lock().unwrap().data } - pub fn wait_on(&self) -> R { - if !self.inner.lock().unwrap().has_waken { + pub fn sleep_until_woken_with_result(waiter: Waiter) -> R { + while !waiter.inner.lock().unwrap().is_woken { unsafe { - wait_event(self.thread); + wait_event(waiter.thread); } } - self.inner.lock().unwrap().result.unwrap() + waiter.inner.lock().unwrap().result.unwrap() } } @@ -81,7 +81,7 @@ impl WaitQueue let waiter_i = waiters.iter().position(|waiter| { let mut waiter_inner = waiter.inner.lock().unwrap(); if let Some(waiter_result) = cond(&waiter_inner.data) { - waiter_inner.has_waken = true; + waiter_inner.is_woken = true; waiter_inner.result = Some(waiter_result); true }