Type Alias servo_arc::ThinArc

source ·
pub type ThinArc<H, T> = Arc<HeaderSlice<H, T>>;
Expand description

This is functionally equivalent to Arc<(H, [T])>

When you create an Arc containing a dynamically sized type like a slice, the Arc is represented on the stack as a “fat pointer”, where the length of the slice is stored alongside the Arc’s pointer. In some situations you may wish to have a thin pointer instead, perhaps for FFI compatibility or space efficiency. ThinArc solves this by storing the length in the allocation itself, via HeaderSlice.

Aliased Type§

struct ThinArc<H, T> {
    pub(crate) p: NonNull<ArcInner<HeaderSlice<H, T>>>,
    pub(crate) phantom: PhantomData<HeaderSlice<H, T>>,
}

Fields§

§p: NonNull<ArcInner<HeaderSlice<H, T>>>§phantom: PhantomData<HeaderSlice<H, T>>

Implementations§

source§

impl<T> Arc<T>

source

pub fn new(data: T) -> Self

Construct an Arc<T>

source

pub fn new_leaked(data: T) -> Self

Construct an intentionally-leaked arc.

source

pub fn into_raw(this: Self) -> *const T

Convert the Arc to a raw pointer, suitable for use across FFI

Note: This returns a pointer to the data T, which is offset in the allocation.

source

pub unsafe fn from_raw(ptr: *const T) -> Self

Reconstruct the Arc from a raw pointer obtained from into_raw()

Note: This raw pointer will be offset in the allocation and must be preceded by the atomic count.

source

pub unsafe fn from_raw_addrefed(ptr: *const T) -> Self

Like from_raw, but returns an addrefed arc instead.

source

pub unsafe fn new_static<F>(alloc: F, data: T) -> Arc<T>where F: FnOnce(Layout) -> *mut u8,

Create a new static Arc (one that won’t reference count the object) and place it in the allocation provided by the specified alloc function.

alloc must return a pointer into a static allocation suitable for storing data with the Layout passed into it. The pointer returned by alloc will not be freed.

source

pub fn borrow_arc<'a>(&'a self) -> ArcBorrow<'a, T>

Produce a pointer to the data that can be converted back to an Arc. This is basically an &Arc<T>, without the extra indirection. It has the benefits of an &T but also knows about the underlying refcount and can be converted into more Arc<T>s if necessary.

source

pub fn heap_ptr(&self) -> *const c_void

Returns the address on the heap of the Arc itself – not the T within it – for memory reporting.

If this is a static reference, this returns null.

source§

impl<T: ?Sized> Arc<T>

source

pub(crate) fn inner(&self) -> &ArcInner<T>

source

pub(crate) fn record_drop(&self)

source

pub fn mark_as_intentionally_leaked(&self)

Marks this Arc as intentionally leaked for the purposes of refcount logging.

It’s a logic error to call this more than once, but it’s not unsafe, as it’d just report negative leaks.

source

pub(crate) unsafe fn drop_slow(&mut self)

source

pub fn ptr_eq(this: &Self, other: &Self) -> bool

Test pointer equality between the two Arcs, i.e. they must be the same allocation

source

pub(crate) fn ptr(&self) -> *mut ArcInner<T>

source

pub fn raw_ptr(&self) -> *const c_void

Returns a raw ptr to the underlying allocation.

source§

impl<T: Clone> Arc<T>

source

pub fn make_mut(this: &mut Self) -> &mut T

Makes a mutable reference to the Arc, cloning if necessary

This is functionally equivalent to Arc::make_mut from the standard library.

If this Arc is uniquely owned, make_mut() will provide a mutable reference to the contents. If not, make_mut() will create a new Arc with a copy of the contents, update this to point to it, and provide a mutable reference to its contents.

This is useful for implementing copy-on-write schemes where you wish to avoid copying things if your Arc is not shared.

source§

impl<T: ?Sized> Arc<T>

source

pub fn get_mut(this: &mut Self) -> Option<&mut T>

