1
- use std:: sync:: atomic:: Ordering ;
1
+ // Functions in this module are unsafe for one reason:
2
+ // They are called by C functions and they need to pass raw pointers to Rust.
3
+ #![ allow( clippy:: missing_safety_doc) ]
4
+
2
5
use mmtk:: util:: options:: PlanSelector ;
6
+ use std:: sync:: atomic:: Ordering ;
3
7
4
8
use crate :: abi:: RawVecOfObjRef ;
5
9
use crate :: abi:: RubyBindingOptions ;
6
10
use crate :: abi:: RubyUpcalls ;
7
11
use crate :: binding;
8
12
use crate :: binding:: RubyBinding ;
9
13
use crate :: mmtk;
10
- use crate :: Ruby ;
11
- use crate :: RubySlot ;
12
14
use crate :: utils:: default_heap_max;
13
15
use crate :: utils:: parse_capacity;
16
+ use crate :: Ruby ;
17
+ use crate :: RubySlot ;
14
18
use mmtk:: memory_manager;
15
19
use mmtk:: memory_manager:: mmtk_init;
16
20
use mmtk:: util:: constants:: MIN_OBJECT_SIZE ;
@@ -38,22 +42,18 @@ pub extern "C" fn mmtk_is_reachable(object: ObjectReference) -> bool {
38
42
// =============== Bootup ===============
39
43
40
44
fn mmtk_builder_default_parse_threads ( ) -> usize {
41
- let threads_str = std:: env:: var ( "MMTK_THREADS" )
42
- . unwrap_or ( "0" . to_string ( ) ) ;
45
+ let threads_str = std:: env:: var ( "MMTK_THREADS" ) . unwrap_or ( "0" . to_string ( ) ) ;
43
46
44
- threads_str
45
- . parse :: < usize > ( )
46
- . unwrap_or_else ( |_err| {
47
- eprintln ! ( "[FATAL] Invalid MMTK_THREADS {}" , threads_str) ;
48
- std:: process:: exit ( 1 ) ;
49
- } )
47
+ threads_str. parse :: < usize > ( ) . unwrap_or_else ( |_err| {
48
+ eprintln ! ( "[FATAL] Invalid MMTK_THREADS {}" , threads_str) ;
49
+ std:: process:: exit ( 1 ) ;
50
+ } )
50
51
}
51
52
52
53
fn mmtk_builder_default_parse_heap_min ( ) -> usize {
53
54
const DEFAULT_HEAP_MIN : usize = 1 << 20 ;
54
55
55
- let heap_min_str = std:: env:: var ( "MMTK_HEAP_MIN" )
56
- . unwrap_or ( DEFAULT_HEAP_MIN . to_string ( ) ) ;
56
+ let heap_min_str = std:: env:: var ( "MMTK_HEAP_MIN" ) . unwrap_or ( DEFAULT_HEAP_MIN . to_string ( ) ) ;
57
57
58
58
let size = parse_capacity ( & heap_min_str, 0 ) ;
59
59
if size == 0 {
@@ -65,8 +65,7 @@ fn mmtk_builder_default_parse_heap_min() -> usize {
65
65
}
66
66
67
67
fn mmtk_builder_default_parse_heap_max ( ) -> usize {
68
- let heap_max_str = std:: env:: var ( "MMTK_HEAP_MAX" )
69
- . unwrap_or ( default_heap_max ( ) . to_string ( ) ) ;
68
+ let heap_max_str = std:: env:: var ( "MMTK_HEAP_MAX" ) . unwrap_or ( default_heap_max ( ) . to_string ( ) ) ;
70
69
71
70
let size = parse_capacity ( & heap_max_str, 0 ) ;
72
71
if size == 0 {
@@ -78,8 +77,7 @@ fn mmtk_builder_default_parse_heap_max() -> usize {
78
77
}
79
78
80
79
fn mmtk_builder_default_parse_heap_mode ( heap_min : usize , heap_max : usize ) -> GCTriggerSelector {
81
- let heap_mode_str = std:: env:: var ( "MMTK_HEAP_MODE" )
82
- . unwrap_or ( "dynamic" . to_string ( ) ) ;
80
+ let heap_mode_str = std:: env:: var ( "MMTK_HEAP_MODE" ) . unwrap_or ( "dynamic" . to_string ( ) ) ;
83
81
84
82
match heap_mode_str. as_str ( ) {
85
83
"fixed" => GCTriggerSelector :: FixedHeapSize ( heap_max) ,
@@ -92,8 +90,7 @@ fn mmtk_builder_default_parse_heap_mode(heap_min: usize, heap_max: usize) -> GCT
92
90
}
93
91
94
92
fn mmtk_builder_default_parse_plan ( ) -> PlanSelector {
95
- let plan_str = std:: env:: var ( "MMTK_PLAN" )
96
- . unwrap_or ( "Immix" . to_string ( ) ) ;
93
+ let plan_str = std:: env:: var ( "MMTK_PLAN" ) . unwrap_or ( "Immix" . to_string ( ) ) ;
97
94
98
95
match plan_str. as_str ( ) {
99
96
"NoGC" => PlanSelector :: NoGC ,
@@ -121,19 +118,25 @@ pub extern "C" fn mmtk_builder_default() -> *mut MMTKBuilder {
121
118
let heap_max = mmtk_builder_default_parse_heap_max ( ) ;
122
119
123
120
if heap_min >= heap_max {
124
- eprintln ! ( "[FATAL] MMTK_HEAP_MIN({}) >= MMTK_HEAP_MAX({})" , heap_min, heap_max) ;
121
+ eprintln ! (
122
+ "[FATAL] MMTK_HEAP_MIN({}) >= MMTK_HEAP_MAX({})" ,
123
+ heap_min, heap_max
124
+ ) ;
125
125
std:: process:: exit ( 1 ) ;
126
126
}
127
127
128
- builder. options . gc_trigger . set ( mmtk_builder_default_parse_heap_mode ( heap_min, heap_max) ) ;
128
+ builder
129
+ . options
130
+ . gc_trigger
131
+ . set ( mmtk_builder_default_parse_heap_mode ( heap_min, heap_max) ) ;
129
132
130
133
builder. options . plan . set ( mmtk_builder_default_parse_plan ( ) ) ;
131
134
132
135
Box :: into_raw ( Box :: new ( builder) )
133
136
}
134
137
135
138
#[ no_mangle]
136
- pub extern "C" fn mmtk_init_binding (
139
+ pub unsafe extern "C" fn mmtk_init_binding (
137
140
builder : * mut MMTKBuilder ,
138
141
_binding_options : * const RubyBindingOptions ,
139
142
upcalls : * const RubyUpcalls ,
@@ -142,11 +145,19 @@ pub extern "C" fn mmtk_init_binding(
142
145
crate :: set_panic_hook ( ) ;
143
146
144
147
let builder = unsafe { Box :: from_raw ( builder) } ;
145
- let binding_options = RubyBindingOptions { ractor_check_mode : false , suffix_size : 0 } ;
148
+ let binding_options = RubyBindingOptions {
149
+ ractor_check_mode : false ,
150
+ suffix_size : 0 ,
151
+ } ;
146
152
let mmtk_boxed = mmtk_init ( & builder) ;
147
153
let mmtk_static = Box :: leak ( Box :: new ( mmtk_boxed) ) ;
148
154
149
- let binding = RubyBinding :: new ( mmtk_static, & binding_options, upcalls, weak_reference_dead_value) ;
155
+ let binding = RubyBinding :: new (
156
+ mmtk_static,
157
+ & binding_options,
158
+ upcalls,
159
+ weak_reference_dead_value,
160
+ ) ;
150
161
151
162
crate :: BINDING
152
163
. set ( binding)
@@ -164,7 +175,7 @@ pub extern "C" fn mmtk_bind_mutator(tls: VMMutatorThread) -> *mut RubyMutator {
164
175
}
165
176
166
177
#[ no_mangle]
167
- pub extern "C" fn mmtk_destroy_mutator ( mutator : * mut RubyMutator ) {
178
+ pub unsafe extern "C" fn mmtk_destroy_mutator ( mutator : * mut RubyMutator ) {
168
179
// notify mmtk-core about destroyed mutator
169
180
memory_manager:: destroy_mutator ( unsafe { & mut * mutator } ) ;
170
181
// turn the ptr back to a box, and let Rust properly reclaim it
@@ -184,7 +195,9 @@ pub extern "C" fn mmtk_handle_user_collection_request(
184
195
185
196
#[ no_mangle]
186
197
pub extern "C" fn mmtk_set_gc_enabled ( enable : bool ) {
187
- crate :: CONFIGURATION . gc_enabled . store ( enable, Ordering :: Relaxed ) ;
198
+ crate :: CONFIGURATION
199
+ . gc_enabled
200
+ . store ( enable, Ordering :: Relaxed ) ;
188
201
}
189
202
190
203
#[ no_mangle]
@@ -195,7 +208,7 @@ pub extern "C" fn mmtk_gc_enabled_p() -> bool {
195
208
// =============== Object allocation ===============
196
209
197
210
#[ no_mangle]
198
- pub extern "C" fn mmtk_alloc (
211
+ pub unsafe extern "C" fn mmtk_alloc (
199
212
mutator : * mut RubyMutator ,
200
213
size : usize ,
201
214
align : usize ,
@@ -213,7 +226,7 @@ pub extern "C" fn mmtk_alloc(
213
226
}
214
227
215
228
#[ no_mangle]
216
- pub extern "C" fn mmtk_post_alloc (
229
+ pub unsafe extern "C" fn mmtk_post_alloc (
217
230
mutator : * mut RubyMutator ,
218
231
refer : ObjectReference ,
219
232
bytes : usize ,
@@ -243,7 +256,7 @@ pub extern "C" fn mmtk_remove_weak(ptr: &ObjectReference) {
243
256
// =============== Write barriers ===============
244
257
245
258
#[ no_mangle]
246
- pub extern "C" fn mmtk_object_reference_write_post (
259
+ pub unsafe extern "C" fn mmtk_object_reference_write_post (
247
260
mutator : * mut RubyMutator ,
248
261
object : ObjectReference ,
249
262
) {
@@ -347,7 +360,7 @@ pub extern "C" fn mmtk_plan() -> *const u8 {
347
360
PlanSelector :: NoGC => NO_GC . as_ptr ( ) ,
348
361
PlanSelector :: MarkSweep => MARK_SWEEP . as_ptr ( ) ,
349
362
PlanSelector :: Immix => IMMIX . as_ptr ( ) ,
350
- _ => panic ! ( "Unknown plan" )
363
+ _ => panic ! ( "Unknown plan" ) ,
351
364
}
352
365
}
353
366
@@ -359,7 +372,7 @@ pub extern "C" fn mmtk_heap_mode() -> *const u8 {
359
372
match * crate :: BINDING . get ( ) . unwrap ( ) . mmtk . get_options ( ) . gc_trigger {
360
373
GCTriggerSelector :: FixedHeapSize ( _) => FIXED_HEAP . as_ptr ( ) ,
361
374
GCTriggerSelector :: DynamicHeapSize ( _, _) => DYNAMIC_HEAP . as_ptr ( ) ,
362
- _ => panic ! ( "Unknown heap mode" )
375
+ _ => panic ! ( "Unknown heap mode" ) ,
363
376
}
364
377
}
365
378
@@ -368,7 +381,7 @@ pub extern "C" fn mmtk_heap_min() -> usize {
368
381
match * crate :: BINDING . get ( ) . unwrap ( ) . mmtk . get_options ( ) . gc_trigger {
369
382
GCTriggerSelector :: FixedHeapSize ( _) => 0 ,
370
383
GCTriggerSelector :: DynamicHeapSize ( min_size, _) => min_size,
371
- _ => panic ! ( "Unknown heap mode" )
384
+ _ => panic ! ( "Unknown heap mode" ) ,
372
385
}
373
386
}
374
387
@@ -377,7 +390,7 @@ pub extern "C" fn mmtk_heap_max() -> usize {
377
390
match * crate :: BINDING . get ( ) . unwrap ( ) . mmtk . get_options ( ) . gc_trigger {
378
391
GCTriggerSelector :: FixedHeapSize ( max_size) => max_size,
379
392
GCTriggerSelector :: DynamicHeapSize ( _, max_size) => max_size,
380
- _ => panic ! ( "Unknown heap mode" )
393
+ _ => panic ! ( "Unknown heap mode" ) ,
381
394
}
382
395
}
383
396
0 commit comments