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