Wake up
This commit is contained in:
parent
644b200086
commit
a1fd74320b
|
|
@ -1,7 +1,7 @@
|
|||
use std::{
|
||||
future::Future,
|
||||
pin::Pin,
|
||||
sync::Mutex,
|
||||
sync::{Mutex, MutexGuard},
|
||||
task::{Context, Poll, Waker},
|
||||
};
|
||||
|
||||
|
|
@ -21,6 +21,14 @@ struct MailboxInner<T> {
|
|||
value: Option<T>,
|
||||
}
|
||||
|
||||
fn wake<T>(mut mb: MutexGuard<MailboxInner<T>>) {
|
||||
let waker = mb.waker.take();
|
||||
drop(mb);
|
||||
if let Some(waker) = waker {
|
||||
waker.wake();
|
||||
}
|
||||
}
|
||||
|
||||
struct MailboxPut<'a, T>(&'a Mailbox<T>, Option<T>);
|
||||
impl<'a, T> Unpin for MailboxPut<'a, T> {}
|
||||
impl<'a, T> Future for MailboxPut<'a, T> {
|
||||
|
|
@ -33,11 +41,7 @@ impl<'a, T> Future for MailboxPut<'a, T> {
|
|||
return Poll::Pending;
|
||||
};
|
||||
mb.value = self.1.take();
|
||||
let waker = mb.waker.take();
|
||||
drop(mb);
|
||||
if let Some(waker) = waker {
|
||||
waker.wake();
|
||||
}
|
||||
wake(mb);
|
||||
Poll::Ready(())
|
||||
}
|
||||
}
|
||||
|
|
@ -52,11 +56,7 @@ impl<'a, T> Future for MailboxGet<'a, T> {
|
|||
mb.waker = Some(cx.waker().clone());
|
||||
return Poll::Pending;
|
||||
};
|
||||
let waker = mb.waker.take();
|
||||
drop(mb);
|
||||
if let Some(waker) = waker {
|
||||
waker.wake();
|
||||
}
|
||||
wake(mb);
|
||||
Poll::Ready(value)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user