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
10pub const UNLOGGED_VALUE: u8 = 0b1;
13
14pub const LOGGED_VALUE: u8 = 0b0;
17
18impl VMGlobalLogBitSpec {
19 pub fn clear<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
21 self.store_atomic::<VM, u8>(object, LOGGED_VALUE, None, order)
22 }
23
24 pub fn bulk_mark_as_logged(&self, start: Address, size: usize) {
26 if let MetadataSpec::OnSide(side) = self.as_spec() {
27 side.bzero_metadata(start, size);
28 }
29 }
30
31 pub fn mark_as_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
33 self.store_atomic::<VM, u8>(object, UNLOGGED_VALUE, None, order)
34 }
35
36 pub fn mark_byte_as_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
41 match self.as_spec() {
42 MetadataSpec::InHeader(_) => self.mark_as_unlogged::<VM>(object, order),
44 MetadataSpec::OnSide(spec) => unsafe {
48 spec.set_raw_byte_atomic(object.to_raw_address(), order)
49 },
50 }
51 }
52
53 pub fn is_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) -> bool {
55 self.load_atomic::<VM, u8>(object, None, order) == UNLOGGED_VALUE
56 }
57}
58
59impl MetadataSpec {
60 pub fn mark_as_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
62 self.store_atomic::<VM, u8>(object, UNLOGGED_VALUE, None, order)
63 }
64}
65
66#[derive(Clone, Copy, PartialEq, Eq)]
68pub(crate) enum UnlogBitsOperation {
69 NoOp,
71 BulkSet,
73 BulkClear,
75}
76
77impl UnlogBitsOperation {
78 pub(crate) fn execute<VM: VMBinding>(&self, start: Address, size: usize) {
80 if let MetadataSpec::OnSide(ref unlog_bits) = *VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC {
81 match self {
82 UnlogBitsOperation::NoOp => {}
83 UnlogBitsOperation::BulkSet => {
84 unlog_bits.bset_metadata(start, size);
85 }
86 UnlogBitsOperation::BulkClear => {
87 unlog_bits.bzero_metadata(start, size);
88 }
89 }
90 }
91 }
92}