diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2021-08-25 22:01:18 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2021-08-25 22:03:26 +0300 |
commit | 2bae6c818e4e61dd9f62fdffc0cc1621a5ba40a9 (patch) | |
tree | 6d5a0849384e30e02b52a22ea4af986c9a8eaaf0 | |
parent | 96b3820d592f9f6b12ac830ee3ac59610d625532 (diff) | |
download | bdwgc-2bae6c818e4e61dd9f62fdffc0cc1621a5ba40a9.tar.gz |
Do not call GC_push_conditional unless PROC_VDB
As of now, only PROC_VDB can determine whether a static root page
is dirty. Thus, GC_push_all could be used (instead of
GC_push_conditional) in mark_rts.c for other VDB implementations.
* include/private/gcconfig.h [!PROC_VDB] (NO_VDB_FOR_STATIC_ROOTS): New
macro; add comment.
* mark_rts.c (GC_PUSH_CONDITIONAL_STATIC): New internal macro; move
comment from GC_PUSH_CONDITIONAL; mark "all" argument as used.
* mark_rts.c (GC_PUSH_CONDITIONAL): Use GC_PUSH_CONDITIONAL_STATIC();
do not test GC_DISABLE_INCREMENTAL directly.
* mark_rts.c (GC_push_conditional_with_exclusions): Remove
GC_ATTR_UNUSED for "all" argument.
-rw-r--r-- | include/private/gcconfig.h | 5 | ||||
-rw-r--r-- | mark_rts.c | 19 |
2 files changed, 17 insertions, 7 deletions
diff --git a/include/private/gcconfig.h b/include/private/gcconfig.h index 44c88581..4936d28c 100644 --- a/include/private/gcconfig.h +++ b/include/private/gcconfig.h @@ -3256,6 +3256,11 @@ EXTERN_C_BEGIN # define DEFAULT_VDB #endif +#if !defined(PROC_VDB) && !defined(NO_VDB_FOR_STATIC_ROOTS) + /* Cannot determine whether a static root page is dirty? */ +# define NO_VDB_FOR_STATIC_ROOTS +#endif + #if ((defined(UNIX_LIKE) && (defined(DARWIN) || defined(HAIKU) \ || defined(HURD) || defined(OPENBSD) \ || defined(ARM32) \ @@ -615,22 +615,27 @@ GC_API void GC_CALL GC_exclude_static_roots(void *b, void *e) UNLOCK(); } +#ifdef NO_VDB_FOR_STATIC_ROOTS +# define GC_PUSH_CONDITIONAL_STATIC(b, t, all) \ + ((void)(all), GC_push_all(b, t)) +#else +# define GC_PUSH_CONDITIONAL_STATIC(b, t, all) GC_push_conditional(b, t, all) + /* Do either of GC_push_all or GC_push_selected */ + /* depending on the third arg. */ +#endif + #if defined(WRAP_MARK_SOME) && defined(PARALLEL_MARK) # define GC_PUSH_CONDITIONAL(b, t, all) \ (GC_parallel \ ? GC_push_conditional_eager(b, t, all) \ - : GC_push_conditional(b, t, all)) -#elif defined(GC_DISABLE_INCREMENTAL) -# define GC_PUSH_CONDITIONAL(b, t, all) GC_push_all(b, t) + : GC_PUSH_CONDITIONAL_STATIC(b, t, all)) #else -# define GC_PUSH_CONDITIONAL(b, t, all) GC_push_conditional(b, t, all) - /* Do either of GC_push_all or GC_push_selected */ - /* depending on the third arg. */ +# define GC_PUSH_CONDITIONAL(b, t, all) GC_PUSH_CONDITIONAL_STATIC(b, t, all) #endif /* Invoke push_conditional on ranges that are not excluded. */ STATIC void GC_push_conditional_with_exclusions(ptr_t bottom, ptr_t top, - GC_bool all GC_ATTR_UNUSED) + GC_bool all) { while ((word)bottom < (word)top) { struct exclusion *next = GC_next_exclusion(bottom); |