Skip to content

Commit 374ec2c

Browse files
authored
implement mutator builder (#1287)
https://mmtk.zulipchat.com/#narrow/channel/262673-mmtk-core/topic/create.20plan.2Fmutator/near/504996362 Introducing `MutatorBuilder` to simplify customising `Mutator`, adding/removing fields of a certain plan's `Mutator` no longer affects other plan as `MutatorBuilder` provides default values for `Mutator`
1 parent f67a0d2 commit 374ec2c

File tree

10 files changed

+95
-90
lines changed

10 files changed

+95
-90
lines changed

src/plan/generational/copying/mutator.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use crate::plan::generational::barrier::GenObjectBarrierSemantics;
55
use crate::plan::generational::create_gen_space_mapping;
66
use crate::plan::mutator_context::unreachable_prepare_func;
77
use crate::plan::mutator_context::Mutator;
8+
use crate::plan::mutator_context::MutatorBuilder;
89
use crate::plan::mutator_context::MutatorConfig;
910
use crate::plan::AllocationSemantics;
10-
use crate::util::alloc::allocators::Allocators;
1111
use crate::util::alloc::BumpAllocator;
1212
use crate::util::{VMMutatorThread, VMWorkerThread};
1313
use crate::vm::VMBinding;
@@ -40,13 +40,10 @@ pub fn create_gencopy_mutator<VM: VMBinding>(
4040
release_func: &gencopy_mutator_release,
4141
};
4242

43-
Mutator {
44-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
45-
barrier: Box::new(ObjectBarrier::new(GenObjectBarrierSemantics::new(
46-
mmtk, gencopy,
47-
))),
48-
mutator_tls,
49-
config,
50-
plan: gencopy,
51-
}
43+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
44+
builder
45+
.barrier(Box::new(ObjectBarrier::new(
46+
GenObjectBarrierSemantics::new(mmtk, gencopy),
47+
)))
48+
.build()
5249
}

src/plan/generational/immix/mutator.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use crate::plan::generational::create_gen_space_mapping;
55
use crate::plan::generational::immix::GenImmix;
66
use crate::plan::mutator_context::unreachable_prepare_func;
77
use crate::plan::mutator_context::Mutator;
8+
use crate::plan::mutator_context::MutatorBuilder;
89
use crate::plan::mutator_context::MutatorConfig;
910
use crate::plan::AllocationSemantics;
10-
use crate::util::alloc::allocators::Allocators;
1111
use crate::util::alloc::BumpAllocator;
1212
use crate::util::{VMMutatorThread, VMWorkerThread};
1313
use crate::vm::VMBinding;
@@ -40,13 +40,10 @@ pub fn create_genimmix_mutator<VM: VMBinding>(
4040
release_func: &genimmix_mutator_release,
4141
};
4242

43-
Mutator {
44-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
45-
barrier: Box::new(ObjectBarrier::new(GenObjectBarrierSemantics::new(
46-
mmtk, genimmix,
47-
))),
48-
mutator_tls,
49-
config,
50-
plan: genimmix,
51-
}
43+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
44+
builder
45+
.barrier(Box::new(ObjectBarrier::new(
46+
GenObjectBarrierSemantics::new(mmtk, genimmix),
47+
)))
48+
.build()
5249
}

src/plan/immix/mutator.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@ use crate::plan::mutator_context::create_allocator_mapping;
33
use crate::plan::mutator_context::create_space_mapping;
44
use crate::plan::mutator_context::unreachable_prepare_func;
55
use crate::plan::mutator_context::Mutator;
6+
use crate::plan::mutator_context::MutatorBuilder;
67
use crate::plan::mutator_context::MutatorConfig;
78
use crate::plan::mutator_context::ReservedAllocators;
89
use crate::plan::AllocationSemantics;
9-
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
10+
use crate::util::alloc::allocators::AllocatorSelector;
1011
use crate::util::alloc::ImmixAllocator;
12+
use crate::util::opaque_pointer::{VMMutatorThread, VMWorkerThread};
1113
use crate::vm::VMBinding;
1214
use crate::MMTK;
13-
use crate::{
14-
plan::barriers::NoBarrier,
15-
util::opaque_pointer::{VMMutatorThread, VMWorkerThread},
16-
};
1715
use enum_map::EnumMap;
1816

1917
pub fn immix_mutator_release<VM: VMBinding>(mutator: &mut Mutator<VM>, _tls: VMWorkerThread) {
@@ -56,11 +54,6 @@ pub fn create_immix_mutator<VM: VMBinding>(
5654
release_func: &immix_mutator_release,
5755
};
5856

59-
Mutator {
60-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
61-
barrier: Box::new(NoBarrier),
62-
mutator_tls,
63-
config,
64-
plan: immix,
65-
}
57+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
58+
builder.build()
6659
}

