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