summaryrefslogtreecommitdiff
path: root/mark.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2021-09-04 13:47:52 +0300
committerIvan Maidanski <ivmai@mail.ru>2021-09-04 13:47:52 +0300
commit7d17f2cdad1ebc3f2330c0602076e763da0b106b (patch)
treea56e6a4295ef11e0845ead26f75a98888c2cc83d /mark.c
parentdc254e10b44ddc1b8fa58526073c57a30361dd1e (diff)
downloadbdwgc-7d17f2cdad1ebc3f2330c0602076e763da0b106b.tar.gz
Fall back to mprotect-based VDB at runtime if no soft-dirty bit in kernel
Issue #265 (bdwgc). * doc/README.environment (GC_USE_GETWRITEWATCH): Update documentation. * doc/README.macros (GC_PREFER_MPROTECT_VDB): Likewise. * include/private/gc_priv.h [!NO_VDB_FOR_STATIC_ROOTS && !PROC_VDB] (GC_is_vdb_for_static_roots): Declare GC_INNER function. * include/private/gcconfig.h [(I386 || POWERPC || X86_64) && LINUX && __GLIBC__ && !__UCLIBC__ && !SOFT_VDB && !DEFAULT_VDB]: Do not include linux/version.h if NO_SOFT_VDB. * include/private/gcconfig.h [(I386 || POWERPC || X86_64) && LINUX && __GLIBC__ && !__UCLIBC__ && !SOFT_VDB && !DEFAULT_VDB] (SOFT_VDB): Do not define if NO_SOFT_VDB; do not depend on GC_PREFER_MPROTECT_VDB. * include/private/gcconfig.h [MPROTECT_VDB && GC_PREFER_MPROTECT_VDB] (SOFT_VDB): Do not undefine. * include/private/gcconfig.h (MPROTECT_VDB): Do not undefine if SOFT_VDB; update comment. * mark.c [!GC_DISABLE_INCREMENTAL && !NO_VDB_FOR_STATIC_ROOTS && !PROC_VDB] (GC_static_page_was_dirty): Do not examine GC_manual_vdb value; update comment * mark.c [!GC_DISABLE_INCREMENTAL && !NO_VDB_FOR_STATIC_ROOTS && !PROC_VDB] (GC_push_conditional_static): Call GC_push_all() unless GC_is_vdb_for_static_roots(). * os_dep.c: Update comment about SOFT_VDB implementation. * os_dep.c [!OS2 && !GWW_VDB && SOFT_VDB] (GC_GWW_AVAILABLE): Implement to check clear_refs_fd value. * os_dep.c [MPROTECT_VDB && !DARWIN && SOFT_VDB] (soft_dirty_init): Declare static function. * os_dep.c [MPROTECT_VDB && !DARWIN && (GWW_VDB || MSWIN32 || MSWINCE)] (GC_dirty_init): Move code upper (to be right after checking of GC_page_size). * os_dep.c [MPROTECT_VDB && !DARWIN && SOFT_VDB] (GC_dirty_init): Return true if soft_dirty_init(). * os_dep.c [SOFT_VDB] (GC_dirty_init): Rename to soft_dirty_init (and make it static) if MPROTECT_VDB; do not set soft_vdb_buf if already non-null; remove TODO about MPROTECT_VDB. * os_dep.c [SOFT_VDB && MPROTECT_VDB] (soft_dirty_init): Check GC_USE_GETWRITEWATCH environment variable (and return false if the client requested to prefer mprotect-based VDB). * os_dep.c [!GC_DISABLE_INCREMENTAL && !NO_VDB_FOR_STATIC_ROOTS && !PROC_VDB] (GC_is_vdb_for_static_roots): Implement. * tests/test.c [!GC_DISABLE_INCREMENTAL && (TEST_DEFAULT_VDB || !DEFAULT_VDB) && MPROTECT_VDB && SOFT_VDB] (enable_incremental_mode): Print message similar to the case of GWW_VDB and MPROTECT_VDB.
Diffstat (limited to 'mark.c')
-rw-r--r--mark.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/mark.c b/mark.c
index bb6ff4ae..324d518c 100644
--- a/mark.c
+++ b/mark.c
@@ -1406,11 +1406,10 @@ GC_API void GC_CALL GC_push_all(void *bottom, void *top)
# ifndef NO_VDB_FOR_STATIC_ROOTS
# ifndef PROC_VDB
/* Same as GC_page_was_dirty but h is allowed to point to some */
- /* page in the registered static roots only. */
+ /* page in the registered static roots only. Not used if */
+ /* manual VDB is on. */
STATIC GC_bool GC_static_page_was_dirty(struct hblk *h)
{
- if (GC_manual_vdb) return TRUE;
-
return get_pht_entry_from_index(GC_grungy_pages, PHT_HASH(h));
}
# endif
@@ -1424,7 +1423,7 @@ GC_API void GC_CALL GC_push_all(void *bottom, void *top)
/* process memory. */
GC_push_conditional(bottom, top, all);
# else
- if (all) {
+ if (all || !GC_is_vdb_for_static_roots()) {
GC_push_all(bottom, top);
} else {
GC_push_selected((ptr_t)bottom, (ptr_t)top,