summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2021-12-05 19:51:39 +0300
committerIvan Maidanski <ivmai@mail.ru>2021-12-05 19:52:29 +0300
commit37b6a889afafc4fd8767953f9691fbf5fcf70cf6 (patch)
tree218e8623ab27b0af1a5b5cf002b3a66b6dc13214
parente280da00e7fd68fa3c89aa0a95ec67e9621d8d70 (diff)
downloadbdwgc-37b6a889afafc4fd8767953f9691fbf5fcf70cf6.tar.gz
Fix lock assertion violation in GC_find_limit if always multi-threaded
Issue #399 (bdwgc). * misc.c [GC_ASSERTIONS && GC_ALWAYS_MULTITHREADED && (SEARCH_FOR_DATA_START || NETBSD)] (GC_init): Wrap GC_init_linux_data_start() and GC_init_netbsd_elf() calls into LOCK/UNLOCK.
-rw-r--r--misc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/misc.c b/misc.c
index f6c773e8..d5d72838 100644
--- a/misc.c
+++ b/misc.c
@@ -1213,12 +1213,20 @@ GC_API void GC_CALL GC_init(void)
/* entirety as part of the root set. This will grow them to */
/* maximum size, and is generally not desirable. */
# endif
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED) \
+ && (defined(SEARCH_FOR_DATA_START) || defined(NETBSD))
+ LOCK(); /* just to set GC_lock_holder */
+# endif
# if defined(SEARCH_FOR_DATA_START)
GC_init_linux_data_start();
# endif
# if defined(NETBSD) && defined(__ELF__)
GC_init_netbsd_elf();
# endif
+# if defined(GC_ASSERTIONS) && defined(GC_ALWAYS_MULTITHREADED) \
+ && (defined(SEARCH_FOR_DATA_START) || defined(NETBSD))
+ UNLOCK();
+# endif
# if !defined(THREADS) || defined(GC_PTHREADS) \
|| defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH) \
|| defined(GC_WIN32_THREADS) || defined(GC_SOLARIS_THREADS)