src/plan/markcompact/mutator.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use super::MarkCompact;
2-
use crate::plan::barriers::NoBarrier;
32
use crate::plan::mutator_context::create_allocator_mapping;
43
use crate::plan::mutator_context::create_space_mapping;
54
use crate::plan::mutator_context::unreachable_prepare_func;
65
use crate::plan::mutator_context::Mutator;
6+
use crate::plan::mutator_context::MutatorBuilder;
77
use crate::plan::mutator_context::MutatorConfig;
88
use crate::plan::mutator_context::ReservedAllocators;
99
use crate::plan::AllocationSemantics;
10-
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
10+
use crate::util::alloc::allocators::AllocatorSelector;
1111
use crate::util::alloc::MarkCompactAllocator;
1212
use crate::util::opaque_pointer::*;
1313
use crate::vm::VMBinding;
@@ -42,14 +42,8 @@ pub fn create_markcompact_mutator<VM: VMBinding>(
4242
prepare_func: &unreachable_prepare_func,
4343
release_func: &markcompact_mutator_release,
4444
};
45-
46-
Mutator {
47-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
48-
barrier: Box::new(NoBarrier),
49-
mutator_tls,
50-
config,
51-
plan: markcompact,
52-
}
45+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
46+
builder.build()
5347
}
5448

5549
pub fn markcompact_mutator_release<VM: VMBinding>(

src/plan/marksweep/mutator.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
use crate::plan::barriers::NoBarrier;
21
use crate::plan::marksweep::MarkSweep;
32
use crate::plan::mutator_context::create_allocator_mapping;
43
use crate::plan::mutator_context::Mutator;
4+
use crate::plan::mutator_context::MutatorBuilder;
55
use crate::plan::mutator_context::MutatorConfig;
66
use crate::plan::mutator_context::ReservedAllocators;
77
use crate::plan::mutator_context::SpaceMapping;
88
use crate::plan::AllocationSemantics;
99
use crate::plan::Plan;
10-
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
10+
use crate::util::alloc::allocators::AllocatorSelector;
1111
use crate::util::{VMMutatorThread, VMWorkerThread};
1212
use crate::vm::VMBinding;
1313
use crate::MMTK;
@@ -121,11 +121,6 @@ pub fn create_ms_mutator<VM: VMBinding>(
121121
release_func: &ms_mutator_release,
122122
};
123123

124-
Mutator {
125-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
126-
barrier: Box::new(NoBarrier),
127-
mutator_tls,
128-
config,
129-
plan: mmtk.get_plan(),
130-
}
124+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
125+
builder.build()
131126
}

src/plan/mutator_context.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ use crate::util::alloc::Allocator;
99
use crate::util::{Address, ObjectReference};
1010
use crate::util::{VMMutatorThread, VMWorkerThread};
1111
use crate::vm::VMBinding;
12+
use crate::MMTK;
1213

1314
use enum_map::EnumMap;
1415

16+
use super::barriers::NoBarrier;
17+
1518
pub(crate) type SpaceMapping<VM> = Vec<(AllocatorSelector, &'static dyn Space<VM>)>;
1619

1720
/// A place-holder implementation for `MutatorConfig::prepare_func` that should not be called.
@@ -78,6 +81,49 @@ impl<VM: VMBinding> std::fmt::Debug for MutatorConfig<VM> {
7881
}
7982
}
8083

84+
/// Used to build a mutator struct
85+
pub struct MutatorBuilder<VM: VMBinding> {
86+
barrier: Box<dyn Barrier<VM>>,
87+
/// The mutator thread that is bound with this Mutator struct.
88+
mutator_tls: VMMutatorThread,
89+
mmtk: &'static MMTK<VM>,
90+
config: MutatorConfig<VM>,
91+
}
92+
93+
impl<VM: VMBinding> MutatorBuilder<VM> {
94+
pub fn new(
95+
mutator_tls: VMMutatorThread,
96+
mmtk: &'static MMTK<VM>,
97+
config: MutatorConfig<VM>,
98+
) -> Self {
99+
MutatorBuilder {
100+
barrier: Box::new(NoBarrier),
101+
mutator_tls,
102+
mmtk,
103+
config,
104+
}
105+
}
106+
107+
pub fn barrier(mut self, barrier: Box<dyn Barrier<VM>>) -> Self {
108+
self.barrier = barrier;
109+
self
110+
}
111+
112+
pub fn build(self) -> Mutator<VM> {
113+
Mutator {
114+
allocators: Allocators::<VM>::new(
115+
self.mutator_tls,
116+
self.mmtk,
117+
&self.config.space_mapping,
118+
),
119+
barrier: self.barrier,
120+
mutator_tls: self.mutator_tls,
121+
plan: self.mmtk.get_plan(),
122+
config: self.config,
123+
}
124+
}
125+
}
126+
81127
/// A mutator is a per-thread data structure that manages allocations and barriers. It is usually highly coupled with the language VM.
82128
/// It is recommended for MMTk users 1) to have a mutator struct of the same layout in the thread local storage that can be accessed efficiently,
83129
/// and 2) to implement fastpath allocation and barriers for the mutator in the VM side.

