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::{ 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)
} }
} }