|
66 | 66 |
|
67 | 67 | typedef struct _jl_taggedvalue_t jl_taggedvalue_t; |
68 | 68 | typedef struct _jl_tls_states_t *jl_ptls_t; |
| 69 | +typedef struct _jl_genericmemory_t jl_genericmemory_t; |
69 | 70 |
|
70 | 71 | #ifdef JL_LIBRARY_EXPORTS |
71 | 72 | #include "uv.h" |
@@ -1244,6 +1245,18 @@ STATIC_INLINE jl_value_t *jl_svecset( |
1244 | 1245 | #define jl_array_maxsize(a) (((jl_array_t*)(a))->ref.mem->length) |
1245 | 1246 | #define jl_array_len(a) (jl_array_ndims(a) == 1 ? jl_array_nrows(a) : jl_array_maxsize(a)) |
1246 | 1247 |
|
| 1248 | +JL_DLLEXPORT JL_CONST_FUNC jl_gcframe_t **(jl_get_pgcstack)(void) JL_GLOBALLY_ROOTED JL_NOTSAFEPOINT; |
| 1249 | +#define jl_current_task (container_of(jl_get_pgcstack(), jl_task_t, gcstack)) |
| 1250 | + |
| 1251 | +STATIC_INLINE jl_value_t *jl_genericmemory_owner(jl_genericmemory_t *m JL_PROPAGATES_ROOT) JL_NOTSAFEPOINT; |
| 1252 | + |
| 1253 | +// write barriers |
| 1254 | +#ifndef MMTK_GC |
| 1255 | +#include "gc-wb-stock.h" |
| 1256 | +#else |
| 1257 | +#include "gc-wb-mmtk.h" |
| 1258 | +#endif |
| 1259 | + |
1247 | 1260 | /* |
1248 | 1261 | how - allocation style |
1249 | 1262 | 0 = data is inlined |
@@ -1300,94 +1313,6 @@ STATIC_INLINE jl_value_t *jl_genericmemory_ptr_set( |
1300 | 1313 | } |
1301 | 1314 | #endif |
1302 | 1315 |
|
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 | | - |
1391 | 1316 | STATIC_INLINE uint8_t jl_memory_uint8_ref(void *m, size_t i) JL_NOTSAFEPOINT |
1392 | 1317 | { |
1393 | 1318 | jl_genericmemory_t *m_ = (jl_genericmemory_t*)m; |
@@ -2402,8 +2327,6 @@ JL_DLLEXPORT void JL_NORETURN jl_throw(jl_value_t *e JL_MAYBE_UNROOTED); |
2402 | 2327 | JL_DLLEXPORT void JL_NORETURN jl_rethrow(void); |
2403 | 2328 | JL_DLLEXPORT void JL_NORETURN jl_rethrow_other(jl_value_t *e JL_MAYBE_UNROOTED); |
2404 | 2329 | JL_DLLEXPORT void JL_NORETURN jl_no_exc_handler(jl_value_t *e, jl_task_t *ct); |
2405 | | -JL_DLLEXPORT JL_CONST_FUNC jl_gcframe_t **(jl_get_pgcstack)(void) JL_GLOBALLY_ROOTED JL_NOTSAFEPOINT; |
2406 | | -#define jl_current_task (container_of(jl_get_pgcstack(), jl_task_t, gcstack)) |
2407 | 2330 |
|
2408 | 2331 | extern JL_DLLIMPORT int jl_task_gcstack_offset; |
2409 | 2332 | extern JL_DLLIMPORT int jl_task_ptls_offset; |
|
0 commit comments