pub struct VMLocalForwardingPointerSpec(MetadataSpec);
Expand description

1-word local metadata for spaces that may copy objects. This metadata has to be stored in the header. This metadata can be defined at a position within the object payload. As a forwarding pointer is only stored in dead objects which is not accessible by the language, it is okay that store a forwarding pointer overwrites object payload

Tuple Fields§

§0: MetadataSpec

Implementations§

source§

impl VMLocalForwardingPointerSpec

source

pub const LOG_NUM_BITS: usize = 6usize

The number of bits (in log2) that are needed for the spec.

source

pub const IS_GLOBAL: bool = false

Whether this spec is global or local. For side metadata, the binding needs to make sure global specs are laid out after another global spec, and local specs are laid out after another local spec. Otherwise, there will be an assertion failure.

source

pub const fn in_header(bit_offset: isize) -> Self

Declare that the VM uses in-header metadata for this metadata type. For the specification of the bit_offset argument, please refer to the document of [crate::util::metadata::header_metadata::HeaderMetadataSpec.bit_offset]. The binding needs to make sure that the bits used for a spec in the header do not conflict with the bits of another spec (unless it is specified that some bits may be reused).

source

pub const fn side_first() -> Self

Declare that the VM uses side metadata for this metadata type, and the side metadata is the first of its kind (global or local). The first global or local side metadata should be declared with side_first(), and the rest side metadata should be declared with side_after() after a defined side metadata of the same kind (global or local). Logically, all the declarations create two list of side metadata, one for global, and one for local.

source

pub const fn side_after(spec: &MetadataSpec) -> Self

Declare that the VM uses side metadata for this metadata type, and the side metadata should be laid out after the given side metadata spec. The first global or local side metadata should be declared with side_first(), and the rest side metadata should be declared with side_after() after a defined side metadata of the same kind (global or local). Logically, all the declarations create two list of side metadata, one for global, and one for local.

source

pub const fn as_spec(&self) -> &MetadataSpec

Return the inner [crate::util::metadata::MetadataSpec] for the metadata type.

source

pub const fn num_bits(&self) -> usize

Return the number of bits for the metadata type.

Methods from Deref<Target = MetadataSpec>§

source

pub fn is_on_side(&self) -> bool

Is this metadata stored in the side table?

source

pub fn is_in_header(&self) -> bool

Is this metadata stored in the object header?

source

pub fn extract_side_spec(&self) -> &SideMetadataSpec

Extract SideMetadataSpec from a MetadataSpec. Panics if this is not side metadata.

source

pub unsafe fn load<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, mask: Option<T> ) -> T

A function to non-atomically load the specified metadata’s content. Returns the metadata value.

§Arguments:
  • object: is a reference to the target object.
  • mask: is an optional mask value for the metadata. This value is used in cases like the forwarding pointer metadata, where some of the bits are reused by other metadata such as the forwarding bits.
§Safety

This is a non-atomic load, thus not thread-safe.

source

pub fn load_atomic<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, mask: Option<T>, ordering: Ordering ) -> T

A function to atomically load the specified metadata’s content. Returns the metadata value.

§Arguments:
  • object: is a reference to the target object.
  • mask: is an optional mask value for the metadata. This value is used in cases like the forwarding pointer metadata, where some of the bits are reused by other metadata such as the forwarding bits.
  • atomic_ordering: is the ordering for the load operation.
source

pub unsafe fn store<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, val: T, mask: Option<T> )

A function to non-atomically store a value to the specified metadata.

§Arguments:
  • object: is a reference to the target object.
  • val: is the new metadata value to be stored.
  • mask: is an optional mask value for the metadata. This value is used in cases like the forwarding pointer metadata, where some of the bits are reused by other metadata such as the forwarding bits.
§Safety

This is a non-atomic store, thus not thread-safe.

source

pub fn store_atomic<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, val: T, mask: Option<T>, ordering: Ordering )

A function to atomically store a value to the specified metadata.

§Arguments:
  • object: is a reference to the target object.
  • val: is the new metadata value to be stored.
  • mask: is an optional mask value for the metadata. This value is used in cases like the forwarding pointer metadata, where some of the bits are reused by other metadata such as the forwarding bits.
  • ordering: is the ordering for the store operation.
source

pub fn compare_exchange_metadata<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, old_val: T, new_val: T, mask: Option<T>, success_order: Ordering, failure_order: Ordering ) -> Result<T, T>

A function to atomically compare-and-exchange the specified metadata’s content. Returns true if the operation is successful, and false otherwise.

§Arguments:
  • object: is a reference to the target object.
  • old_val: is the expected current value of the metadata.
  • new_val: is the new metadata value to be stored if the compare-and-exchange operation is successful.
  • mask: is an optional mask value for the metadata. This value is used in cases like the forwarding pointer metadata, where some of the bits are reused by other metadata such as the forwarding bits.
  • success_order: is the atomic ordering used if the operation is successful.
  • failure_order: is the atomic ordering used if the operation fails.
source

pub fn fetch_add_metadata<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, val: T, order: Ordering ) -> T

A function to atomically perform an add operation on the specified metadata’s content. Returns the old metadata value.

§Arguments:
  • object: is a reference to the target object.
  • val: is the value to be added to the current value of the metadata.
  • order: is the atomic ordering of the fetch-and-add operation.
source

pub fn fetch_sub_metadata<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, val: T, order: Ordering ) -> T

A function to atomically perform a subtract operation on the specified metadata’s content. Returns the old metadata value.

§Arguments:
  • object: is a reference to the target object.
  • val: is the value to be subtracted from the current value of the metadata.
  • order: is the atomic ordering of the fetch-and-add operation.
source

pub fn fetch_and_metadata<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, val: T, order: Ordering ) -> T

A function to atomically perform a bit-and operation on the specified metadata’s content. Returns the old metadata value.

§Arguments:
  • object: is a reference to the target object.
  • val: is the value to bit-and with the current value of the metadata.
  • order: is the atomic ordering of the fetch-and-add operation.
source

pub fn fetch_or_metadata<VM: VMBinding, T: MetadataValue>( &self, object: ObjectReference, val: T, order: Ordering ) -> T

A function to atomically perform a bit-or operation on the specified metadata’s content. Returns the old metadata value.

§Arguments:
  • object: is a reference to the target object.
  • val: is the value to bit-or with the current value of the metadata.
  • order: is the atomic ordering of the fetch-and-add operation.
source

pub fn fetch_update_metadata<VM: VMBinding, T: MetadataValue, F: FnMut(T) -> Option<T> + Copy>( &self, object: ObjectReference, set_order: Ordering, fetch_order: Ordering, f: F ) -> Result<T, T>

A function to atomically perform an update operation on the specified metadata’s content. The semantics are the same as Rust’s fetch_update on atomic types. Returns a Result of Ok(previous_value) if the function returned Some(_), else Err(previous_value).

§Arguments:
  • object: is a reference to the target object.
  • val: is the value to bit-or with the current value of the metadata.
  • order: is the atomic ordering of the fetch-and-add operation.
  • f: the update function. The function may be called multiple times.

Trait Implementations§

source§

impl Deref for VMLocalForwardingPointerSpec

§

type Target = MetadataSpec

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.