src/plan/nogc/mutator.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
use crate::plan::barriers::NoBarrier;
21
use crate::plan::mutator_context::unreachable_prepare_func;
32
use crate::plan::mutator_context::unreachable_release_func;
43
use crate::plan::mutator_context::Mutator;
4+
use crate::plan::mutator_context::MutatorBuilder;
55
use crate::plan::mutator_context::MutatorConfig;
66
use crate::plan::mutator_context::{
77
create_allocator_mapping, create_space_mapping, ReservedAllocators,
88
};
99
use crate::plan::nogc::NoGC;
1010
use crate::plan::AllocationSemantics;
11-
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
11+
use crate::util::alloc::allocators::AllocatorSelector;
1212
use crate::util::VMMutatorThread;
1313
use crate::vm::VMBinding;
1414
use crate::MMTK;
@@ -56,11 +56,6 @@ pub fn create_nogc_mutator<VM: VMBinding>(
5656
release_func: &unreachable_release_func,
5757
};
5858

59-
Mutator {
60-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
61-
barrier: Box::new(NoBarrier),
62-
mutator_tls,
63-
config,
64-
plan,
65-
}
59+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
60+
builder.build()
6661
}

src/plan/pageprotect/mutator.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ use super::PageProtect;
22
use crate::plan::mutator_context::no_op_release_func;
33
use crate::plan::mutator_context::unreachable_prepare_func;
44
use crate::plan::mutator_context::Mutator;
5+
use crate::plan::mutator_context::MutatorBuilder;
56
use crate::plan::mutator_context::MutatorConfig;
67
use crate::plan::mutator_context::{
78
create_allocator_mapping, create_space_mapping, ReservedAllocators,
89
};
910
use crate::plan::AllocationSemantics;
10-
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
11+
use crate::util::alloc::allocators::AllocatorSelector;
12+
use crate::util::opaque_pointer::VMMutatorThread;
1113
use crate::vm::VMBinding;
1214
use crate::MMTK;
13-
use crate::{plan::barriers::NoBarrier, util::opaque_pointer::VMMutatorThread};
1415
use enum_map::EnumMap;
1516

1617
const RESERVED_ALLOCATORS: ReservedAllocators = ReservedAllocators {
@@ -44,11 +45,6 @@ pub fn create_pp_mutator<VM: VMBinding>(
4445
release_func: &no_op_release_func,
4546
};
4647

47-
Mutator {
48-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
49-
barrier: Box::new(NoBarrier),
50-
mutator_tls,
51-
config,
52-
plan: page,
53-
}
48+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
49+
builder.build()
5450
}

src/plan/semispace/mutator.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use super::SemiSpace;
2-
use crate::plan::barriers::NoBarrier;
32
use crate::plan::mutator_context::unreachable_prepare_func;
43
use crate::plan::mutator_context::Mutator;
4+
use crate::plan::mutator_context::MutatorBuilder;
55
use crate::plan::mutator_context::MutatorConfig;
66
use crate::plan::mutator_context::{
77
create_allocator_mapping, create_space_mapping, ReservedAllocators,
88
};
99
use crate::plan::AllocationSemantics;
10-
use crate::util::alloc::allocators::{AllocatorSelector, Allocators};
10+
use crate::util::alloc::allocators::AllocatorSelector;
1111
use crate::util::alloc::BumpAllocator;
1212
use crate::util::{VMMutatorThread, VMWorkerThread};
1313
use crate::vm::VMBinding;
@@ -61,11 +61,6 @@ pub fn create_ss_mutator<VM: VMBinding>(
6161
release_func: &ss_mutator_release,
6262
};
6363

64-
Mutator {
65-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
66-
barrier: Box::new(NoBarrier),
67-
mutator_tls,
68-
config,
69-
plan: ss,
70-
}
64+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
65+
builder.build()
7166
}

src/plan/sticky/immix/mutator.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::plan::barriers::ObjectBarrier;
22
use crate::plan::generational::barrier::GenObjectBarrierSemantics;
33
use crate::plan::immix;
4-
use crate::plan::mutator_context::{create_space_mapping, unreachable_prepare_func, MutatorConfig};
4+
use crate::plan::mutator_context::{
5+
create_space_mapping, unreachable_prepare_func, MutatorBuilder, MutatorConfig,
6+
};
57
use crate::plan::sticky::immix::global::StickyImmix;
6-
use crate::util::alloc::allocators::Allocators;
78
use crate::util::alloc::AllocatorSelector;
89
use crate::util::opaque_pointer::VMWorkerThread;
910
use crate::util::VMMutatorThread;
@@ -33,14 +34,10 @@ pub fn create_stickyimmix_mutator<VM: VMBinding>(
3334
release_func: &stickyimmix_mutator_release,
3435
};
3536

36-
Mutator {
37-
allocators: Allocators::<VM>::new(mutator_tls, mmtk, &config.space_mapping),
38-
barrier: Box::new(ObjectBarrier::new(GenObjectBarrierSemantics::new(
39-
mmtk,
40-
stickyimmix,
41-
))),
42-
mutator_tls,
43-
config,
44-
plan: mmtk.get_plan(),
45-
}
37+
let builder = MutatorBuilder::new(mutator_tls, mmtk, config);
38+
builder
39+
.barrier(Box::new(ObjectBarrier::new(
40+
GenObjectBarrierSemantics::new(mmtk, stickyimmix),
41+
)))
42+
.build()
4643
}

0 commit comments

Comments
 (0)