pub struct Arc<T: ?Sized> { /* private fields */ }
Expand description
A reference-counted pointer to an instance of T
.
The reference count is incremented when new instances of Arc
are created, and decremented
when they are dropped. When the count reaches zero, the underlying T
is also dropped.
Invariants
The reference count on an instance of Arc
is always non-zero.
The object pointed to by Arc
is always pinned.
Examples
use kernel::sync::Arc;
struct Example {
a: u32,
b: u32,
}
// Create a ref-counted instance of `Example`.
let obj = Arc::try_new(Example { a: 10, b: 20 })?;
// Get a new pointer to `obj` and increment the refcount.
let cloned = obj.clone();
// Assert that both `obj` and `cloned` point to the same underlying object.
assert!(core::ptr::eq(&*obj, &*cloned));
// Destroy `obj` and decrement its refcount.
drop(obj);
// Check that the values are still accessible through `cloned`.
assert_eq!(cloned.a, 10);
assert_eq!(cloned.b, 20);
// The refcount drops to zero when `cloned` goes out of scope, and the memory is freed.
Using Arc<T>
as the type of self
:
use kernel::sync::Arc;
struct Example {
a: u32,
b: u32,
}
impl Example {
fn take_over(self: Arc<Self>) {
// ...
}
fn use_reference(self: &Arc<Self>) {
// ...
}
}
let obj = Arc::try_new(Example { a: 10, b: 20 })?;
obj.use_reference();
obj.take_over();
Coercion from Arc<Example>
to Arc<dyn MyTrait>
:
use kernel::sync::{Arc, ArcBorrow};
trait MyTrait {
// Trait has a function whose `self` type is `Arc<Self>`.
fn example1(self: Arc<Self>) {}
// Trait has a function whose `self` type is `ArcBorrow<'_, Self>`.
fn example2(self: ArcBorrow<'_, Self>) {}
}
struct Example;
impl MyTrait for Example {}
// `obj` has type `Arc<Example>`.
let obj: Arc<Example> = Arc::try_new(Example)?;
// `coerced` has type `Arc<dyn MyTrait>`.
let coerced: Arc<dyn MyTrait> = obj;
Implementations
sourceimpl<T> Arc<T>
impl<T> Arc<T>
sourcepub fn try_new(contents: T) -> Result<Self, AllocError>
pub fn try_new(contents: T) -> Result<Self, AllocError>
Constructs a new reference counted instance of T
.
Trait Implementations
sourceimpl<T: 'static> ForeignOwnable for Arc<T>
impl<T: 'static> ForeignOwnable for Arc<T>
type Borrowed<'a> = ArcBorrow<'a, T>
type Borrowed<'a> = ArcBorrow<'a, T>
Type of values borrowed between calls to ForeignOwnable::into_foreign
and
ForeignOwnable::from_foreign
. Read more
sourcefn into_foreign(self) -> *const c_void
fn into_foreign(self) -> *const c_void
Converts a Rust-owned object to a foreign-owned one. Read more
sourceunsafe fn borrow<'a>(ptr: *const c_void) -> ArcBorrow<'a, T>
unsafe fn borrow<'a>(ptr: *const c_void) -> ArcBorrow<'a, T>
Borrows a foreign-owned object. Read more
sourceunsafe fn from_foreign(ptr: *const c_void) -> Self
unsafe fn from_foreign(ptr: *const c_void) -> Self
Converts a foreign-owned object back to a Rust-owned one. Read more
sourceunsafe fn borrow_mut(ptr: *const c_void) -> ScopeGuard<Self, fn(_: Self)>
unsafe fn borrow_mut(ptr: *const c_void) -> ScopeGuard<Self, fn(_: Self)>
Mutably borrows a foreign-owned object. Read more
impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Arc<U>> for Arc<T>
impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Arc<U>> for Arc<T>
impl<T: ?Sized + Sync + Send> Send for Arc<T>
impl<T: ?Sized + Sync + Send> Sync for Arc<T>
Auto Trait Implementations
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more