fix Value<T>, take 2

This commit is contained in:
Janis 2025-02-20 19:25:37 +01:00
parent ebec679875
commit c3804c8930

View file

@ -216,12 +216,11 @@ mod job {
// SAFETY: we know the box is allocated if state was `Pending`. // SAFETY: we know the box is allocated if state was `Pending`.
if inline { if inline {
let mut this = Self(MaybeUninit::uninit()); let this = MaybeUninit::new(Self(MaybeUninit::uninit()));
unsafe { unsafe {
*mem::transmute::<&mut MaybeUninit<Box<MaybeUninit<T>>>, &mut T>(&mut this.0) = this.as_ptr().cast::<T>().cast_mut().write(value);
value; this.assume_init()
} }
this
} else { } else {
Self(MaybeUninit::new(Box::new(MaybeUninit::new(value)))) Self(MaybeUninit::new(Box::new(MaybeUninit::new(value))))
} }
@ -230,10 +229,8 @@ mod job {
impl<T> Drop for Value<T> { impl<T> Drop for Value<T> {
fn drop(&mut self) { fn drop(&mut self) {
unsafe { // drop contained value.
// drop contained value. drop(unsafe { self.get_unchecked(Self::is_inline()) });
_ = self.get_unchecked(Self::is_inline());
}
} }
} }
@ -500,13 +497,16 @@ mod job {
} }
/// assumes job is in joblist /// assumes job is in joblist
pub unsafe fn unlink(&self) -> Option<()> { pub unsafe fn unlink(&self) {
unsafe { unsafe {
let link = self.link_mut(); let link = *self.link_mut();
link.prev?.as_ref().link_mut().next = link.next; if let Some(prev) = link.prev {
link.next?.as_ref().link_mut().prev = link.prev; prev.as_ref().link_mut().next = link.next;
}
if let Some(next) = link.next {
next.as_ref().link_mut().prev = link.prev;
}
} }
Some(())
} }
pub fn state(&self) -> u8 { pub fn state(&self) -> u8 {