|
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