diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2021-09-04 13:47:52 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2021-09-04 13:47:52 +0300 |
commit | 7d17f2cdad1ebc3f2330c0602076e763da0b106b (patch) | |
tree | a56e6a4295ef11e0845ead26f75a98888c2cc83d /mark.c | |
parent | dc254e10b44ddc1b8fa58526073c57a30361dd1e (diff) | |
download | bdwgc-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.c | 7 |
1 files changed, 3 insertions, 4 deletions
@@ -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, |