Provides mutable access to the contents if the Arc is uniquely owned.

source

pub fn is_static(&self) -> bool

Whether or not the Arc is a static reference.

source

pub fn is_unique(&self) -> bool

Whether or not the Arc is uniquely owned (is the refcount 1?) and not a static reference.

source§

impl<H, T> Arc<HeaderSlice<H, T>>

source

pub fn from_header_and_iter_alloc<F, I>( alloc: F, header: H, items: I, num_items: usize, is_static: bool ) -> Selfwhere F: FnOnce(Layout) -> *mut u8, I: Iterator<Item = T>,

Creates an Arc for a HeaderSlice using the given header struct and iterator to generate the slice.

is_static indicates whether to create a static Arc.

alloc is used to get a pointer to the memory into which the dynamically sized ArcInner<HeaderSlice<H, T>> value will be written. If is_static is true, then alloc must return a pointer into some static memory allocation. If it is false, then alloc must return an allocation that can be dellocated by calling Box::from_raw::<ArcInner<HeaderSlice<H, T>>> on it.

source

pub fn from_header_and_iter_with_size<I>( header: H, items: I, num_items: usize ) -> Selfwhere I: Iterator<Item = T>,

Creates an Arc for a HeaderSlice using the given header struct and iterator to generate the slice. Panics if num_items doesn’t match the number of items.

source

pub fn from_header_and_iter<I>(header: H, items: I) -> Selfwhere I: Iterator<Item = T> + ExactSizeIterator,

Creates an Arc for a HeaderSlice using the given header struct and iterator to generate the slice. The resulting Arc will be fat.

Trait Implementations§

source§

impl<T: ?Sized> AsRef<T> for Arc<T>

source§

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<T: ?Sized> Borrow<T> for Arc<T>

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T: ?Sized> Clone for Arc<T>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T: ?Sized + Debug> Debug for Arc<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T: Default> Default for Arc<T>

source§

fn default() -> Arc<T>

Returns the “default value” for a type. Read more
source§

impl<T: ?Sized> Deref for Arc<T>

§

type Target = T

The resulting type after dereferencing.
source§

fn deref(&self) -> &T

Dereferences the value.
source§

impl<'de, T: Deserialize<'de>> Deserialize<'de> for Arc<T>

source§

fn deserialize<D>(deserializer: D) -> Result<Arc<T>, D::Error>where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<T: ?Sized + Display> Display for Arc<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T: ?Sized> Drop for Arc<T>

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<T> From<T> for Arc<T>

source§

fn from(t: T) -> Self

Converts to this type from the input type.
source§

impl<T: ?Sized + Hash> Hash for Arc<T>

source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<T: ?Sized + Ord> Ord for Arc<T>

source§

fn cmp(&self, other: &Arc<T>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere Self: Sized + PartialOrd<Self>,

Restrict a value to a certain interval. Read more
source§

impl<T: ?Sized + PartialEq> PartialEq<Arc<T>> for Arc<T>

source§

fn eq(&self, other: &Arc<T>) -> bool

This method tests for self and other values to be equal, and is used by ==.
source§

fn ne(&self, other: &Arc<T>) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<T: ?Sized + PartialOrd> PartialOrd<Arc<T>> for Arc<T>

source§

fn partial_cmp(&self, other: &Arc<T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
source§

fn lt(&self, other: &Arc<T>) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
source§

fn le(&self, other: &Arc<T>) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
source§

fn gt(&self, other: &Arc<T>) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
source§

fn ge(&self, other: &Arc<T>) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl<T: ?Sized> Pointer for Arc<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter.
source§

impl<T: Serialize> Serialize for Arc<T>

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>where S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<T: ?Sized> CloneStableDeref for Arc<T>

source§

impl<T: ?Sized + Eq> Eq for Arc<T>

source§

impl<T: ?Sized + Sync + Send> Send for Arc<T>

source§

impl<T: ?Sized> StableDeref for Arc<T>

source§

impl<T: ?Sized + Sync + Send> Sync for Arc<T>