Small fix to Waiter and WaitQueue

This commit is contained in:
Tate, Hongliang Tian 2019-01-04 21:50:28 +08:00
parent 5b7048976e
commit c31f5334d7
2 changed files with 8 additions and 9 deletions

@ -15,7 +15,6 @@ unsafe impl Send for ChildProcessFilter {}
pub fn do_exit(exit_status: i32) { pub fn do_exit(exit_status: i32) {
let current_ref = get_current(); let current_ref = get_current();
let mut current = current_ref.lock().unwrap(); let mut current = current_ref.lock().unwrap();
// Update current // Update current
current.exit_status = exit_status; current.exit_status = exit_status;
current.status = Status::ZOMBIE; current.status = Status::ZOMBIE;
@ -98,7 +97,7 @@ pub fn do_wait4(child_filter: &ChildProcessFilter, exit_status: &mut i32)
waiter 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!"); } if child_pid == 0 { panic!("THIS SHOULD NEVER HAPPEN!"); }
{ {

@ -14,7 +14,7 @@ unsafe impl<D, R> Send for Waiter<D, R> where D: Sized + Copy, R: Sized + Copy {
struct WaiterInner<D, R> struct WaiterInner<D, R>
where D: Sized + Copy, R: Sized + Copy where D: Sized + Copy, R: Sized + Copy
{ {
has_waken: bool, is_woken: bool,
data: D, data: D,
result: Option<R>, result: Option<R>,
} }
@ -26,7 +26,7 @@ impl<D, R> Waiter<D, R>
Waiter { Waiter {
thread: unsafe { sgx_thread_get_self() }, thread: unsafe { sgx_thread_get_self() },
inner: Arc::new(SgxMutex::new(WaiterInner { inner: Arc::new(SgxMutex::new(WaiterInner {
has_waken: false, is_woken: false,
data: *data, data: *data,
result: None, result: None,
})), })),
@ -37,14 +37,14 @@ impl<D, R> Waiter<D, R>
self.inner.lock().unwrap().data self.inner.lock().unwrap().data
} }
pub fn wait_on(&self) -> R { pub fn sleep_until_woken_with_result(waiter: Waiter<D, R>) -> R {
if !self.inner.lock().unwrap().has_waken { while !waiter.inner.lock().unwrap().is_woken {
unsafe { 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<D, R> WaitQueue<D, R>
let waiter_i = waiters.iter().position(|waiter| { let waiter_i = waiters.iter().position(|waiter| {
let mut waiter_inner = waiter.inner.lock().unwrap(); let mut waiter_inner = waiter.inner.lock().unwrap();
if let Some(waiter_result) = cond(&waiter_inner.data) { 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); waiter_inner.result = Some(waiter_result);
true true
} }