From fad57b74e9b0b54835d7a129c6b6052213e9b584 Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 6 Jul 2025 12:27:33 +0200 Subject: [PATCH] pop front for queue? --- distaff/src/queue.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/distaff/src/queue.rs b/distaff/src/queue.rs index 2975e18..3c92acc 100644 --- a/distaff/src/queue.rs +++ b/distaff/src/queue.rs @@ -90,6 +90,22 @@ impl Slot { }) } + /// this operation isn't atomic. + unsafe fn pop_front(&self) -> Option { + // SAFETY: The caller must ensure that they have exclusive access to the slot + if self.is_set() { + let next = self.next_ptr(); + unsafe { (next.as_ref()).pop_front() } + } else { + // SAFETY: The value is only initialized when the state is set to 1. + if self.next_and_state.tag(Ordering::Acquire) == 1 { + Some(unsafe { self.value.as_ref_unchecked().assume_init_read() }) + } else { + None + } + } + } + /// the caller must ensure that they have exclusive access to the slot unsafe fn push(&self, value: T) { if self.is_set() {