1
1
#include "mmtk_julia.h"
2
2
#include "mmtk.h"
3
+ #include "mmtkMutator.h"
3
4
#include <stdbool.h>
4
5
#include <stddef.h>
5
6
#include "gc.h"
@@ -36,23 +37,6 @@ JL_DLLEXPORT void (jl_mmtk_harness_end)(void)
36
37
mmtk_harness_end ();
37
38
}
38
39
39
- STATIC_INLINE void * alloc_default_object (jl_ptls_t ptls , size_t size , int offset ) {
40
- int64_t delta = (- offset - (int64_t )(ptls -> cursor )) & 15 ; // aligned to 16
41
- uint64_t aligned_addr = (uint64_t )ptls -> cursor + delta ;
42
-
43
- if (__unlikely (aligned_addr + size > (uint64_t )ptls -> limit )) {
44
- jl_ptls_t ptls2 = jl_current_task -> ptls ;
45
- ptls2 -> mmtk_mutator_ptr -> allocators .immix [0 ].cursor = ptls2 -> cursor ;
46
- void * res = mmtk_alloc (ptls2 -> mmtk_mutator_ptr , size , 16 , offset , 0 );
47
- ptls2 -> cursor = ptls2 -> mmtk_mutator_ptr -> allocators .immix [0 ].cursor ;
48
- ptls2 -> limit = ptls2 -> mmtk_mutator_ptr -> allocators .immix [0 ].limit ;
49
- return res ;
50
- } else {
51
- ptls -> cursor = (void * ) (aligned_addr + size );
52
- return (void * ) aligned_addr ;
53
- }
54
- }
55
-
56
40
JL_DLLEXPORT jl_value_t * jl_mmtk_gc_alloc_default (jl_ptls_t ptls , int pool_offset ,
57
41
int osize , void * ty )
58
42
{
@@ -62,16 +46,16 @@ JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_default(jl_ptls_t ptls, int pool_offse
62
46
jl_value_t * v ;
63
47
if ((uintptr_t )ty != jl_buff_tag ) {
64
48
// v needs to be 16 byte aligned, therefore v_tagged needs to be offset accordingly to consider the size of header
65
- jl_taggedvalue_t * v_tagged = (jl_taggedvalue_t * )mmtk_alloc (ptls -> mmtk_mutator_ptr , osize , 16 , sizeof (jl_taggedvalue_t ), 0 ); // (jl_taggedvalue_t *) alloc_default_object(ptls, osize, sizeof(jl_taggedvalue_t) );
49
+ jl_taggedvalue_t * v_tagged = (jl_taggedvalue_t * )mmtk_alloc (& ptls -> mmtk_mutator , osize , 16 , sizeof (jl_taggedvalue_t ), 0 );
66
50
v = jl_valueof (v_tagged );
67
- mmtk_post_alloc (ptls -> mmtk_mutator_ptr , v , osize , 0 );
51
+ mmtk_post_alloc (& ptls -> mmtk_mutator , v , osize , 0 );
68
52
} else {
69
53
// allocating an extra word to store the size of buffer objects
70
- jl_taggedvalue_t * v_tagged = (jl_taggedvalue_t * )mmtk_alloc (ptls -> mmtk_mutator_ptr , osize + sizeof (jl_taggedvalue_t ), 16 , 0 , 0 ); // (jl_taggedvalue_t *) alloc_default_object(ptls, osize + sizeof(jl_taggedvalue_t) , 0);
54
+ jl_taggedvalue_t * v_tagged = (jl_taggedvalue_t * )mmtk_alloc (& ptls -> mmtk_mutator , osize + sizeof (jl_taggedvalue_t ), 16 , 0 , 0 );
71
55
jl_value_t * v_tagged_aligned = ((jl_value_t * )((char * )(v_tagged ) + sizeof (jl_taggedvalue_t )));
72
56
v = jl_valueof (v_tagged_aligned );
73
57
mmtk_store_obj_size_c (v , osize + sizeof (jl_taggedvalue_t ));
74
- mmtk_post_alloc (ptls -> mmtk_mutator_ptr , v , osize + sizeof (jl_taggedvalue_t ), 0 );
58
+ mmtk_post_alloc (& ptls -> mmtk_mutator , v , osize + sizeof (jl_taggedvalue_t ), 0 );
75
59
}
76
60
77
61
ptls -> gc_num .allocd += osize ;
@@ -95,7 +79,7 @@ JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_big(jl_ptls_t ptls, size_t sz)
95
79
jl_throw (jl_memory_exception );
96
80
}
97
81
98
- bigval_t * v = (bigval_t * )mmtk_alloc_large (ptls -> mmtk_mutator_ptr , allocsz , JL_CACHE_BYTE_ALIGNMENT , 0 , 2 );
82
+ bigval_t * v = (bigval_t * )mmtk_alloc_large (& ptls -> mmtk_mutator , allocsz , JL_CACHE_BYTE_ALIGNMENT , 0 , 2 );
99
83
100
84
if (v == NULL ) {
101
85
assert (0 && "Allocation failed" );
@@ -107,7 +91,7 @@ JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_big(jl_ptls_t ptls, size_t sz)
107
91
ptls -> gc_num .bigalloc ++ ;
108
92
109
93
jl_value_t * result = jl_valueof (& v -> header );
110
- mmtk_post_alloc (ptls -> mmtk_mutator_ptr , result , allocsz , 2 );
94
+ mmtk_post_alloc (& ptls -> mmtk_mutator , result , allocsz , 2 );
111
95
112
96
return result ;
113
97
}
@@ -147,7 +131,7 @@ static void mmtk_sweep_malloced_arrays(void) JL_NOTSAFEPOINT
147
131
extern void mark_metadata_scanned (jl_value_t * obj );
148
132
extern int8_t check_metadata_scanned (jl_value_t * obj );
149
133
150
- int8_t object_has_been_scanned (jl_value_t * obj )
134
+ int8_t object_has_been_scanned (void * obj )
151
135
{
152
136
uintptr_t tag = (uintptr_t )jl_typeof (obj );
153
137
jl_datatype_t * vt = (jl_datatype_t * )tag ;
@@ -164,7 +148,7 @@ int8_t object_has_been_scanned(jl_value_t* obj)
164
148
return 0 ;
165
149
}
166
150
167
- void mark_object_as_scanned (jl_value_t * obj ) {
151
+ void mark_object_as_scanned (void * obj ) {
168
152
if (jl_object_in_image ((jl_value_t * )obj )) {
169
153
jl_taggedvalue_t * o = jl_astaggedvalue (obj );
170
154
o -> bits .gc = GC_MARKED ;
@@ -185,8 +169,9 @@ void mmtk_exit_from_safepoint(int8_t old_state) {
185
169
// it will block until GC is done
186
170
// that thread simply exits from block_for_gc without executing finalizers
187
171
// when executing finalizers do not let another thread do GC (set a variable such that while that variable is true, no GC can be done)
188
- int8_t set_gc_initial_state (jl_ptls_t ptls )
172
+ int8_t set_gc_initial_state (void * ptls_raw )
189
173
{
174
+ jl_ptls_t ptls = (jl_ptls_t ) ptls_raw ;
190
175
int8_t old_state = jl_atomic_load_relaxed (& ((jl_ptls_t )ptls )-> gc_state );
191
176
jl_atomic_store_release (& ((jl_ptls_t )ptls )-> gc_state , JL_GC_STATE_WAITING );
192
177
if (!jl_safepoint_start_gc ()) {
@@ -231,8 +216,9 @@ void wait_for_the_world(void)
231
216
}
232
217
}
233
218
234
- size_t get_lo_size (jl_value_t * obj )
219
+ size_t get_lo_size (void * obj_raw )
235
220
{
221
+ jl_value_t * obj = (jl_value_t * ) obj_raw ;
236
222
jl_taggedvalue_t * v = jl_astaggedvalue (obj );
237
223
// bigval_header: but we cannot access the function here. So use container_of instead.
238
224
bigval_t * hdr = container_of (v , bigval_t , header );
@@ -246,18 +232,12 @@ void set_jl_last_err(int e)
246
232
247
233
int get_jl_last_err (void )
248
234
{
249
- gc_n_threads = jl_atomic_load_acquire (& jl_n_threads );
250
- gc_all_tls_states = jl_atomic_load_relaxed (& jl_all_tls_states );
251
- for (int t_i = 0 ; t_i < gc_n_threads ; t_i ++ ) {
252
- jl_ptls_t ptls = gc_all_tls_states [t_i ];
253
- ptls -> cursor = 0 ;
254
- ptls -> limit = 0 ;
255
- }
256
235
return errno ;
257
236
}
258
237
259
- void * get_obj_start_ref (jl_value_t * obj )
238
+ void * get_obj_start_ref (void * obj_raw )
260
239
{
240
+ jl_value_t * obj = (jl_value_t * ) obj_raw ;
261
241
uintptr_t tag = (uintptr_t )jl_typeof (obj );
262
242
jl_datatype_t * vt = (jl_datatype_t * )tag ;
263
243
void * obj_start_ref ;
@@ -271,8 +251,9 @@ void* get_obj_start_ref(jl_value_t* obj)
271
251
return obj_start_ref ;
272
252
}
273
253
274
- size_t get_so_size (jl_value_t * obj )
254
+ size_t get_so_size (void * obj_raw )
275
255
{
256
+ jl_value_t * obj = (jl_value_t * ) obj_raw ;
276
257
uintptr_t tag = (uintptr_t )jl_typeof (obj );
277
258
jl_datatype_t * vt = (jl_datatype_t * )tag ;
278
259
@@ -392,8 +373,10 @@ size_t get_so_size(jl_value_t* obj)
392
373
return 0 ;
393
374
}
394
375
395
- void run_finalizer_function (jl_value_t * o , jl_value_t * ff , bool is_ptr )
376
+ void run_finalizer_function (void * o_raw , void * ff_raw , bool is_ptr )
396
377
{
378
+ jl_value_t * o = (jl_value_t * ) o_raw ;
379
+ jl_value_t * ff = (jl_value_t * ) ff_raw ;
397
380
if (is_ptr ) {
398
381
run_finalizer (jl_current_task , (jl_value_t * )(((uintptr_t )o ) | 1 ), (jl_value_t * )ff );
399
382
} else {
@@ -423,7 +406,7 @@ void mmtk_jl_run_pending_finalizers(void* ptls) {
423
406
}
424
407
}
425
408
426
- void mmtk_jl_run_finalizers (jl_ptls_t ptls ) {
409
+ void mmtk_jl_run_finalizers (void * ptls ) {
427
410
// Only disable finalizers on current thread
428
411
// Doing this on all threads is racy (it's impossible to check
429
412
// or wait for finalizers on other threads without dead lock).
@@ -663,7 +646,7 @@ static void jl_gc_queue_remset_mmtk(jl_ptls_t ptls2)
663
646
}
664
647
}
665
648
666
- void calculate_roots (jl_ptls_t ptls )
649
+ void calculate_roots (void * ptls_raw )
667
650
{
668
651
for (int t_i = 0 ; t_i < gc_n_threads ; t_i ++ )
669
652
gc_premark (gc_all_tls_states [t_i ]);
@@ -682,8 +665,8 @@ void calculate_roots(jl_ptls_t ptls)
682
665
queue_roots ();
683
666
}
684
667
685
- JL_DLLEXPORT void scan_julia_exc_obj (jl_task_t * obj , closure_pointer closure , ProcessEdgeFn process_edge ) {
686
- jl_task_t * ta = (jl_task_t * )obj ;
668
+ JL_DLLEXPORT void scan_julia_exc_obj (void * obj_raw , closure_pointer closure , ProcessEdgeFn process_edge ) {
669
+ jl_task_t * ta = (jl_task_t * )obj_raw ;
687
670
688
671
if (ta -> excstack ) { // inlining label `excstack` from mark_loop
689
672
// if it is not managed by MMTk, nothing needs to be done because the object does not need to be scanned
@@ -745,8 +728,9 @@ const bool PRINT_OBJ_TYPE = false;
745
728
* directly (not an edge), specifying whether to scan the object or not; and only scan the object
746
729
* (necessary for boot image / non-MMTk objects)
747
730
**/
748
- JL_DLLEXPORT void scan_julia_obj (jl_value_t * obj , closure_pointer closure , ProcessEdgeFn process_edge , ProcessOffsetEdgeFn process_offset_edge )
731
+ JL_DLLEXPORT void scan_julia_obj (void * obj_raw , closure_pointer closure , ProcessEdgeFn process_edge , ProcessOffsetEdgeFn process_offset_edge )
749
732
{
733
+ jl_value_t * obj = (jl_value_t * ) obj_raw ;
750
734
uintptr_t tag = (uintptr_t )jl_typeof (obj );
751
735
jl_datatype_t * vt = (jl_datatype_t * )tag ; // type of obj
752
736
@@ -962,6 +946,10 @@ void update_gc_time(uint64_t inc) {
962
946
gc_num .total_time += inc ;
963
947
}
964
948
949
+ uintptr_t get_abi_structs_checksum_c (void ) {
950
+ return sizeof (MMTkMutatorContext );
951
+ }
952
+
965
953
Julia_Upcalls mmtk_upcalls = (Julia_Upcalls ) {
966
954
.scan_julia_obj = scan_julia_obj ,
967
955
.scan_julia_exc_obj = scan_julia_exc_obj ,
@@ -986,4 +974,5 @@ Julia_Upcalls mmtk_upcalls = (Julia_Upcalls) {
986
974
.exit_from_safepoint = mmtk_exit_from_safepoint ,
987
975
.jl_hrtime = jl_hrtime ,
988
976
.update_gc_time = update_gc_time ,
977
+ .get_abi_structs_checksum_c = get_abi_structs_checksum_c ,
989
978
};
0 commit comments