Skip to content

Commit a1e71be

Browse files
committed
Add clear/set_side_log_bits to trait Space
1 parent 54ab35b commit a1e71be

File tree

11 files changed

+137
-90
lines changed

11 files changed

+137
-90
lines changed

src/policy/compressor/compressorspace.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,14 @@ impl<VM: VMBinding> Space<VM> for CompressorSpace<VM> {
146146
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator) {
147147
object_enum::enumerate_blocks_from_monotonic_page_resource(enumerator, &self.pr);
148148
}
149+
150+
fn clear_side_log_bits(&self) {
151+
unimplemented!()
152+
}
153+
154+
fn set_side_log_bits(&self) {
155+
unimplemented!()
156+
}
149157
}
150158

151159
impl<VM: VMBinding> crate::policy::gc_work::PolicyTraceObject<VM> for CompressorSpace<VM> {

src/policy/copyspace.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,20 @@ impl<VM: VMBinding> Space<VM> for CopySpace<VM> {
143143
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator) {
144144
object_enum::enumerate_blocks_from_monotonic_page_resource(enumerator, &self.pr);
145145
}
146+
147+
fn clear_side_log_bits(&self) {
148+
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
149+
for (start, size) in self.pr.iterate_allocated_regions() {
150+
log_bit.bzero_metadata(start, size);
151+
}
152+
}
153+
154+
fn set_side_log_bits(&self) {
155+
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
156+
for (start, size) in self.pr.iterate_allocated_regions() {
157+
log_bit.bset_metadata(start, size);
158+
}
159+
}
146160
}
147161

148162
impl<VM: VMBinding> crate::policy::gc_work::PolicyTraceObject<VM> for CopySpace<VM> {
@@ -212,20 +226,6 @@ impl<VM: VMBinding> CopySpace<VM> {
212226
self.from_space.store(false, Ordering::SeqCst);
213227
}
214228

215-
pub fn clear_side_log_bits(&self) {
216-
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
217-
for (start, size) in self.pr.iterate_allocated_regions() {
218-
log_bit.bzero_metadata(start, size);
219-
}
220-
}
221-
222-
pub fn set_side_log_bits(&self) {
223-
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
224-
for (start, size) in self.pr.iterate_allocated_regions() {
225-
log_bit.bset_metadata(start, size);
226-
}
227-
}
228-
229229
fn is_from_space(&self) -> bool {
230230
self.from_space.load(Ordering::SeqCst)
231231
}

src/policy/immix/immixspace.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,20 @@ impl<VM: VMBinding> Space<VM> for ImmixSpace<VM> {
195195
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator) {
196196
object_enum::enumerate_blocks_from_chunk_map::<Block>(enumerator, &self.chunk_map);
197197
}
198+
199+
fn clear_side_log_bits(&self) {
200+
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
201+
for chunk in self.chunk_map.all_chunks() {
202+
log_bit.bzero_metadata(chunk.start(), Chunk::BYTES);
203+
}
204+
}
205+
206+
fn set_side_log_bits(&self) {
207+
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
208+
for chunk in self.chunk_map.all_chunks() {
209+
log_bit.bset_metadata(chunk.start(), Chunk::BYTES);
210+
}
211+
}
198212
}
199213

