From 8007922721472eae602cc0c742b209c2f5af8d34 Mon Sep 17 00:00:00 2001 From: numzero Date: Sat, 11 Jan 2025 00:23:30 +0300 Subject: [PATCH] Use Options instead of a custom enum It looks bad either way --- src/mailbox.rs | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/mailbox.rs b/src/mailbox.rs index 4d6084f..6d221dd 100644 --- a/src/mailbox.rs +++ b/src/mailbox.rs @@ -9,13 +9,16 @@ pub struct Mailbox(Mutex>); impl Mailbox { pub fn new() -> Self { - Mailbox(Mutex::new(MailboxInner::Empty(None))) + Mailbox(Mutex::new(MailboxInner { + waker: None, + value: None, + })) } } -enum MailboxInner { - Empty(Option), - Full(Option, T), +struct MailboxInner { + waker: Option, + value: Option, } struct MailboxPut<'a, T>(&'a Mailbox, Option); @@ -25,18 +28,18 @@ impl<'a, T> Future for MailboxPut<'a, T> { fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut mb = self.0 .0.lock().unwrap(); - match &mut *mb { - MailboxInner::Empty(ref mut waker) => { - let waker = waker.take(); - *mb = MailboxInner::Full(None, self.1.take().expect("Mailbox future overpooled!")); + match mb.value { + None => { + let waker = mb.waker.take(); + mb.value = self.1.take(); drop(mb); if let Some(waker) = waker { waker.wake(); } Poll::Ready(()) } - MailboxInner::Full(ref mut waker, _) => { - *waker = Some(cx.waker().clone()); + Some(_) => { + mb.waker = Some(cx.waker().clone()); Poll::Pending } } @@ -49,13 +52,13 @@ impl<'a, T> Future for MailboxGet<'a, T> { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let mut mb = self.0 .0.lock().unwrap(); - let old = std::mem::replace(&mut *mb, MailboxInner::Empty(None)); - match old { - MailboxInner::Empty(_) => { - *mb = MailboxInner::Empty(Some(cx.waker().clone())); + match mb.value.take() { + None => { + mb.waker = Some(cx.waker().clone()); Poll::Pending } - MailboxInner::Full(waker, value) => { + Some(value) => { + let waker = mb.waker.take(); drop(mb); if let Some(waker) = waker { waker.wake();