This commit is contained in:
numzero 2025-01-11 00:28:21 +03:00
parent 644b200086
commit a1fd74320b

View File

@ -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)
}
}