mmtk/util/metadata/
log_bit.rs1use crate::util::Address;
2use crate::util::ObjectReference;
3use crate::vm::ObjectModel;
4use crate::vm::VMBinding;
5use crate::vm::VMGlobalLogBitSpec;
6use std::sync::atomic::Ordering;
7
8use super::MetadataSpec;
9
10impl VMGlobalLogBitSpec {
11 pub fn clear<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
13 self.store_atomic::<VM, u8>(object, 0, None, order)
14 }
15
16 pub fn mark_as_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
18 self.store_atomic::<VM, u8>(object, 1, None, order)
19 }
20
21 pub fn mark_byte_as_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
26 match self.as_spec() {
27 MetadataSpec::InHeader(_) => self.mark_as_unlogged::<VM>(object, order),
29 MetadataSpec::OnSide(spec) => unsafe {
33 spec.set_raw_byte_atomic(object.to_raw_address(), order)
34 },
35 }
36 }
37
38 pub fn is_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) -> bool {
40 self.load_atomic::<VM, u8>(object, None, order) == 1
41 }
42}
43
44#[derive(Clone, Copy, PartialEq, Eq)]
46pub(crate) enum UnlogBitsOperation {
47 NoOp,
49 BulkSet,
51 BulkClear,
53}
54
55impl UnlogBitsOperation {
56 pub(crate) fn execute<VM: VMBinding>(&self, start: Address, size: usize) {
58 if let MetadataSpec::OnSide(ref unlog_bits) = *VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC {
59 match self {
60 UnlogBitsOperation::NoOp => {}
61 UnlogBitsOperation::BulkSet => {
62 unlog_bits.bset_metadata(start, size);
63 }
64 UnlogBitsOperation::BulkClear => {
65 unlog_bits.bzero_metadata(start, size);
66 }
67 }
68 }
69 }
70}