diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 01:02:37 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 01:02:37 +0000 |
commit | fa9f0b496b6b0bdf3671390d09a94d5b3ba9ec38 (patch) | |
tree | 8555918e06cc10c545d628a5e93547bd5a24af54 /src/deferred.rs | |
parent | 48c8cb383e7ad7fb9e1f9c0f845230411f016b5b (diff) | |
parent | 37d9c53d0030a7db063c91d388e55a3ff4fd1c40 (diff) | |
download | crossbeam-epoch-fa9f0b496b6b0bdf3671390d09a94d5b3ba9ec38.tar.gz |
Snap for 10447354 from 37d9c53d0030a7db063c91d388e55a3ff4fd1c40 to mainline-cellbroadcast-releaseaml_cbr_341710000aml_cbr_341610000aml_cbr_341510010aml_cbr_341410010aml_cbr_341311010aml_cbr_341110000aml_cbr_341011000aml_cbr_340914000android14-mainline-cellbroadcast-release
Change-Id: I154c3e639637784dc1e54221f6f40685bb651e41
Diffstat (limited to 'src/deferred.rs')
-rw-r--r-- | src/deferred.rs | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/deferred.rs b/src/deferred.rs index c33d515..2f3d79f 100644 --- a/src/deferred.rs +++ b/src/deferred.rs @@ -29,6 +29,15 @@ impl fmt::Debug for Deferred { } impl Deferred { + pub(crate) const NO_OP: Self = { + fn no_op_call(_raw: *mut u8) {} + Self { + call: no_op_call, + data: MaybeUninit::uninit(), + _marker: PhantomData, + } + }; + /// Constructs a new `Deferred` from a `FnOnce()`. pub(crate) fn new<F: FnOnce()>(f: F) -> Self { let size = mem::size_of::<F>(); @@ -37,10 +46,10 @@ impl Deferred { unsafe { if size <= mem::size_of::<Data>() && align <= mem::align_of::<Data>() { let mut data = MaybeUninit::<Data>::uninit(); - ptr::write(data.as_mut_ptr() as *mut F, f); + ptr::write(data.as_mut_ptr().cast::<F>(), f); unsafe fn call<F: FnOnce()>(raw: *mut u8) { - let f: F = ptr::read(raw as *mut F); + let f: F = ptr::read(raw.cast::<F>()); f(); } @@ -52,12 +61,12 @@ impl Deferred { } else { let b: Box<F> = Box::new(f); let mut data = MaybeUninit::<Data>::uninit(); - ptr::write(data.as_mut_ptr() as *mut Box<F>, b); + ptr::write(data.as_mut_ptr().cast::<Box<F>>(), b); 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>`. - let b: Box<F> = ptr::read(raw as *mut Box<F>); + let b: Box<F> = ptr::read(raw.cast::<Box<F>>()); (*b)(); } @@ -74,7 +83,7 @@ impl Deferred { #[inline] pub(crate) fn call(mut self) { let call = self.call; - unsafe { call(self.data.as_mut_ptr() as *mut u8) }; + unsafe { call(self.data.as_mut_ptr().cast::<u8>()) }; } } |