@@ -162,7 +162,7 @@ typedef struct {
162
162
// jl_value_t *data[];
163
163
} jl_svec_t ;
164
164
165
- JL_EXTENSION typedef struct {
165
+ JL_EXTENSION typedef struct _jl_genericmemory_t {
166
166
JL_DATA_TYPE
167
167
size_t length ;
168
168
void * ptr ;
@@ -1182,38 +1182,6 @@ JL_DLLEXPORT void jl_free_stack(void *stkbuf, size_t bufsz);
1182
1182
// thread-local allocator of the current thread.
1183
1183
JL_DLLEXPORT jl_weakref_t * jl_gc_new_weakref (jl_value_t * value );
1184
1184
1185
- // GC write barriers
1186
-
1187
- STATIC_INLINE void jl_gc_wb (const void * parent , const void * ptr ) JL_NOTSAFEPOINT
1188
- {
1189
- // parent and ptr isa jl_value_t*
1190
- if (__unlikely (jl_astaggedvalue (parent )-> bits .gc == 3 /* GC_OLD_MARKED */ && // parent is old and not in remset
1191
- (jl_astaggedvalue (ptr )-> bits .gc & 1 /* GC_MARKED */ ) == 0 )) // ptr is young
1192
- jl_gc_queue_root ((jl_value_t * )parent );
1193
- }
1194
-
1195
- STATIC_INLINE void jl_gc_wb_back (const void * ptr ) JL_NOTSAFEPOINT // ptr isa jl_value_t*
1196
- {
1197
- // if ptr is old
1198
- if (__unlikely (jl_astaggedvalue (ptr )-> bits .gc == 3 /* GC_OLD_MARKED */ )) {
1199
- jl_gc_queue_root ((jl_value_t * )ptr );
1200
- }
1201
- }
1202
-
1203
- STATIC_INLINE void jl_gc_multi_wb (const void * parent , const jl_value_t * ptr ) JL_NOTSAFEPOINT
1204
- {
1205
- // 3 == GC_OLD_MARKED
1206
- // ptr is an immutable object
1207
- if (__likely (jl_astaggedvalue (parent )-> bits .gc != 3 ))
1208
- return ; // parent is young or in remset
1209
- if (__likely (jl_astaggedvalue (ptr )-> bits .gc == 3 ))
1210
- return ; // ptr is old and not in remset (thus it does not point to young)
1211
- jl_datatype_t * dt = (jl_datatype_t * )jl_typeof (ptr );
1212
- const jl_datatype_layout_t * ly = dt -> layout ;
1213
- if (ly -> npointers )
1214
- jl_gc_queue_multiroot ((jl_value_t * )parent , ptr , dt );
1215
- }
1216
-
1217
1185
JL_DLLEXPORT void jl_gc_safepoint (void );
1218
1186
JL_DLLEXPORT int jl_safepoint_suspend_thread (int tid , int waitstate );
1219
1187
JL_DLLEXPORT void jl_safepoint_suspend_all_threads (struct _jl_task_t * ct );
@@ -1332,6 +1300,94 @@ STATIC_INLINE jl_value_t *jl_genericmemory_ptr_set(
1332
1300
}
1333
1301
#endif
1334
1302
1303
+ // GC write barriers
1304
+
1305
+ STATIC_INLINE void jl_gc_wb (const void * parent , const void * ptr ) JL_NOTSAFEPOINT
1306
+ {
1307
+ // parent and ptr isa jl_value_t*
1308
+ if (__unlikely (jl_astaggedvalue (parent )-> bits .gc == 3 /* GC_OLD_MARKED */ && // parent is old and not in remset
1309
+ (jl_astaggedvalue (ptr )-> bits .gc & 1 /* GC_MARKED */ ) == 0 )) // ptr is young
1310
+ jl_gc_queue_root ((jl_value_t * )parent );
1311
+ }
1312
+
1313
+ STATIC_INLINE void jl_gc_wb_back (const void * ptr ) JL_NOTSAFEPOINT // ptr isa jl_value_t*
1314
+ {
1315
+ // if ptr is old
1316
+ if (__unlikely (jl_astaggedvalue (ptr )-> bits .gc == 3 /* GC_OLD_MARKED */ )) {
1317
+ jl_gc_queue_root ((jl_value_t * )ptr );
1318
+ }
1319
+ }
1320
+
1321
+ STATIC_INLINE void jl_gc_multi_wb (const void * parent , const jl_value_t * ptr ) JL_NOTSAFEPOINT
1322
+ {
1323
+ // 3 == GC_OLD_MARKED
1324
+ // ptr is an immutable object
1325
+ if (__likely (jl_astaggedvalue (parent )-> bits .gc != 3 ))
1326
+ return ; // parent is young or in remset
1327
+ if (__likely (jl_astaggedvalue (ptr )-> bits .gc == 3 ))
1328
+ return ; // ptr is old and not in remset (thus it does not point to young)
1329
+ jl_datatype_t * dt = (jl_datatype_t * )jl_typeof (ptr );
1330
+ const jl_datatype_layout_t * ly = dt -> layout ;
1331
+ if (ly -> npointers )
1332
+ jl_gc_queue_multiroot ((jl_value_t * )parent , ptr , dt );
1333
+ }
1334
+
1335
+ STATIC_INLINE jl_value_t * jl_genericmemory_owner (jl_genericmemory_t * m JL_PROPAGATES_ROOT ) JL_NOTSAFEPOINT ;
1336
+
1337
+ STATIC_INLINE void jl_gc_wb_genericmemory_copy_boxed (const jl_value_t * dest_owner , _Atomic (void * ) * dest_p ,
1338
+ jl_genericmemory_t * src , _Atomic (void * ) * src_p ,
1339
+ size_t * n ) JL_NOTSAFEPOINT
1340
+ {
1341
+ if (__unlikely (jl_astaggedvalue (dest_owner )-> bits .gc == 3 /* GC_OLD_MARKED */ )) {
1342
+ jl_value_t * src_owner = jl_genericmemory_owner (src );
1343
+ size_t done = 0 ;
1344
+ if (jl_astaggedvalue (src_owner )-> bits .gc != 3 /* GC_OLD_MARKED */ ) {
1345
+ if (dest_p < src_p || dest_p > src_p + (* n )) {
1346
+ for (; done < (* n ); done ++ ) { // copy forwards
1347
+ void * val = jl_atomic_load_relaxed (src_p + done );
1348
+ jl_atomic_store_release (dest_p + done , val );
1349
+ // `val` is young or old-unmarked
1350
+ if (val && !(jl_astaggedvalue (val )-> bits .gc & 1 /* GC_MARKED */ )) {
1351
+ jl_gc_queue_root (dest_owner );
1352
+ break ;
1353
+ }
1354
+ }
1355
+ src_p += done ;
1356
+ dest_p += done ;
1357
+ }
1358
+ else {
1359
+ for (; done < (* n ); done ++ ) { // copy backwards
1360
+ void * val = jl_atomic_load_relaxed (src_p + (* n ) - done - 1 );
1361
+ jl_atomic_store_release (dest_p + (* n ) - done - 1 , val );
1362
+ // `val` is young or old-unmarked
1363
+ if (val && !(jl_astaggedvalue (val )-> bits .gc & 1 /* GC_MARKED */ )) {
1364
+ jl_gc_queue_root (dest_owner );
1365
+ break ;
1366
+ }
1367
+ }
1368
+ }
1369
+ (* n ) -= done ;
1370
+ }
1371
+ }
1372
+ }
1373
+
1374
+ STATIC_INLINE void jl_gc_wb_genericmemory_copy_ptr (const jl_value_t * owner , jl_genericmemory_t * src , char * src_p ,
1375
+ size_t n , jl_datatype_t * dt ) JL_NOTSAFEPOINT
1376
+ {
1377
+ if (__unlikely (jl_astaggedvalue (owner )-> bits .gc == 3 /* GC_OLD_MARKED */ )) {
1378
+ jl_value_t * src_owner = jl_genericmemory_owner (src );
1379
+ size_t elsz = dt -> layout -> size ;
1380
+ if (jl_astaggedvalue (src_owner )-> bits .gc != 3 /* GC_OLD_MARKED */ ) {
1381
+ dt = (jl_datatype_t * )jl_tparam1 (dt );
1382
+ for (size_t done = 0 ; done < n ; done ++ ) { // copy forwards
1383
+ char * s = (char * )src_p + done * elsz ;
1384
+ if (* ((jl_value_t * * )s + dt -> layout -> first_ptr ) != NULL )
1385
+ jl_gc_queue_multiroot (owner , s , dt );
1386
+ }
1387
+ }
1388
+ }
1389
+ }
1390
+
1335
1391
STATIC_INLINE uint8_t jl_memory_uint8_ref (void * m , size_t i ) JL_NOTSAFEPOINT
1336
1392
{
1337
1393
jl_genericmemory_t * m_ = (jl_genericmemory_t * )m ;
@@ -2077,10 +2133,10 @@ JL_DLLEXPORT jl_value_t *jl_checked_assignonce(jl_binding_t *b, jl_module_t *mod
2077
2133
JL_DLLEXPORT jl_binding_partition_t * jl_declare_constant_val (jl_binding_t * b JL_ROOTING_ARGUMENT , jl_module_t * mod , jl_sym_t * var , jl_value_t * val JL_ROOTED_ARGUMENT JL_MAYBE_UNROOTED );
2078
2134
JL_DLLEXPORT jl_binding_partition_t * jl_declare_constant_val2 (jl_binding_t * b JL_ROOTING_ARGUMENT , jl_module_t * mod , jl_sym_t * var , jl_value_t * val JL_ROOTED_ARGUMENT JL_MAYBE_UNROOTED , enum jl_partition_kind );
2079
2135
JL_DLLEXPORT void jl_module_using (jl_module_t * to , jl_module_t * from );
2080
- JL_DLLEXPORT void jl_module_use (jl_module_t * to , jl_module_t * from , jl_sym_t * s );
2081
- JL_DLLEXPORT void jl_module_use_as (jl_module_t * to , jl_module_t * from , jl_sym_t * s , jl_sym_t * asname );
2082
- JL_DLLEXPORT void jl_module_import (jl_module_t * to , jl_module_t * from , jl_sym_t * s );
2083
- JL_DLLEXPORT void jl_module_import_as (jl_module_t * to , jl_module_t * from , jl_sym_t * s , jl_sym_t * asname );
2136
+ JL_DLLEXPORT void jl_module_use (jl_task_t * ct , jl_module_t * to , jl_module_t * from , jl_sym_t * s );
2137
+ JL_DLLEXPORT void jl_module_use_as (jl_task_t * ct , jl_module_t * to , jl_module_t * from , jl_sym_t * s , jl_sym_t * asname );
2138
+ JL_DLLEXPORT void jl_module_import (jl_task_t * ct , jl_module_t * to , jl_module_t * from , jl_sym_t * s );
2139
+ JL_DLLEXPORT void jl_module_import_as (jl_task_t * ct , jl_module_t * to , jl_module_t * from , jl_sym_t * s , jl_sym_t * asname );
2084
2140
JL_DLLEXPORT void jl_module_public (jl_module_t * from , jl_sym_t * s , int exported );
2085
2141
JL_DLLEXPORT int jl_is_imported (jl_module_t * m , jl_sym_t * s );
2086
2142
JL_DLLEXPORT int jl_module_exports_p (jl_module_t * m , jl_sym_t * var );
0 commit comments