From 350e112db08c3634b3288408fda1d7ca285b1653 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Mon, 13 Sep 2021 00:41:26 +0200 Subject: [PATCH 1/3] deque: fix miri error with raw-borrowing twice. When you take a raw pointer, previous raw pointers are invalidated. We get the pointer just once and use it twice. --- src/deque.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/deque.rs b/src/deque.rs index bf0d5201..f523f0f0 100644 --- a/src/deque.rs +++ b/src/deque.rs @@ -168,22 +168,21 @@ impl Deque { /// Returns a pair of mutable slices which contain, in order, the contents of the `Deque`. pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) { + let ptr = self.buffer.as_mut_ptr(); + // NOTE(unsafe) avoid bound checks in the slicing operation unsafe { if self.is_empty() { (&mut [], &mut []) } else if self.back <= self.front { ( - slice::from_raw_parts_mut( - self.buffer.as_mut_ptr().add(self.front) as *mut T, - N - self.front, - ), - slice::from_raw_parts_mut(self.buffer.as_mut_ptr() as *mut T, self.back), + slice::from_raw_parts_mut(ptr.add(self.front) as *mut T, N - self.front), + slice::from_raw_parts_mut(ptr as *mut T, self.back), ) } else { ( slice::from_raw_parts_mut( - self.buffer.as_mut_ptr().add(self.front) as *mut T, + ptr.add(self.front) as *mut T, self.back - self.front, ), &mut [], From c98804daecdb55f67623a7a425bfe8f5a8b5516e Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Mon, 13 Sep 2021 00:42:33 +0200 Subject: [PATCH 2/3] deque: Fix miri error due to too small raw pointer borrow. `&mut buffer[0]` only grants access to the first item, we need access to the entire buffer. --- src/deque.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deque.rs b/src/deque.rs index f523f0f0..65776212 100644 --- a/src/deque.rs +++ b/src/deque.rs @@ -350,7 +350,7 @@ impl Deque { let done = self.is_empty(); IterMut { _phantom: PhantomData, - buffer: &mut self.buffer[0] as *mut MaybeUninit, + buffer: &mut self.buffer as *mut _ as *mut MaybeUninit, front: self.front, back: self.back, done, From 4c203532ba6d629bde40be62fb245c3434eb4bce Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Mon, 13 Sep 2021 01:04:00 +0200 Subject: [PATCH 3/3] Ignore slow tests when running in miri. There's a few tests that do millions of iterations. Miri is incredibly slow and takes too long to run these (I gave up waiting after 5+ minutes), so we ignore them when testing with miri. --- src/spsc.rs | 2 ++ tests/tsan.rs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/spsc.rs b/src/spsc.rs index d01d69c0..2c0a6b44 100644 --- a/src/spsc.rs +++ b/src/spsc.rs @@ -621,6 +621,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // too slow fn len() { let mut rb: Queue = Queue::new(); @@ -641,6 +642,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // too slow fn try_overflow() { const N: usize = 23; let mut rb: Queue = Queue::new(); diff --git a/tests/tsan.rs b/tests/tsan.rs index 04c392f3..22a51958 100644 --- a/tests/tsan.rs +++ b/tests/tsan.rs @@ -74,6 +74,7 @@ fn scoped() { } #[test] +#[cfg_attr(miri, ignore)] // too slow fn contention() { const N: usize = 1024; @@ -118,6 +119,7 @@ fn contention() { } #[test] +#[cfg_attr(miri, ignore)] // too slow fn mpmc_contention() { const N: u32 = 64; @@ -163,6 +165,7 @@ fn mpmc_contention() { } #[test] +#[cfg_attr(miri, ignore)] // too slow fn unchecked() { const N: usize = 1024;