1
- // All functions here are extern function. There is no point for marking them as unsafe.
2
- #![ allow( clippy:: not_unsafe_ptr_arg_deref) ]
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) ]
3
4
4
5
use std:: ffi:: CStr ;
5
6
use std:: sync:: atomic:: Ordering ;
@@ -46,14 +47,14 @@ pub extern "C" fn mmtk_builder_default() -> *mut MMTKBuilder {
46
47
/// Let the MMTKBuilder read options from environment variables,
47
48
/// such as `MMTK_THREADS`.
48
49
#[ no_mangle]
49
- pub extern "C" fn mmtk_builder_read_env_var_settings ( builder : * mut MMTKBuilder ) {
50
+ pub unsafe extern "C" fn mmtk_builder_read_env_var_settings ( builder : * mut MMTKBuilder ) {
50
51
let builder = unsafe { & mut * builder } ;
51
52
builder. options . read_env_var_settings ( ) ;
52
53
}
53
54
54
55
/// Set the GC trigger to dynamically adjust heap size.
55
56
#[ no_mangle]
56
- pub extern "C" fn mmtk_builder_set_dynamic_heap_size (
57
+ pub unsafe extern "C" fn mmtk_builder_set_dynamic_heap_size (
57
58
builder : * mut MMTKBuilder ,
58
59
low : usize ,
59
60
high : usize ,
@@ -67,7 +68,10 @@ pub extern "C" fn mmtk_builder_set_dynamic_heap_size(
67
68
68
69
/// Set the GC trigger to use a fixed heap size.
69
70
#[ no_mangle]
70
- pub extern "C" fn mmtk_builder_set_fixed_heap_size ( builder : * mut MMTKBuilder , heap_size : usize ) {
71
+ pub unsafe extern "C" fn mmtk_builder_set_fixed_heap_size (
72
+ builder : * mut MMTKBuilder ,
73
+ heap_size : usize ,
74
+ ) {
71
75
let builder = unsafe { & mut * builder } ;
72
76
builder
73
77
. options
@@ -78,7 +82,10 @@ pub extern "C" fn mmtk_builder_set_fixed_heap_size(builder: *mut MMTKBuilder, he
78
82
/// Set the plan. `plan_name` is a case-sensitive C-style ('\0'-terminated) string matching
79
83
/// one of the cases of `enum PlanSelector`.
80
84
#[ no_mangle]
81
- pub extern "C" fn mmtk_builder_set_plan ( builder : * mut MMTKBuilder , plan_name : * const libc:: c_char ) {
85
+ pub unsafe extern "C" fn mmtk_builder_set_plan (
86
+ builder : * mut MMTKBuilder ,
87
+ plan_name : * const libc:: c_char ,
88
+ ) {
82
89
let builder = unsafe { & mut * builder } ;
83
90
let plan_name_cstr = unsafe { CStr :: from_ptr ( plan_name) } ;
84
91
let plan_name_str = plan_name_cstr. to_str ( ) . unwrap ( ) ;
@@ -88,21 +95,21 @@ pub extern "C" fn mmtk_builder_set_plan(builder: *mut MMTKBuilder, plan_name: *c
88
95
89
96
/// Query if the selected plan is MarkSweep.
90
97
#[ no_mangle]
91
- pub extern "C" fn mmtk_builder_is_mark_sweep ( builder : * mut MMTKBuilder ) -> bool {
98
+ pub unsafe extern "C" fn mmtk_builder_is_mark_sweep ( builder : * mut MMTKBuilder ) -> bool {
92
99
let builder = unsafe { & mut * builder } ;
93
100
matches ! ( * builder. options. plan, PlanSelector :: MarkSweep )
94
101
}
95
102
96
103
/// Query if the selected plan is Immix.
97
104
#[ no_mangle]
98
- pub extern "C" fn mmtk_builder_is_immix ( builder : * mut MMTKBuilder ) -> bool {
105
+ pub unsafe extern "C" fn mmtk_builder_is_immix ( builder : * mut MMTKBuilder ) -> bool {
99
106
let builder = unsafe { & mut * builder } ;
100
107
matches ! ( * builder. options. plan, PlanSelector :: Immix )
101
108
}
102
109
103
110
/// Query if the selected plan is StickyImmix.
104
111
#[ no_mangle]
105
- pub extern "C" fn mmtk_builder_is_sticky_immix ( builder : * mut MMTKBuilder ) -> bool {
112
+ pub unsafe extern "C" fn mmtk_builder_is_sticky_immix ( builder : * mut MMTKBuilder ) -> bool {
106
113
let builder = unsafe { & mut * builder } ;
107
114
matches ! ( * builder. options. plan, PlanSelector :: StickyImmix )
108
115
}
@@ -114,7 +121,7 @@ pub extern "C" fn mmtk_builder_is_sticky_immix(builder: *mut MMTKBuilder) -> boo
114
121
/// the MMTk instance.
115
122
/// - `upcalls` points to the struct that contains upcalls. It is allocated in C as static.
116
123
#[ no_mangle]
117
- pub extern "C" fn mmtk_init_binding (
124
+ pub unsafe extern "C" fn mmtk_init_binding (
118
125
builder : * mut MMTKBuilder ,
119
126
binding_options : * const RubyBindingOptions ,
120
127
upcalls : * const abi:: RubyUpcalls ,
@@ -139,13 +146,13 @@ pub extern "C" fn mmtk_bind_mutator(tls: VMMutatorThread) -> *mut RubyMutator {
139
146
}
140
147
141
148
#[ no_mangle]
142
- pub extern "C" fn mmtk_destroy_mutator ( mutator : * mut RubyMutator ) {
149
+ pub unsafe extern "C" fn mmtk_destroy_mutator ( mutator : * mut RubyMutator ) {
143
150
let mut boxed_mutator = unsafe { Box :: from_raw ( mutator) } ;
144
151
memory_manager:: destroy_mutator ( boxed_mutator. as_mut ( ) )
145
152
}
146
153
147
154
#[ no_mangle]
148
- pub extern "C" fn mmtk_alloc (
155
+ pub unsafe extern "C" fn mmtk_alloc (
149
156
mutator : * mut RubyMutator ,
150
157
size : usize ,
151
158
align : usize ,
@@ -163,7 +170,7 @@ pub extern "C" fn mmtk_alloc(
163
170
}
164
171
165
172
#[ no_mangle]
166
- pub extern "C" fn mmtk_post_alloc (
173
+ pub unsafe extern "C" fn mmtk_post_alloc (
167
174
mutator : * mut RubyMutator ,
168
175
refer : ObjectReference ,
169
176
bytes : usize ,
@@ -285,7 +292,7 @@ pub extern "C" fn mmtk_add_obj_free_candidate(object: ObjectReference) {
285
292
}
286
293
287
294
#[ no_mangle]
288
- pub extern "C" fn mmtk_add_obj_free_candidates ( objects : * const ObjectReference , len : usize ) {
295
+ pub unsafe extern "C" fn mmtk_add_obj_free_candidates ( objects : * const ObjectReference , len : usize ) {
289
296
let objects_slice = unsafe { std:: slice:: from_raw_parts ( objects, len) } ;
290
297
binding ( ) . weak_proc . add_obj_free_candidates ( objects_slice)
291
298
}
@@ -307,7 +314,7 @@ pub extern "C" fn mmtk_register_ppp(object: ObjectReference) {
307
314
}
308
315
309
316
#[ no_mangle]
310
- pub extern "C" fn mmtk_register_ppps ( objects : * const ObjectReference , len : usize ) {
317
+ pub unsafe extern "C" fn mmtk_register_ppps ( objects : * const ObjectReference , len : usize ) {
311
318
let objects_slice = unsafe { std:: slice:: from_raw_parts ( objects, len) } ;
312
319
crate :: binding ( ) . ppp_registry . register_many ( objects_slice)
313
320
}
@@ -371,7 +378,7 @@ pub extern "C" fn mmtk_is_object_wb_unprotected(object: ObjectReference) -> bool
371
378
}
372
379
373
380
#[ no_mangle]
374
- pub extern "C" fn mmtk_object_reference_write_post (
381
+ pub unsafe extern "C" fn mmtk_object_reference_write_post (
375
382
mutator : * mut RubyMutator ,
376
383
object : ObjectReference ,
377
384
) {
@@ -398,7 +405,7 @@ pub extern "C" fn mmtk_enumerate_objects(
398
405
}
399
406
400
407
#[ no_mangle]
401
- pub extern "C" fn mmtk_hidden_header_is_sane ( hidden_header : * const HiddenHeader ) -> bool {
408
+ pub unsafe extern "C" fn mmtk_hidden_header_is_sane ( hidden_header : * const HiddenHeader ) -> bool {
402
409
let hidden_header = unsafe { & * hidden_header } ;
403
410
hidden_header. is_sane ( )
404
411
}
0 commit comments