aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Sean McArthur <sean@seanmonstar.com> 2020-05-21 19:23:22 -0700
committerGravatar GitHub <noreply@github.com> 2020-05-22 11:23:22 +0900
commit5e93fa4c6b3d6209329a3a9c90c6823886affea1 (patch)
tree695b9305b2c28e190a80bd0811e8ac7c4c5d8d15
parent9f40abc12a72aed5cb1ac37d769eb39b2a9d9a85 (diff)
downloadbytes-5e93fa4c6b3d6209329a3a9c90c6823886affea1.tar.gz
bytes-5e93fa4c6b3d6209329a3a9c90c6823886affea1.tar.zst
bytes-5e93fa4c6b3d6209329a3a9c90c6823886affea1.zip
Update to loom v0.3 (#381)
-rw-r--r--Cargo.toml2
-rw-r--r--src/bytes.rs48
-rw-r--r--src/bytes_mut.rs10
-rw-r--r--src/loom.rs23
4 files changed, 58 insertions, 25 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 79b6773..c3ba228 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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> {}
+ }
+}