|
@@ -1,5 +1,5 @@
|
|
//! These code are bring from redox-os, and I think it's a good idea to use it in our project.
|
|
//! These code are bring from redox-os, and I think it's a good idea to use it in our project.
|
|
-//!
|
|
|
|
|
|
+//!
|
|
//! Helpers used to define types that are backed by integers (typically `usize`),
|
|
//! Helpers used to define types that are backed by integers (typically `usize`),
|
|
//! without compromising safety.
|
|
//! without compromising safety.
|
|
//!
|
|
//!
|
|
@@ -55,7 +55,7 @@ macro_rules! int_like {
|
|
#[allow(dead_code)]
|
|
#[allow(dead_code)]
|
|
pub const fn new(x: $new_type_name) -> Self {
|
|
pub const fn new(x: $new_type_name) -> Self {
|
|
$new_atomic_type_name {
|
|
$new_atomic_type_name {
|
|
- container: $backing_atomic_type::new(x.into())
|
|
|
|
|
|
+ container: $backing_atomic_type::new(x.into()),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
#[allow(dead_code)]
|
|
@@ -71,39 +71,62 @@ macro_rules! int_like {
|
|
self.container.store(val.into(), order)
|
|
self.container.store(val.into(), order)
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
#[allow(dead_code)]
|
|
- pub fn swap(&self, val: $new_type_name, order: ::core::sync::atomic::Ordering) -> $new_type_name {
|
|
|
|
|
|
+ pub fn swap(
|
|
|
|
+ &self,
|
|
|
|
+ val: $new_type_name,
|
|
|
|
+ order: ::core::sync::atomic::Ordering,
|
|
|
|
+ ) -> $new_type_name {
|
|
$new_type_name::from(self.container.swap(val.into(), order))
|
|
$new_type_name::from(self.container.swap(val.into(), order))
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
#[allow(dead_code)]
|
|
- pub fn compare_exchange(&self, current: $new_type_name, new: $new_type_name, success: ::core::sync::atomic::Ordering, failure: ::core::sync::atomic::Ordering) -> ::core::result::Result<$new_type_name, $new_type_name> {
|
|
|
|
- match self.container.compare_exchange(current.into(), new.into(), success, failure) {
|
|
|
|
|
|
+ pub fn compare_exchange(
|
|
|
|
+ &self,
|
|
|
|
+ current: $new_type_name,
|
|
|
|
+ new: $new_type_name,
|
|
|
|
+ success: ::core::sync::atomic::Ordering,
|
|
|
|
+ failure: ::core::sync::atomic::Ordering,
|
|
|
|
+ ) -> ::core::result::Result<$new_type_name, $new_type_name> {
|
|
|
|
+ match self
|
|
|
|
+ .container
|
|
|
|
+ .compare_exchange(current.into(), new.into(), success, failure)
|
|
|
|
+ {
|
|
Ok(result) => Ok($new_type_name::from(result)),
|
|
Ok(result) => Ok($new_type_name::from(result)),
|
|
- Err(result) => Err($new_type_name::from(result))
|
|
|
|
|
|
+ Err(result) => Err($new_type_name::from(result)),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
#[allow(dead_code)]
|
|
- pub fn compare_exchange_weak(&self, current: $new_type_name, new: $new_type_name, success: ::core::sync::atomic::Ordering, failure: ::core::sync::atomic::Ordering) -> ::core::result::Result<$new_type_name, $new_type_name> {
|
|
|
|
- match self.container.compare_exchange_weak(current.into(), new.into(), success, failure) {
|
|
|
|
|
|
+ pub fn compare_exchange_weak(
|
|
|
|
+ &self,
|
|
|
|
+ current: $new_type_name,
|
|
|
|
+ new: $new_type_name,
|
|
|
|
+ success: ::core::sync::atomic::Ordering,
|
|
|
|
+ failure: ::core::sync::atomic::Ordering,
|
|
|
|
+ ) -> ::core::result::Result<$new_type_name, $new_type_name> {
|
|
|
|
+ match self.container.compare_exchange_weak(
|
|
|
|
+ current.into(),
|
|
|
|
+ new.into(),
|
|
|
|
+ success,
|
|
|
|
+ failure,
|
|
|
|
+ ) {
|
|
Ok(result) => Ok($new_type_name::from(result)),
|
|
Ok(result) => Ok($new_type_name::from(result)),
|
|
- Err(result) => Err($new_type_name::from(result))
|
|
|
|
|
|
+ Err(result) => Err($new_type_name::from(result)),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ };
|
|
}
|
|
}
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
fn test() {
|
|
fn test() {
|
|
- use core::mem::size_of;
|
|
|
|
use ::core::sync::atomic::AtomicUsize;
|
|
use ::core::sync::atomic::AtomicUsize;
|
|
|
|
+ use core::mem::size_of;
|
|
|
|
|
|
// Generate type `usize_like`.
|
|
// Generate type `usize_like`.
|
|
int_like!(UsizeLike, usize);
|
|
int_like!(UsizeLike, usize);
|
|
assert_eq!(size_of::<UsizeLike>(), size_of::<usize>());
|
|
assert_eq!(size_of::<UsizeLike>(), size_of::<usize>());
|
|
|
|
|
|
-
|
|
|
|
// Generate types `usize_like` and `AtomicUsize`.
|
|
// Generate types `usize_like` and `AtomicUsize`.
|
|
int_like!(UsizeLike2, AtomicUsizeLike, usize, AtomicUsize);
|
|
int_like!(UsizeLike2, AtomicUsizeLike, usize, AtomicUsize);
|
|
assert_eq!(size_of::<UsizeLike2>(), size_of::<usize>());
|
|
assert_eq!(size_of::<UsizeLike2>(), size_of::<usize>());
|
|
assert_eq!(size_of::<AtomicUsizeLike>(), size_of::<AtomicUsize>());
|
|
assert_eq!(size_of::<AtomicUsizeLike>(), size_of::<AtomicUsize>());
|
|
-}
|
|
|
|
|
|
+}
|