pub struct Atom<P>where
P: IntoRawPtr + FromRawPtr,{ /* private fields */ }
Expand description
An Atom wraps an AtomicPtr, it allows for safe mutation of an atomic into common Rust Types.
Implementations§
Source§impl<P> Atom<P>where
P: IntoRawPtr + FromRawPtr,
impl<P> Atom<P>where
P: IntoRawPtr + FromRawPtr,
Sourcepub fn empty() -> Atom<P>
pub fn empty() -> Atom<P>
Create a empty Atom
Examples found in repository?
7fn main() {
8 // Create an empty atom
9 let shared_atom = Arc::new(Atom::empty());
10
11 // set the value 75
12 shared_atom.swap(Box::new(75), Ordering::AcqRel);
13
14 // Spawn a bunch of thread that will try and take the value
15 let threads: Vec<thread::JoinHandle<()>> = (0..8)
16 .map(|_| {
17 let shared_atom = shared_atom.clone();
18 thread::spawn(move || {
19 // Take the contents of the atom, only one will win the race
20 if let Some(v) = shared_atom.take(Ordering::Acquire) {
21 println!("I got it: {:?} :D", v);
22 } else {
23 println!("I did not get it :(");
24 }
25 })
26 })
27 .collect();
28
29 // join the threads
30 for t in threads {
31 t.join().unwrap();
32 }
33}
Sourcepub fn swap(&self, v: P, order: Ordering) -> Option<P>
pub fn swap(&self, v: P, order: Ordering) -> Option<P>
Swap a new value into the Atom, This will try multiple times until it succeeds. The old value will be returned.
Examples found in repository?
7fn main() {
8 // Create an empty atom
9 let shared_atom = Arc::new(Atom::empty());
10
11 // set the value 75
12 shared_atom.swap(Box::new(75), Ordering::AcqRel);
13
14 // Spawn a bunch of thread that will try and take the value
15 let threads: Vec<thread::JoinHandle<()>> = (0..8)
16 .map(|_| {
17 let shared_atom = shared_atom.clone();
18 thread::spawn(move || {
19 // Take the contents of the atom, only one will win the race
20 if let Some(v) = shared_atom.take(Ordering::Acquire) {
21 println!("I got it: {:?} :D", v);
22 } else {
23 println!("I did not get it :(");
24 }
25 })
26 })
27 .collect();
28
29 // join the threads
30 for t in threads {
31 t.join().unwrap();
32 }
33}
Sourcepub fn take(&self, order: Ordering) -> Option<P>
pub fn take(&self, order: Ordering) -> Option<P>
Take the value of the Atom replacing it with null pointer
Returning the contents. If the contents was a null
pointer the
result will be None
.
Examples found in repository?
More examples
7fn main() {
8 // Create an empty atom
9 let shared_atom = Arc::new(Atom::empty());
10
11 // set the value 75
12 shared_atom.swap(Box::new(75), Ordering::AcqRel);
13
14 // Spawn a bunch of thread that will try and take the value
15 let threads: Vec<thread::JoinHandle<()>> = (0..8)
16 .map(|_| {
17 let shared_atom = shared_atom.clone();
18 thread::spawn(move || {
19 // Take the contents of the atom, only one will win the race
20 if let Some(v) = shared_atom.take(Ordering::Acquire) {
21 println!("I got it: {:?} :D", v);
22 } else {
23 println!("I did not get it :(");
24 }
25 })
26 })
27 .collect();
28
29 // join the threads
30 for t in threads {
31 t.join().unwrap();
32 }
33}
Sourcepub fn set_if_none(&self, v: P, order: Ordering) -> Option<P>
pub fn set_if_none(&self, v: P, order: Ordering) -> Option<P>
This will do a CAS
setting the value only if it is NULL
this will return None
if the value was written,
otherwise a Some(v)
will be returned, where the value was
the same value that you passed into this function
Sourcepub fn replace_and_set_next(
&self,
value: P,
load_order: Ordering,
cas_order: Ordering,
) -> boolwhere
P: GetNextMut<NextPtr = Option<P>>,
pub fn replace_and_set_next(
&self,
value: P,
load_order: Ordering,
cas_order: Ordering,
) -> boolwhere
P: GetNextMut<NextPtr = Option<P>>,
Take the current content, write it into P then do a CAS to extent this Atom with the previous contents. This can be used to create a LIFO
Returns true if this set this migrated the Atom from null.
Source§impl<P, T> Atom<P>
impl<P, T> Atom<P>
Sourcepub fn compare_and_swap(
&self,
current: Option<&P>,
new: Option<P>,
order: Ordering,
) -> Result<Option<P>, (Option<P>, *mut P)>
pub fn compare_and_swap( &self, current: Option<&P>, new: Option<P>, order: Ordering, ) -> Result<Option<P>, (Option<P>, *mut P)>
Stores new
in the Atom if current
has the same raw pointer
representation as the currently stored value.
On success, the Atom’s previous value is returned. On failure, new
is
returned together with a raw pointer to the Atom’s current unchanged
value, which is not safe to dereference, especially if the Atom is
accessed from multiple threads.
compare_and_swap
also takes an Ordering
argument which describes
the memory ordering of this operation.
Sourcepub fn compare_exchange(
&self,
current: Option<&P>,
new: Option<P>,
success: Ordering,
failure: Ordering,
) -> Result<Option<P>, (Option<P>, *mut P)>
pub fn compare_exchange( &self, current: Option<&P>, new: Option<P>, success: Ordering, failure: Ordering, ) -> Result<Option<P>, (Option<P>, *mut P)>
Stores a value into the pointer if the current value is the same as the
current
value.
The return value is a result indicating whether the new value was
written and containing the previous value. On success this value is
guaranteed to be equal to current
.
compare_exchange
takes two Ordering
arguments to describe the
memory ordering of this operation. The first describes the required
ordering if the operation succeeds while the second describes the
required ordering when the operation fails. The failure ordering can’t
be Release
or AcqRel
and must be equivalent or weaker than the
success ordering.
Sourcepub fn compare_exchange_weak(
&self,
current: Option<&P>,
new: Option<P>,
success: Ordering,
failure: Ordering,
) -> Result<Option<P>, (Option<P>, *mut P)>
pub fn compare_exchange_weak( &self, current: Option<&P>, new: Option<P>, success: Ordering, failure: Ordering, ) -> Result<Option<P>, (Option<P>, *mut P)>
Stores a value into the pointer if the current value is the same as the
current
value.
Unlike compare_exchange
, this function is allowed to spuriously fail
even when the comparison succeeds, which can result in more efficient
code on some platforms. The return value is a result indicating whether
the new value was written and containing the previous value.
compare_exchange_weak
takes two Ordering
arguments to describe the
memory ordering of this operation. The first describes the required
ordering if the operation succeeds while the second describes the
required ordering when the operation fails. The failure ordering can’t
be Release
or AcqRel
and must be equivalent or weaker than the
success ordering.