Skip to content

Commit 68afecc

Browse files
committed
Run mutator prepare/release for plans that use CommonPlan
1 parent d15768a commit 68afecc

File tree

15 files changed

+76
-37
lines changed

15 files changed

+76
-37
lines changed

docs/userguide/src/tutorial/code/mygc_semispace/mutator.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ use enum_map::EnumMap;
1919

2020
// Add
2121
pub fn mygc_mutator_prepare<VM: VMBinding>(
22-
_mutator: &mut Mutator<VM>,
23-
_tls: VMWorkerThread,
22+
mutator: &mut Mutator<VM>,
23+
tls: VMWorkerThread,
2424
) {
25-
// Do nothing
25+
crate::plan::mutator_context::common_prepare_func::<VM>(mutator, tls);
2626
}
2727

2828
// Add
2929
// ANCHOR: release
3030
pub fn mygc_mutator_release<VM: VMBinding>(
3131
mutator: &mut Mutator<VM>,
32-
_tls: VMWorkerThread,
32+
tls: VMWorkerThread,
3333
) {
3434
// rebind the allocation bump pointer to the appropriate semispace
3535
let bump_allocator = unsafe {
@@ -46,6 +46,8 @@ pub fn mygc_mutator_release<VM: VMBinding>(
4646
.unwrap()
4747
.tospace(),
4848
);
49+
50+
crate::plan::mutator_context::common_release_func::<VM>(mutator, tls);
4951
}
5052
// ANCHOR_END: release
5153

src/plan/generational/copying/mutator.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ use super::GenCopy;
33
use crate::plan::barriers::ObjectBarrier;
44
use crate::plan::generational::barrier::GenObjectBarrierSemantics;
55
use crate::plan::generational::create_gen_space_mapping;
6-
use crate::plan::mutator_context::unreachable_prepare_func;
76
use crate::plan::mutator_context::Mutator;
87
use crate::plan::mutator_context::MutatorConfig;
8+
use crate::plan::mutator_context::{common_prepare_func, common_release_func};
99
use crate::plan::AllocationSemantics;
1010
use crate::util::alloc::allocators::Allocators;
1111
use crate::util::alloc::BumpAllocator;
1212
use crate::util::{VMMutatorThread, VMWorkerThread};
1313
use crate::vm::VMBinding;
1414
use crate::MMTK;
1515

16-
pub fn gencopy_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {
16+
pub fn gencopy_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, tls: VMWorkerThread) {
1717
// reset nursery allocator
1818
let bump_allocator = unsafe {
1919
mutator
@@ -23,6 +23,8 @@ pub fn gencopy_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: V
2323
.downcast_mut::<BumpAllocator<VM>>()
2424
.unwrap();
2525
bump_allocator.reset();
26+
27+
common_release_func(mutator, tls);
2628
}
2729

2830
pub fn create_gencopy_mutator<VM: VMBinding>(
@@ -36,7 +38,7 @@ pub fn create_gencopy_mutator<VM: VMBinding>(
3638
mmtk.get_plan(),
3739
&gencopy.gen.nursery,
3840
)),
39-
prepare_func: &unreachable_prepare_func,
41+
prepare_func: &common_prepare_func,
4042
release_func: &gencopy_mutator_release,
4143
};
4244

src/plan/generational/immix/mutator.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ use crate::plan::barriers::ObjectBarrier;
33
use crate::plan::generational::barrier::GenObjectBarrierSemantics;
44
use crate::plan::generational::create_gen_space_mapping;
55
use crate::plan::generational::immix::GenImmix;
6-
use crate::plan::mutator_context::unreachable_prepare_func;
76
use crate::plan::mutator_context::Mutator;
87
use crate::plan::mutator_context::MutatorConfig;
8+
use crate::plan::mutator_context::{common_prepare_func, common_release_func};
99
use crate::plan::AllocationSemantics;
1010
use crate::util::alloc::allocators::Allocators;
1111
use crate::util::alloc::BumpAllocator;
1212
use crate::util::{VMMutatorThread, VMWorkerThread};
1313
use crate::vm::VMBinding;
1414
use crate::MMTK;
1515

16-
pub fn genimmix_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {
16+
pub fn genimmix_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, tls: VMWorkerThread) {
1717
// reset nursery allocator
1818
let bump_allocator = unsafe {
1919
mutator
@@ -23,6 +23,8 @@ pub fn genimmix_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls:
2323
.downcast_mut::<BumpAllocator<VM>>()
2424
.unwrap();
2525
bump_allocator.reset();
26+
27+
common_release_func(mutator, tls);
2628
}
2729

2830
pub fn create_genimmix_mutator<VM: VMBinding>(
@@ -36,7 +38,7 @@ pub fn create_genimmix_mutator<VM: VMBinding>(
3638
mmtk.get_plan(),
3739
&genimmix.gen.nursery,
3840
)),
39-
prepare_func: &unreachable_prepare_func,
41+
prepare_func: &common_prepare_func,
4042
release_func: &genimmix_mutator_release,
4143
};
4244

src/plan/generational/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ pub const GEN_CONSTRAINTS: PlanConstraints = PlanConstraints {
5252
crate::plan::plan_constraints::MAX_NON_LOS_ALLOC_BYTES_COPYING_PLAN,
5353
crate::util::options::NURSERY_SIZE,
5454
),
55-
needs_prepare_mutator: false,
5655
..PlanConstraints::default()
5756
};
5857

