use crate::util::Address;
use crate::util::ObjectReference;
use crate::vm::ObjectModel;
use crate::vm::VMBinding;
use crate::vm::VMGlobalLogBitSpec;
use std::sync::atomic::Ordering;
use super::MetadataSpec;
impl VMGlobalLogBitSpec {
pub fn clear<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
self.store_atomic::<VM, u8>(object, 0, None, order)
}
pub fn mark_as_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
self.store_atomic::<VM, u8>(object, 1, None, order)
}
pub fn mark_byte_as_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) {
match self.as_spec() {
MetadataSpec::InHeader(_) => self.mark_as_unlogged::<VM>(object, order),
MetadataSpec::OnSide(spec) => unsafe {
spec.set_raw_byte_atomic(object.to_raw_address(), order)
},
}
}
pub fn is_unlogged<VM: VMBinding>(&self, object: ObjectReference, order: Ordering) -> bool {
self.load_atomic::<VM, u8>(object, None, order) == 1
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub(crate) enum UnlogBitsOperation {
NoOp,
BulkSet,
BulkClear,
}
impl UnlogBitsOperation {
pub(crate) fn execute<VM: VMBinding>(&self, start: Address, size: usize) {
if let MetadataSpec::OnSide(ref unlog_bits) = *VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC {
match self {
UnlogBitsOperation::NoOp => {}
UnlogBitsOperation::BulkSet => {
unlog_bits.bset_metadata(start, size);
}
UnlogBitsOperation::BulkClear => {
unlog_bits.bzero_metadata(start, size);
}
}
}
}
}