From fdaf78699336c8638810e463b2c33f76876e7d94 Mon Sep 17 00:00:00 2001 From: Robert Kruszewski Date: Tue, 21 Jul 2026 10:22:35 +0100 Subject: [PATCH] BufferIterator can be Send + Sync Signed-off-by: Robert Kruszewski --- vortex-buffer/src/buffer.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/vortex-buffer/src/buffer.rs b/vortex-buffer/src/buffer.rs index 4b587b94629..80a09ef1fe5 100644 --- a/vortex-buffer/src/buffer.rs +++ b/vortex-buffer/src/buffer.rs @@ -713,6 +713,11 @@ pub struct BufferIterator { end: *const T, } +// SAFETY: `BufferIterator` is a `Buffer` plus two cursors into it, so it can safely be +// `Send`/`Sync` exactly when `Buffer` is. Same bounds as `std::vec::IntoIter`. +unsafe impl Send for BufferIterator {} +unsafe impl Sync for BufferIterator {} + impl Iterator for BufferIterator { type Item = T; @@ -777,6 +782,17 @@ mod test { assert_eq!(aligned.as_slice(), &[0, 1, 2]); } + #[test] + fn buffer_iterator_send_sync() { + fn assert_send_sync(_: &T) {} + + let mut iter = buffer![0i32, 1, 2, 3].into_iter(); + assert_send_sync(&iter); + iter.next(); + let remaining: Vec = std::thread::spawn(move || iter.collect()).join().unwrap(); + assert_eq!(remaining, vec![1, 2, 3]); + } + #[test] fn slice() { let buf = buffer![0, 1, 2, 3, 4];