200214
impl<VM: VMBinding> crate::policy::gc_work::PolicyTraceObject<VM> for ImmixSpace<VM> {
@@ -513,21 +527,6 @@ impl<VM: VMBinding> ImmixSpace<VM> {
513527
did_defrag
514528
}
515529

516-
pub fn clear_side_log_bits(&self) {
517-
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
518-
for chunk in self.chunk_map.all_chunks() {
519-
log_bit.bzero_metadata(chunk.start(), Chunk::BYTES);
520-
}
521-
}
522-
523-
#[allow(dead_code)]
524-
pub fn set_side_log_bits(&self) {
525-
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
526-
for chunk in self.chunk_map.all_chunks() {
527-
log_bit.bset_metadata(chunk.start(), Chunk::BYTES);
528-
}
529-
}
530-
531530
/// Generate chunk sweep tasks
532531
fn generate_sweep_tasks(&self) -> Vec<Box<dyn GCWork<VM>>> {
533532
self.defrag.mark_histograms.lock().clear();
@@ -699,6 +698,8 @@ impl<VM: VMBinding> ImmixSpace<VM> {
699698
self.mark_lines(object);
700699
}
701700

701+
self.unlog_object_if_needed(object);
702+
702703
object
703704
} else {
704705
// We are forwarding objects. When the copy allocator allocates the block, it should
@@ -709,6 +710,13 @@ impl<VM: VMBinding> ImmixSpace<VM> {
709710
semantics,
710711
copy_context,
711712
|_new_object| {
713+
// post_copy should have set the unlog bit
714+
// if `unlog_traced_object` is true.
715+
debug_assert!(
716+
!self.common.unlog_traced_object
717+
|| VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC
718+
.is_unlogged::<VM>(object, Ordering::Relaxed)
719+
);
712720
#[cfg(feature = "vo_bit")]
713721
vo_bit::helper::on_object_forwarded::<VM>(_new_object);
714722
},
@@ -721,7 +729,6 @@ impl<VM: VMBinding> ImmixSpace<VM> {
721729

722730
queue.enqueue(new_object);
723731
debug_assert!(new_object.is_live());
724-
self.unlog_object_if_needed(new_object);
725732
new_object
726733
}
727734
}

src/policy/immortalspace.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,20 @@ impl<VM: VMBinding> Space<VM> for ImmortalSpace<VM> {
115115
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator) {
116116
object_enum::enumerate_blocks_from_monotonic_page_resource(enumerator, &self.pr);
117117
}
118+
119+
fn clear_side_log_bits(&self) {
120+
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
121+
for (start, size) in self.pr.iterate_allocated_regions() {
122+
log_bit.bzero_metadata(start, size);
123+
}
124+
}
125+
126+
fn set_side_log_bits(&self) {
127+
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
128+
for (start, size) in self.pr.iterate_allocated_regions() {
129+
log_bit.bset_metadata(start, size);
130+
}
131+
}
118132
}
119133

120134
use crate::scheduler::GCWorker;
@@ -173,20 +187,6 @@ impl<VM: VMBinding> ImmortalSpace<VM> {
173187
self.mark_state.on_global_release::<VM>();
174188
}
175189

176-
pub fn clear_side_log_bits(&self) {
177-
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
178-
for (start, size) in self.pr.iterate_allocated_regions() {
179-
log_bit.bzero_metadata(start, size);
180-
}
181-
}
182-
183-
pub fn set_side_log_bits(&self) {
184-
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
185-
for (start, size) in self.pr.iterate_allocated_regions() {
186-
log_bit.bset_metadata(start, size);
187-
}
188-
}
189-
190190
pub fn trace_object<Q: ObjectQueue>(
191191
&self,
192192
queue: &mut Q,

src/policy/largeobjectspace.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,22 @@ impl<VM: VMBinding> Space<VM> for LargeObjectSpace<VM> {
194194
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator) {
195195
self.treadmill.enumerate_objects(enumerator);
196196
}
197+
198+
fn clear_side_log_bits(&self) {
199+
let mut enumator = ClosureObjectEnumerator::<_, VM>::new(|object| {
200+
VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.clear::<VM>(object, Ordering::SeqCst);
201+
});
202+
self.treadmill.enumerate_objects(&mut enumator);
203+
}
204+
205+
fn set_side_log_bits(&self) {
206+
debug_assert!(self.treadmill.is_from_space_empty());
207+
debug_assert!(self.treadmill.is_nursery_empty());
208+
let mut enumator = ClosureObjectEnumerator::<_, VM>::new(|object| {
209+
VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.mark_as_unlogged::<VM>(object, Ordering::SeqCst);
210+
});
211+
self.treadmill.enumerate_objects(&mut enumator);
212+
}
197213
}
198214

199215
use crate::scheduler::GCWorker;
@@ -247,22 +263,6 @@ impl<VM: VMBinding> LargeObjectSpace<VM> {
247263
}
248264
}
249265

