@@ -1182,12 +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
- #ifndef MMTK_GC
1186
- #include "gc-wb-stock.h"
1187
- #else
1188
- #include "gc-wb-mmtk.h"
1189
- #endif
1190
-
1191
1185
JL_DLLEXPORT void jl_gc_safepoint (void );
1192
1186
JL_DLLEXPORT int jl_safepoint_suspend_thread (int tid , int waitstate );
1193
1187
JL_DLLEXPORT void jl_safepoint_suspend_all_threads (struct _jl_task_t * ct );
@@ -1250,6 +1244,18 @@ STATIC_INLINE jl_value_t *jl_svecset(
1250
1244
#define jl_array_maxsize (a ) (((jl_array_t*)(a))->ref.mem->length)
1251
1245
#define jl_array_len (a ) (jl_array_ndims(a) == 1 ? jl_array_nrows(a) : jl_array_maxsize(a))
1252
1246
1247
+ JL_DLLEXPORT JL_CONST_FUNC jl_gcframe_t * * (jl_get_pgcstack )(void ) JL_GLOBALLY_ROOTED JL_NOTSAFEPOINT ;
1248
+ #define jl_current_task (container_of(jl_get_pgcstack(), jl_task_t, gcstack))
1249
+
1250
+ STATIC_INLINE jl_value_t * jl_genericmemory_owner (jl_genericmemory_t * m JL_PROPAGATES_ROOT ) JL_NOTSAFEPOINT ;
1251
+
1252
+ // write barriers
1253
+ #ifndef MMTK_GC
1254
+ #include "gc-wb-stock.h"
1255
+ #else
1256
+ #include "gc-wb-mmtk.h"
1257
+ #endif
1258
+
1253
1259
/*
1254
1260
how - allocation style
1255
1261
0 = data is inlined
@@ -1306,94 +1312,6 @@ STATIC_INLINE jl_value_t *jl_genericmemory_ptr_set(
1306
1312
}
1307
1313
#endif
1308
1314
1309
- // GC write barriers
1310
-
1311
- STATIC_INLINE void jl_gc_wb (const void * parent , const void * ptr ) JL_NOTSAFEPOINT
1312
- {
1313
- // parent and ptr isa jl_value_t*
1314
- if (__unlikely (jl_astaggedvalue (parent )-> bits .gc == 3 /* GC_OLD_MARKED */ && // parent is old and not in remset
1315
- (jl_astaggedvalue (ptr )-> bits .gc & 1 /* GC_MARKED */ ) == 0 )) // ptr is young
1316
- jl_gc_queue_root ((jl_value_t * )parent );
1317
- }
1318
-
1319
- STATIC_INLINE void jl_gc_wb_back (const void * ptr ) JL_NOTSAFEPOINT // ptr isa jl_value_t*
1320
- {
1321
- // if ptr is old
1322
- if (__unlikely (jl_astaggedvalue (ptr )-> bits .gc == 3 /* GC_OLD_MARKED */ )) {
1323
- jl_gc_queue_root ((jl_value_t * )ptr );
1324
- }
1325
- }
1326
-
1327
- STATIC_INLINE void jl_gc_multi_wb (const void * parent , const jl_value_t * ptr ) JL_NOTSAFEPOINT
1328
- {
1329
- // 3 == GC_OLD_MARKED
1330
- // ptr is an immutable object
1331
- if (__likely (jl_astaggedvalue (parent )-> bits .gc != 3 ))
1332
- return ; // parent is young or in remset
1333
- if (__likely (jl_astaggedvalue (ptr )-> bits .gc == 3 ))
1334
- return ; // ptr is old and not in remset (thus it does not point to young)
1335
- jl_datatype_t * dt = (jl_datatype_t * )jl_typeof (ptr );
1336
- const jl_datatype_layout_t * ly = dt -> layout ;
1337
- if (ly -> npointers )
1338
- jl_gc_queue_multiroot ((jl_value_t * )parent , ptr , dt );
1339
- }
1340
-
1341
- STATIC_INLINE jl_value_t * jl_genericmemory_owner (jl_genericmemory_t * m JL_PROPAGATES_ROOT ) JL_NOTSAFEPOINT ;
1342
-
1343
- STATIC_INLINE void jl_gc_wb_genericmemory_copy_boxed (const jl_value_t * dest_owner , _Atomic (void * ) * dest_p ,
1344
- jl_genericmemory_t * src , _Atomic (void * ) * src_p ,
1345
- size_t * n ) JL_NOTSAFEPOINT
1346
- {
1347
- if (__unlikely (jl_astaggedvalue (dest_owner )-> bits .gc == 3 /* GC_OLD_MARKED */ )) {
1348
- jl_value_t * src_owner = jl_genericmemory_owner (src );
1349
- size_t done = 0 ;
1350
- if (jl_astaggedvalue (src_owner )-> bits .gc != 3 /* GC_OLD_MARKED */ ) {
1351
- if (dest_p < src_p || dest_p > src_p + (* n )) {
1352
- for (; done < (* n ); done ++ ) { // copy forwards
1353
- void * val = jl_atomic_load_relaxed (src_p + done );
1354
- jl_atomic_store_release (dest_p + done , val );
1355
- // `val` is young or old-unmarked
1356
- if (val && !(jl_astaggedvalue (val )-> bits .gc & 1 /* GC_MARKED */ )) {
1357
- jl_gc_queue_root (dest_owner );
1358
- break ;
1359
- }
1360
- }
1361
- src_p += done ;
1362
- dest_p += done ;
1363
- }
1364
- else {
1365
- for (; done < (* n ); done ++ ) { // copy backwards
1366
- void * val = jl_atomic_load_relaxed (src_p + (* n ) - done - 1 );
1367
- jl_atomic_store_release (dest_p + (* n ) - done - 1 , val );
1368
- // `val` is young or old-unmarked
1369
- if (val && !(jl_astaggedvalue (val )-> bits .gc & 1 /* GC_MARKED */ )) {
1370
- jl_gc_queue_root (dest_owner );
1371
- break ;
1372
- }
1373
- }
1374
- }
1375
- (* n ) -= done ;
1376
- }
1377
- }
1378
- }
1379
-
1380
- STATIC_INLINE void jl_gc_wb_genericmemory_copy_ptr (const jl_value_t * owner , jl_genericmemory_t * src , char * src_p ,
1381
- size_t n , jl_datatype_t * dt ) JL_NOTSAFEPOINT
1382
- {
1383
- if (__unlikely (jl_astaggedvalue (owner )-> bits .gc == 3 /* GC_OLD_MARKED */ )) {
1384
- jl_value_t * src_owner = jl_genericmemory_owner (src );
1385
- size_t elsz = dt -> layout -> size ;
1386
- if (jl_astaggedvalue (src_owner )-> bits .gc != 3 /* GC_OLD_MARKED */ ) {
1387
- dt = (jl_datatype_t * )jl_tparam1 (dt );
1388
- for (size_t done = 0 ; done < n ; done ++ ) { // copy forwards
1389
- char * s = (char * )src_p + done * elsz ;
1390
- if (* ((jl_value_t * * )s + dt -> layout -> first_ptr ) != NULL )
1391
- jl_gc_queue_multiroot (owner , s , dt );
1392
- }
1393
- }
1394
- }
1395
- }
1396
-
1397
1315
STATIC_INLINE uint8_t jl_memory_uint8_ref (void * m , size_t i ) JL_NOTSAFEPOINT
1398
1316
{
1399
1317
jl_genericmemory_t * m_ = (jl_genericmemory_t * )m ;
@@ -2407,8 +2325,6 @@ JL_DLLEXPORT void JL_NORETURN jl_throw(jl_value_t *e JL_MAYBE_UNROOTED);
2407
2325
JL_DLLEXPORT void JL_NORETURN jl_rethrow (void );
2408
2326
JL_DLLEXPORT void JL_NORETURN jl_rethrow_other (jl_value_t * e JL_MAYBE_UNROOTED );
2409
2327
JL_DLLEXPORT void JL_NORETURN jl_no_exc_handler (jl_value_t * e , jl_task_t * ct );
2410
- JL_DLLEXPORT JL_CONST_FUNC jl_gcframe_t * * (jl_get_pgcstack )(void ) JL_GLOBALLY_ROOTED JL_NOTSAFEPOINT ;
2411
- #define jl_current_task (container_of(jl_get_pgcstack(), jl_task_t, gcstack))
2412
2328
2413
2329
extern JL_DLLIMPORT int jl_task_gcstack_offset ;
2414
2330
extern JL_DLLIMPORT int jl_task_ptls_offset ;
0 commit comments