Struct mmtk::vm::object_model::specs::VMLocalMarkBitSpec
source · pub struct VMLocalMarkBitSpec(MetadataSpec);
Expand description
1-bit local metadata for spaces that need to mark an object.
Tuple Fields§
§0: MetadataSpec
Implementations§
source§impl VMLocalMarkBitSpec
impl VMLocalMarkBitSpec
sourcepub const LOG_NUM_BITS: usize = 0usize
pub const LOG_NUM_BITS: usize = 0usize
The number of bits (in log2) that are needed for the spec.
sourcepub const IS_GLOBAL: bool = false
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.
sourcepub const fn in_header(bit_offset: isize) -> Self
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).
sourcepub const fn side_first() -> Self
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.
sourcepub const fn side_after(spec: &MetadataSpec) -> Self
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.
sourcepub const fn as_spec(&self) -> &MetadataSpec
pub const fn as_spec(&self) -> &MetadataSpec
Return the inner [crate::util::metadata::MetadataSpec]
for the metadata type.
Methods from Deref<Target = MetadataSpec>§
sourcepub fn is_on_side(&self) -> bool
pub fn is_on_side(&self) -> bool
Is this metadata stored in the side table?
sourcepub fn is_in_header(&self) -> bool
pub fn is_in_header(&self) -> bool
Is this metadata stored in the object header?
sourcepub fn extract_side_spec(&self) -> &SideMetadataSpec
pub fn extract_side_spec(&self) -> &SideMetadataSpec
Extract SideMetadataSpec from a MetadataSpec. Panics if this is not side metadata.
sourcepub unsafe fn load<VM: VMBinding, T: MetadataValue>(
&self,
object: ObjectReference,
mask: Option<T>
) -> T
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.
sourcepub fn load_atomic<VM: VMBinding, T: MetadataValue>(
&self,
object: ObjectReference,
mask: Option<T>,
ordering: Ordering
) -> T
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.
sourcepub unsafe fn store<VM: VMBinding, T: MetadataValue>(
&self,
object: ObjectReference,
val: T,
mask: Option<T>
)
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.
sourcepub fn store_atomic<VM: VMBinding, T: MetadataValue>(
&self,
object: ObjectReference,
val: T,
mask: Option<T>,
ordering: Ordering
)
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.
sourcepub 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>
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.
sourcepub fn fetch_add_metadata<VM: VMBinding, T: MetadataValue>(
&self,
object: ObjectReference,
val: T,
order: Ordering
) -> T
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.
sourcepub fn fetch_sub_metadata<VM: VMBinding, T: MetadataValue>(
&self,
object: ObjectReference,
val: T,
order: Ordering
) -> T
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.
sourcepub fn fetch_and_metadata<VM: VMBinding, T: MetadataValue>(
&self,
object: ObjectReference,
val: T,
order: Ordering
) -> T
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.
sourcepub fn fetch_or_metadata<VM: VMBinding, T: MetadataValue>(
&self,
object: ObjectReference,
val: T,
order: Ordering
) -> T
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.
sourcepub 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>
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§
Auto Trait Implementations§
impl RefUnwindSafe for VMLocalMarkBitSpec
impl Send for VMLocalMarkBitSpec
impl Sync for VMLocalMarkBitSpec
impl Unpin for VMLocalMarkBitSpec
impl UnwindSafe for VMLocalMarkBitSpec
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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
impl<T> DowncastSync for T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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