250-
pub fn clear_side_log_bits(&self) {
251-
let mut enumator = ClosureObjectEnumerator::<_, VM>::new(|object| {
252-
VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.clear::<VM>(object, Ordering::SeqCst);
253-
});
254-
self.treadmill.enumerate_objects(&mut enumator);
255-
}
256-
257-
pub fn set_side_log_bits(&self) {
258-
debug_assert!(self.treadmill.is_from_space_empty());
259-
debug_assert!(self.treadmill.is_nursery_empty());
260-
let mut enumator = ClosureObjectEnumerator::<_, VM>::new(|object| {
261-
VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.mark_as_unlogged::<VM>(object, Ordering::SeqCst);
262-
});
263-
self.treadmill.enumerate_objects(&mut enumator);
264-
}
265-
266266
pub fn prepare(&mut self, full_heap: bool) {
267267
if full_heap {
268268
debug_assert!(self.treadmill.is_from_space_empty());

src/policy/lockfreeimmortalspace.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,14 @@ impl<VM: VMBinding> Space<VM> for LockFreeImmortalSpace<VM> {
181181
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator) {
182182
enumerator.visit_address_range(self.start, self.start + self.total_bytes);
183183
}
184+
185+
fn clear_side_log_bits(&self) {
186+
unimplemented!()
187+
}
188+
189+
fn set_side_log_bits(&self) {
190+
unimplemented!()
191+
}
184192
}
185193

186194
use crate::plan::{ObjectQueue, VectorObjectQueue};

src/policy/markcompactspace.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,14 @@ impl<VM: VMBinding> Space<VM> for MarkCompactSpace<VM> {
143143
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator) {
144144
object_enum::enumerate_blocks_from_monotonic_page_resource(enumerator, &self.pr);
145145
}
146+
147+
fn clear_side_log_bits(&self) {
148+
unimplemented!()
149+
}
150+
151+
fn set_side_log_bits(&self) {
152+
unimplemented!()
153+
}
146154
}
147155

148156
impl<VM: VMBinding> crate::policy::gc_work::PolicyTraceObject<VM> for MarkCompactSpace<VM> {

src/policy/marksweepspace/malloc_ms/global.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,14 @@ impl<VM: VMBinding> Space<VM> for MallocSpace<VM> {
241241
fn enumerate_objects(&self, _enumerator: &mut dyn ObjectEnumerator) {
242242
unimplemented!()
243243
}
244+
245+
fn clear_side_log_bits(&self) {
246+
unimplemented!()
247+
}
248+
249+
fn set_side_log_bits(&self) {
250+
unimplemented!()
251+
}
244252
}
245253

246254
use crate::scheduler::GCWorker;

src/policy/marksweepspace/native_ms/global.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,20 @@ impl<VM: VMBinding> Space<VM> for MarkSweepSpace<VM> {
254254
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator) {
255255
object_enum::enumerate_blocks_from_chunk_map::<Block>(enumerator, &self.chunk_map);
256256
}
257+
258+
fn clear_side_log_bits(&self) {
259+
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
260+
for chunk in self.chunk_map.all_chunks() {
261+
log_bit.bzero_metadata(chunk.start(), Chunk::BYTES);
262+
}
263+
}
264+
265+
fn set_side_log_bits(&self) {
266+
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
267+
for chunk in self.chunk_map.all_chunks() {
268+
log_bit.bset_metadata(chunk.start(), Chunk::BYTES);
269+
}
270+
}
257271
}
258272

259273
impl<VM: VMBinding> crate::policy::gc_work::PolicyTraceObject<VM> for MarkSweepSpace<VM> {
@@ -419,20 +433,6 @@ impl<VM: VMBinding> MarkSweepSpace<VM> {
419433
.bulk_add(work_packets);
420434
}
421435

422-
pub fn clear_side_log_bits(&self) {
423-
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
424-
for chunk in self.chunk_map.all_chunks() {
425-
log_bit.bzero_metadata(chunk.start(), Chunk::BYTES);
426-
}
427-
}
428-
429-
pub fn set_side_log_bits(&self) {
430-
let log_bit = VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC.extract_side_spec();
431-
for chunk in self.chunk_map.all_chunks() {
432-
log_bit.bset_metadata(chunk.start(), Chunk::BYTES);
433-
}
434-
}
435-
436436
pub fn release(&mut self) {
437437
let num_mutators = VM::VMActivePlan::number_of_mutators();
438438
// all ReleaseMutator work packets plus the ReleaseMarkSweepSpace packet

src/policy/space.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,14 @@ pub trait Space<VM: VMBinding>: 'static + SFT + Sync + Downcast {
433433
/// the execution time. For LOS, it will be cheaper to enumerate individual objects than
434434
/// scanning VO bits because it is sparse.
435435
fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator);
436+
437+
/// Clear the side log bits for allocated regions in this space.
438+
/// This method is only called if the plan knows the log bits are side metadata.
439+
fn clear_side_log_bits(&self);
440+
441+
/// Set the side log bits for allocated regions in this space.
442+
/// This method is only called if the plan knows the log bits are side metadata.
443+
fn set_side_log_bits(&self);
436444
}
437445

438446
/// Print the VM map for a space.

0 commit comments

Comments
 (0)