src/plan/immix/global.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ pub const IMMIX_CONSTRAINTS: PlanConstraints = PlanConstraints {
4141
moves_objects: crate::policy::immix::DEFRAG,
4242
// Max immix object size is half of a block.
4343
max_non_los_default_alloc_bytes: crate::policy::immix::MAX_IMMIX_OBJECT_SIZE,
44-
needs_prepare_mutator: false,
4544
..PlanConstraints::default()
4645
};
4746

src/plan/immix/mutator.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use super::Immix;
22
use crate::plan::mutator_context::create_allocator_mapping;
33
use crate::plan::mutator_context::create_space_mapping;
4-
use crate::plan::mutator_context::unreachable_prepare_func;
54
use crate::plan::mutator_context::Mutator;
65
use crate::plan::mutator_context::MutatorConfig;
76
use crate::plan::mutator_context::ReservedAllocators;
7+
use crate::plan::mutator_context::{common_prepare_func, common_release_func};
88
use crate::plan::AllocationSemantics;
99
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
1010
use crate::util::alloc::ImmixAllocator;
@@ -16,7 +16,7 @@ use crate::{
1616
};
1717
use enum_map::EnumMap;
1818

19-
pub fn immix_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {
19+
pub fn immix_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, tls: VMWorkerThread) {
2020
let immix_allocator = unsafe {
2121
mutator
2222
.allocators
@@ -25,6 +25,8 @@ pub fn immix_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMW
2525
.downcast_mut::<ImmixAllocator<VM>>()
2626
.unwrap();
2727
immix_allocator.reset();
28+
29+
common_release_func(mutator, tls)
2830
}
2931

3032
pub(in crate::plan) const RESERVED_ALLOCATORS: ReservedAllocators = ReservedAllocators {
@@ -52,7 +54,7 @@ pub fn create_immix_mutator<VM: VMBinding>(
5254
vec.push((AllocatorSelector::Immix(0), &immix.immix_space));
5355
vec
5456
}),
55-
prepare_func: &unreachable_prepare_func,
57+
prepare_func: &common_prepare_func,
5658
release_func: &immix_mutator_release,
5759
};
5860

src/plan/markcompact/global.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ pub const MARKCOMPACT_CONSTRAINTS: PlanConstraints = PlanConstraints {
4242
needs_forward_after_liveness: true,
4343
max_non_los_default_alloc_bytes:
4444
crate::plan::plan_constraints::MAX_NON_LOS_ALLOC_BYTES_COPYING_PLAN,
45-
needs_prepare_mutator: false,
4645
..PlanConstraints::default()
4746
};
4847

src/plan/markcompact/mutator.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ use super::MarkCompact;
22
use crate::plan::barriers::NoBarrier;
33
use crate::plan::mutator_context::create_allocator_mapping;
44
use crate::plan::mutator_context::create_space_mapping;
5-
use crate::plan::mutator_context::unreachable_prepare_func;
65
use crate::plan::mutator_context::Mutator;
76
use crate::plan::mutator_context::MutatorConfig;
87
use crate::plan::mutator_context::ReservedAllocators;
8+
use crate::plan::mutator_context::{common_prepare_func, common_release_func};
99
use crate::plan::AllocationSemantics;
1010
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
1111
use crate::util::alloc::MarkCompactAllocator;
@@ -39,7 +39,7 @@ pub fn create_markcompact_mutator<VM: VMBinding>(
3939
vec.push((AllocatorSelector::MarkCompact(0), markcompact.mc_space()));
4040
vec
4141
}),
42-
prepare_func: &unreachable_prepare_func,
42+
prepare_func: &common_prepare_func,
4343
release_func: &markcompact_mutator_release,
4444
};
4545

@@ -52,17 +52,16 @@ pub fn create_markcompact_mutator<VM: VMBinding>(
5252
}
5353
}
5454

