aboutsummaryrefslogtreecommitdiff
path: root/src/deferred.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/deferred.rs')
-rw-r--r--src/deferred.rs11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/deferred.rs b/src/deferred.rs
index d953c46..c33d515 100644
--- a/src/deferred.rs
+++ b/src/deferred.rs
@@ -18,7 +18,7 @@ type Data = [usize; DATA_WORDS];
/// This is a handy way of keeping an unsized `FnOnce()` within a sized structure.
pub(crate) struct Deferred {
call: unsafe fn(*mut u8),
- data: Data,
+ data: MaybeUninit<Data>,
_marker: PhantomData<*mut ()>, // !Send + !Sync
}
@@ -46,7 +46,7 @@ impl Deferred {
Deferred {
call: call::<F>,
- data: data.assume_init(),
+ data,
_marker: PhantomData,
}
} else {
@@ -57,14 +57,13 @@ impl Deferred {
unsafe fn call<F: FnOnce()>(raw: *mut u8) {
// It's safe to cast `raw` from `*mut u8` to `*mut Box<F>`, because `raw` is
// originally derived from `*mut Box<F>`.
- #[allow(clippy::cast_ptr_alignment)]
let b: Box<F> = ptr::read(raw as *mut Box<F>);
(*b)();
}
Deferred {
call: call::<F>,
- data: data.assume_init(),
+ data,
_marker: PhantomData,
}
}
@@ -75,12 +74,14 @@ impl Deferred {
#[inline]
pub(crate) fn call(mut self) {
let call = self.call;
- unsafe { call(&mut self.data as *mut Data as *mut u8) };
+ unsafe { call(self.data.as_mut_ptr() as *mut u8) };
}
}
#[cfg(all(test, not(crossbeam_loom)))]
mod tests {
+ #![allow(clippy::drop_copy)]
+
use super::Deferred;
use std::cell::Cell;