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