From 425432ba6c91e6aa92e459528507120ecd613e6e Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 28 Aug 2019 23:41:04 +0200 Subject: [PATCH] use raw ptr for racy load and add comment (#289) --- src/bytes.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/bytes.rs b/src/bytes.rs index b9626490c..6282cf4fb 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -1940,8 +1940,11 @@ impl Inner { #[inline] fn inline_len(&self) -> usize { - let p: &usize = unsafe { mem::transmute(&self.arc) }; - (p & INLINE_LEN_MASK) >> INLINE_LEN_OFFSET + // This is undefind behavior due to a data race, but experimental + // evidence shows that it works in practice (discussion: + // https://internals.rust-lang.org/t/bit-wise-reasoning-for-atomic-accesses/8853). + let p: *const usize = unsafe { mem::transmute(&self.arc) }; + (unsafe { *p } & INLINE_LEN_MASK) >> INLINE_LEN_OFFSET } /// Set the length of the inline buffer. This is done by writing to the