55-
pub fn markcompact_mutator_release<VM: VMBinding>(
56-
_mutator: &mut Mutator<VM>,
57-
_tls: VMWorkerThread,
58-
) {
55+
pub fn markcompact_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, tls: VMWorkerThread) {
5956
// reset the thread-local allocation bump pointer
6057
let markcompact_allocator = unsafe {
61-
_mutator
58+
mutator
6259
.allocators
63-
.get_allocator_mut(_mutator.config.allocator_mapping[AllocationSemantics::Default])
60+
.get_allocator_mut(mutator.config.allocator_mapping[AllocationSemantics::Default])
6461
}
6562
.downcast_mut::<MarkCompactAllocator<VM>>()
6663
.unwrap();
6764
markcompact_allocator.reset();
65+
66+
common_release_func(mutator, tls);
6867
}

src/plan/marksweep/mutator.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::plan::mutator_context::Mutator;
55
use crate::plan::mutator_context::MutatorConfig;
66
use crate::plan::mutator_context::ReservedAllocators;
77
use crate::plan::mutator_context::SpaceMapping;
8+
use crate::plan::mutator_context::{common_prepare_func, common_release_func};
89
use crate::plan::AllocationSemantics;
910
use crate::plan::Plan;
1011
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
@@ -20,8 +21,12 @@ mod malloc_mark_sweep {
2021

2122
// Do nothing for malloc mark sweep (malloc allocator)
2223

23-
pub fn ms_mutator_prepare<VM: VMBinding>(_mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {}
24-
pub fn ms_mutator_release<VM: VMBinding>(_mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {}
24+
pub fn ms_mutator_prepare<VM: VMBinding>(mutator: &mut Mutator<VM>, tls: VMWorkerThread) {
25+
common_prepare_func(mutator, tls);
26+
}
27+
pub fn ms_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, tls: VMWorkerThread) {
28+
common_release_func(mutator, tls);
29+
}
2530

2631
// malloc mark sweep uses 1 malloc allocator
2732

@@ -69,13 +74,17 @@ mod native_mark_sweep {
6974
// We forward calls to the allocator prepare and release
7075

7176
#[cfg(not(feature = "malloc_mark_sweep"))]
72-
pub fn ms_mutator_prepare<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {
77+
pub fn ms_mutator_prepare<VM: VMBinding>(mutator: &mut Mutator<VM>, tls: VMWorkerThread) {
7378
get_freelist_allocator_mut::<VM>(mutator).prepare();
79+
80+
common_prepare_func(mutator, tls);
7481
}
7582

7683
#[cfg(not(feature = "malloc_mark_sweep"))]
77-
pub fn ms_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {
84+
pub fn ms_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, tls: VMWorkerThread) {
7885
get_freelist_allocator_mut::<VM>(mutator).release();
86+
87+
common_release_func(mutator, tls);
7988
}
8089

8190
// native mark sweep uses 1 free list allocator

src/plan/mutator_context.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::plan::global::Plan;
55
use crate::plan::AllocationSemantics;
66
use crate::policy::space::Space;
77
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
8-
use crate::util::alloc::Allocator;
8+
use crate::util::alloc::{Allocator, FreeListAllocator};
99
use crate::util::{Address, ObjectReference};
1010
use crate::util::{VMMutatorThread, VMWorkerThread};
1111
use crate::vm::VMBinding;
@@ -24,6 +24,19 @@ pub(crate) fn unreachable_prepare_func<VM: VMBinding>(
2424
unreachable!("`MutatorConfig::prepare_func` must not be called for the current plan.")
2525
}
2626

27+
/// An mutator prepare implementation for plans that use [`crate::plan::global::CommonPlan`].
28+
pub(crate) fn common_prepare_func<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {
29+
// Prepare the free list allocator used for non moving
30+
unsafe {
31+
mutator
32+
.allocators
33+
.get_allocator_mut(mutator.config.allocator_mapping[AllocationSemantics::NonMoving])
34+
}
35+
.downcast_mut::<FreeListAllocator<VM>>()
36+
.unwrap()
37+
.prepare();
38+
}
39+
2740
/// A place-holder implementation for `MutatorConfig::release_func` that should not be called.
2841
/// Currently only used by `NoGC`.
2942
pub(crate) fn unreachable_release_func<VM: VMBinding>(
@@ -33,6 +46,19 @@ pub(crate) fn unreachable_release_func<VM: VMBinding>(
3346
unreachable!("`MutatorConfig::release_func` must not be called for the current plan.")
3447
}
3548

49+
/// An mutator release implementation for plans that use [`crate::plan::global::CommonPlan`].
50+
pub(crate) fn common_release_func<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {
51+
// Release the free list allocator used for non moving
52+
unsafe {
53+
mutator
54+
.allocators
55+
.get_allocator_mut(mutator.config.allocator_mapping[AllocationSemantics::NonMoving])
56+
}
57+
.downcast_mut::<FreeListAllocator<VM>>()
58+
.unwrap()
59+
.release();
60+
}
61+
3662
/// A place-holder implementation for `MutatorConfig::release_func` that does nothing.
3763
pub(crate) fn no_op_release_func<VM: VMBinding>(_mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {}
3864

0 commit comments

Comments
 (0)