diff options
author | 2020-05-21 19:23:22 -0700 | |
---|---|---|
committer | 2020-05-22 11:23:22 +0900 | |
commit | 5e93fa4c6b3d6209329a3a9c90c6823886affea1 (patch) | |
tree | 695b9305b2c28e190a80bd0811e8ac7c4c5d8d15 | |
parent | 9f40abc12a72aed5cb1ac37d769eb39b2a9d9a85 (diff) | |
download | bytes-5e93fa4c6b3d6209329a3a9c90c6823886affea1.tar.gz bytes-5e93fa4c6b3d6209329a3a9c90c6823886affea1.tar.zst bytes-5e93fa4c6b3d6209329a3a9c90c6823886affea1.zip |
Update to loom v0.3 (#381)
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | src/bytes.rs | 48 | ||||
-rw-r--r-- | src/bytes_mut.rs | 10 | ||||
-rw-r--r-- | src/loom.rs | 23 |
4 files changed, 58 insertions, 25 deletions
@@ -33,4 +33,4 @@ serde_test = "1.0" # loom is currently not compiling on windows. # See: https://github.com/Xudong-Huang/generator-rs/issues/19 [target.'cfg(not(windows))'.dev-dependencies] -loom = "0.2.13" +loom = "0.3" diff --git a/src/bytes.rs b/src/bytes.rs index 380b1c6..eb75e1b 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -7,6 +7,9 @@ use alloc::{vec::Vec, string::String, boxed::Box, borrow::Borrow}; use crate::Buf; use crate::buf::IntoIter; use crate::loom::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; +#[allow(unused)] +use crate::loom::sync::atomic::AtomicMut; + /// A reference counted contiguous slice of memory. /// @@ -854,16 +857,18 @@ unsafe fn promotable_even_clone(data: &AtomicPtr<()>, ptr: *const u8, len: usize } unsafe fn promotable_even_drop(data: &mut AtomicPtr<()>, ptr: *const u8, len: usize) { - let shared = *data.get_mut(); - let kind = shared as usize & KIND_MASK; + data.with_mut(|shared| { + let shared = *shared; + let kind = shared as usize & KIND_MASK; - if kind == KIND_ARC { - release_shared(shared as *mut Shared); - } else { - debug_assert_eq!(kind, KIND_VEC); - let buf = (shared as usize & !KIND_MASK) as *mut u8; - drop(rebuild_boxed_slice(buf, ptr, len)); - } + if kind == KIND_ARC { + release_shared(shared as *mut Shared); + } else { + debug_assert_eq!(kind, KIND_VEC); + let buf = (shared as usize & !KIND_MASK) as *mut u8; + drop(rebuild_boxed_slice(buf, ptr, len)); + } + }); } unsafe fn promotable_odd_clone(data: &AtomicPtr<()>, ptr: *const u8, len: usize) -> Bytes { @@ -879,16 +884,18 @@ unsafe fn promotable_odd_clone(data: &AtomicPtr<()>, ptr: *const u8, len: usize) } unsafe fn promotable_odd_drop(data: &mut AtomicPtr<()>, ptr: *const u8, len: usize) { - let shared = *data.get_mut(); - let kind = shared as usize & KIND_MASK; + data.with_mut(|shared| { + let shared = *shared; + let kind = shared as usize & KIND_MASK; - if kind == KIND_ARC { - release_shared(shared as *mut Shared); - } else { - debug_assert_eq!(kind, KIND_VEC); + if kind == KIND_ARC { + release_shared(shared as *mut Shared); + } else { + debug_assert_eq!(kind, KIND_VEC); - drop(rebuild_boxed_slice(shared as *mut u8, ptr, len)); - } + drop(rebuild_boxed_slice(shared as *mut u8, ptr, len)); + } + }); } unsafe fn rebuild_boxed_slice(buf: *mut u8, offset: *const u8, len: usize) -> Box<[u8]> { @@ -925,8 +932,9 @@ unsafe fn shared_clone(data: &AtomicPtr<()>, ptr: *const u8, len: usize) -> Byte } unsafe fn shared_drop(data: &mut AtomicPtr<()>, _ptr: *const u8, _len: usize) { - let shared = *data.get_mut(); - release_shared(shared as *mut Shared); + data.with_mut(|shared| { + release_shared(*shared as *mut Shared); + }); } unsafe fn shallow_clone_arc(shared: *mut Shared, ptr: *const u8, len: usize) -> Bytes { @@ -1062,7 +1070,7 @@ fn _split_off_must_use() {} // fuzz tests #[cfg(all(test, loom))] mod fuzz { - use std::sync::Arc; + use loom::sync::Arc; use loom::thread; use super::Bytes; diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index dda5c47..e0630cb 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -10,6 +10,9 @@ use crate::{Bytes, Buf, BufMut}; use crate::bytes::Vtable; use crate::buf::IntoIter; use crate::loom::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; +#[allow(unused)] +use crate::loom::sync::atomic::AtomicMut; + /// A unique reference to a contiguous slice of memory. /// @@ -1482,8 +1485,9 @@ unsafe fn shared_v_clone(data: &AtomicPtr<()>, ptr: *const u8, len: usize) -> By } unsafe fn shared_v_drop(data: &mut AtomicPtr<()>, _ptr: *const u8, _len: usize) { - let shared = (*data.get_mut()) as *mut Shared; - release_shared(shared as *mut Shared); + data.with_mut(|shared| { + release_shared(*shared as *mut Shared); + }); } // compile-fails @@ -1521,7 +1525,7 @@ fn _split_must_use() {} // fuzz tests #[cfg(all(test, loom))] mod fuzz { - use std::sync::Arc; + use loom::sync::Arc; use loom::thread; use crate::Bytes; diff --git a/src/loom.rs b/src/loom.rs index 80947ac..1cae881 100644 --- a/src/loom.rs +++ b/src/loom.rs @@ -2,8 +2,29 @@ pub(crate) mod sync { pub(crate) mod atomic { pub(crate) use core::sync::atomic::{fence, AtomicPtr, AtomicUsize, Ordering}; + + pub(crate) trait AtomicMut<T> { + fn with_mut<F, R>(&mut self, f: F) -> R + where + F: FnOnce(&mut *mut T) -> R; + } + + impl<T> AtomicMut<T> for AtomicPtr<T> { + fn with_mut<F, R>(&mut self, f: F) -> R + where + F: FnOnce(&mut *mut T) -> R, + { + f(self.get_mut()) + } + } } } #[cfg(all(test, loom))] -pub(crate) use ::loom::sync; +pub(crate) mod sync { + pub(crate) mod atomic { + pub(crate) use loom::sync::atomic::{fence, AtomicPtr, AtomicUsize, Ordering}; + + pub(crate) trait AtomicMut<T> {} + } +} |