From 2bae6c818e4e61dd9f62fdffc0cc1621a5ba40a9 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Wed, 25 Aug 2021 22:01:18 +0300 Subject: 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. --- include/private/gcconfig.h | 5 +++++ 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) \ diff --git a/mark_rts.c b/mark_rts.c index 6a576681..3a115508 100644 --- a/mark_rts.c +++ b/mark_rts.c @@ -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); -- cgit v1.2.1