diff --git a/gix-pack/src/cache/delta/traverse/resolve.rs b/gix-pack/src/cache/delta/traverse/resolve.rs index daf6f273e90..ceb81a4dc62 100644 --- a/gix-pack/src/cache/delta/traverse/resolve.rs +++ b/gix-pack/src/cache/delta/traverse/resolve.rs @@ -17,13 +17,13 @@ use crate::{ data::EntryRange, }; -pub(crate) struct State { +pub(crate) struct State<'items, F, MBFN, T: Send> { pub delta_bytes: Vec, pub fully_resolved_delta_bytes: Vec, pub progress: Box, pub resolve: F, pub modify_base: MBFN, - pub child_items: ItemSliceSend>, + pub child_items: ItemSliceSend<'items, Item>, } #[allow(clippy::too_many_arguments)] @@ -38,7 +38,7 @@ pub(crate) fn deltas( resolve, modify_base, child_items, - }: &mut State, + }: &mut State<'_, F, MBFN, T>, resolve_data: &R, hash_len: usize, threads_left: &AtomicIsize, diff --git a/gix-pack/src/cache/delta/traverse/util.rs b/gix-pack/src/cache/delta/traverse/util.rs index 665ed34b804..90192d88579 100644 --- a/gix-pack/src/cache/delta/traverse/util.rs +++ b/gix-pack/src/cache/delta/traverse/util.rs @@ -1,37 +1,49 @@ +use std::marker::PhantomData; + use crate::cache::delta::Item; -pub struct ItemSliceSend(*mut T) +pub struct ItemSliceSend<'a, T> where - T: Send; + T: Send, +{ + items: *mut T, + phantom: PhantomData<&'a T>, +} -impl ItemSliceSend +impl<'a, T> ItemSliceSend<'a, T> where T: Send, { - pub fn new(items: &mut [T]) -> Self { - ItemSliceSend(items.as_mut_ptr()) + pub fn new(items: &'a mut [T]) -> Self { + ItemSliceSend { + items: items.as_mut_ptr(), + phantom: PhantomData, + } } } /// SAFETY: This would be unsafe if this would ever be abused, but it's used internally and only in a way that assure that the pointers /// don't violate aliasing rules. -impl Clone for ItemSliceSend +impl Clone for ItemSliceSend<'_, T> where T: Send, { fn clone(&self) -> Self { - ItemSliceSend(self.0) + ItemSliceSend { + items: self.items, + phantom: self.phantom, + } } } // SAFETY: T is `Send`, and we only ever access one T at a time. And, ptrs need that assurance, I wonder if it's always right. #[allow(unsafe_code)] -unsafe impl Send for ItemSliceSend where T: Send {} +unsafe impl Send for ItemSliceSend<'_, T> where T: Send {} /// An item returned by `iter_root_chunks`, allowing access to the `data` stored alongside nodes in a [`Tree`]. pub struct Node<'a, T: Send> { pub item: &'a mut Item, - pub child_items: ItemSliceSend>, + pub child_items: ItemSliceSend<'a, Item>, } impl<'a, T: Send> Node<'a, T> { @@ -66,7 +78,7 @@ impl<'a, T: Send> Node<'a, T> { // SAFETY: The resulting mutable pointer cannot be yielded by any other node. #[allow(unsafe_code)] Node { - item: unsafe { &mut *children.0.add(index as usize) }, + item: unsafe { &mut *children.items.add(index as usize) }, child_items: children.clone(), } })