Projects
Mega:23.09
gc
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 3
View file
_service:tar_scm:gc.spec
Changed
@@ -1,10 +1,10 @@ Name: gc -Version: 8.2.2 +Version: 8.2.4 Release: 1 Summary: A garbage collector for C and C++ License: BSD and GPLv1+ Url: http://www.hboehm.info/gc/ -Source0: http://www.hboehm.info/gc/gc_source/gc-%{version}.tar.gz +Source0: https://github.com/ivmai/bdwgc/releases/download/v%{version}/gc-%{version}.tar.gz Patch1: gc-8.0.6-sw.patch Patch2: 0001-add-loongarch-architecture.patch @@ -75,10 +75,13 @@ %changelog +* Sun Oct 8 2023 huyubiao <huyubiao@huawei.com> - 8.2.4-1 +- Update gc to 8.2.4 + * Thu Feb 2 2023 huyubiao <huyubiao@huawei.com> - 8.2.2-1 - Update gc to 8.2.2 -* Tue Nov 21 2022 doupengda <doupengda@loongson.cn> - 8.0.6-4 +* Mon Nov 21 2022 doupengda <doupengda@loongson.cn> - 8.0.6-4 - add loongarch64 support * Mon Nov 14 2022 wuzx<wuzx1226@qq.com> - 8.0.6-3
View file
_service:tar_scm:0001-add-loongarch-architecture.patch
Changed
@@ -38,7 +38,7 @@ +# define LOONGARCH64 +# define mach_type_known +# endif - # if defined(mips) || defined(__mips) || defined(_mips) + # if (defined(mips) || defined(__mips) || defined(_mips)) && !defined(__TANDEM) # define MIPS # if defined(nec_ews) || defined(_nec_ews) @@ -518,6 +526,10 @@ EXTERN_C_BEGIN
View file
_service
Changed
@@ -2,7 +2,7 @@ <service name="tar_scm"> <param name="url">git@gitee.com:src-openeuler/gc.git</param> <param name="scm">git</param> - <param name="revision">openEuler-23.09</param> + <param name="revision">master</param> <param name="exclude">*</param> <param name="extract">*</param> </service>
View file
_service:tar_scm:gc-8.2.2.tar.gz/AUTHORS -> _service:tar_scm:gc-8.2.4.tar.gz/AUTHORS
Changed
@@ -41,6 +41,7 @@ Alexis Laferriere <alexis.laf@xymus.net> Alistair G. Crooks <agc@uts.amdahl.com> Allan Hsu <allan@counterpop.net> +Amaury Sechet <deadalnix@gmail.com> Andre Leiradella <andre@leiradella.com> Andreas Jaeger <aj@suse.de> Andreas Tobler <andreastt@gmail.com> @@ -260,6 +261,7 @@ Knut Tvedten <knuttv@ifi.uio.no> Krister Walfridsson <cato@df.lth.se> Kristian Kristensen <kk@cs.aau.dk> +Kristian Larsson <kristian@spritelink.net> Kumar Srikantan Kurt Miller <kurt@intricatesoftware.com> Lars Farm <lars.farm@ite.mh.se> @@ -268,6 +270,7 @@ Linas Vepstas <linasvepstas@gmail.com> Loren J. Rittle <rittle@latour.labs.mot.com> Louis Zhuang <louis.zhuang@acm.org> +Lucas Holt <luke@foolishgames.com> Lucas Meijer <lucas@unity3d.com> Ludovic Courtes <ludo@gnu.org> Maarten Thibaut <mthibaut@cisco.com> @@ -383,6 +386,7 @@ Ryan Gonzalez <rymg19@gmail.com> Ryan Murray <rmurray@debian.org> Salvador Eduardo Tropea <salvador@inti.gov.ar> +Sam James <sam@gentoo.org> Samuel Martin <s.martin49@gmail.com> Samuel Thibault <samuel.thibault@gnu.org> Scott Ananian <cananian@lesser-magoo.lcs.mit.edu>
View file
_service:tar_scm:gc-8.2.2.tar.gz/CMakeLists.txt -> _service:tar_scm:gc-8.2.4.tar.gz/CMakeLists.txt
Changed
@@ -24,14 +24,14 @@ cmake_minimum_required(VERSION 3.1) -set(PACKAGE_VERSION 8.2.2) +set(PACKAGE_VERSION 8.2.4) # Version must match that in AC_INIT of configure.ac and that in README. # Version must conform to: 0-9+.0-9+.0-9+ # Info (current:revision:age) for the Libtool versioning system. # These values should match those in cord/cord.am and Makefile.am. set(LIBCORD_VER_INFO 6:0:5) -set(LIBGC_VER_INFO 6:1:5) +set(LIBGC_VER_INFO 6:2:5) set(LIBGCCPP_VER_INFO 6:0:5) option(enable_cplusplus "C++ support" OFF) @@ -41,6 +41,11 @@ project(gc C) endif() +if (POLICY CMP0057) + # Required for CheckLinkerFlag, at least. + cmake_policy(SET CMP0057 NEW) +endif() + include(CheckCCompilerFlag) include(CheckCSourceCompiles) include(CheckFunctionExists) @@ -50,6 +55,10 @@ include(CTest) include(GNUInstallDirs) +if (NOT (${CMAKE_VERSION} VERSION_LESS "3.18.0")) + include(CheckLinkerFlag) +endif() + # Customize the build by passing "-D<option_name>=ON|OFF" in the command line. option(BUILD_SHARED_LIBS "Build shared libraries" ON) option(build_cord "Build cord library" ON) @@ -79,6 +88,7 @@ option(enable_single_obj_compilation "Compile all libgc source files into single .o" OFF) option(enable_handle_fork "Attempt to ensure a usable collector after fork()" ON) option(disable_handle_fork "Prohibit installation of pthread_atfork() handlers" OFF) +option(enable_emscripten_asyncify "Use Emscripten asyncify feature" OFF) option(install_headers "Install header and pkg-config metadata files" ON) option(without_libatomic_ops "Use atomic_ops.h in libatomic_ops/src" OFF) @@ -138,6 +148,10 @@ add_definitions("-D_CRT_SECURE_NO_DEPRECATE") elseif (WATCOM) add_compile_options(/wx) + if (NOT enable_threads) + # Suppress "unreachable code" warning in GC_ASSERT(I_HOLD_LOCK()). + add_compile_options(/wcd=201) + endif() else() # TODO add -Wpedantic -Wno-long-long add_compile_options(-Wall -Wextra) @@ -347,6 +361,11 @@ if (enable_werror) if (BORLAND) add_compile_options(/w!) + if (enable_threads) + # Workaround "function should return a value" warning for several + # asm functions in atomic_ops/sysdeps/msftc/x86.h. + add_compile_options(/w-rvl) + endif(enable_threads) elseif (MSVC) add_compile_options(/WX) # Workaround "typedef ignored on left of ..." warning reported in @@ -402,7 +421,13 @@ else() add_definitions("-DGC_NO_VISIBILITY") endif() - check_c_compiler_flag(-Wl,--no-undefined HAVE_FLAG_WL_NO_UNDEFINED) + if (${CMAKE_VERSION} VERSION_LESS "3.18.0") + set(WL_NO_UNDEFINED_OPT "-Wl,--no-undefined") + check_c_compiler_flag(${WL_NO_UNDEFINED_OPT} HAVE_FLAG_WL_NO_UNDEFINED) + else() + set(WL_NO_UNDEFINED_OPT "LINKER:--no-undefined") + check_linker_flag(C "${WL_NO_UNDEFINED_OPT}" HAVE_FLAG_WL_NO_UNDEFINED) + endif() else() add_definitions("-DGC_NOT_DLL") if (WIN32) @@ -450,6 +475,7 @@ # pthread_setname_np, if available, may have 1, 2 or 3 arguments. if (CMAKE_USE_PTHREADS_INIT) check_c_source_compiles(" +#define _GNU_SOURCE 1\n #include <pthread.h>\n int main(void) { (void)pthread_setname_np(\"thread-name\"); return 0; }" HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID) @@ -458,6 +484,7 @@ add_definitions("-DHAVE_PTHREAD_SETNAME_NP_WITHOUT_TID") else() check_c_source_compiles(" +#define _GNU_SOURCE 1\n #include <pthread.h>\n int main(void) {\n (void)pthread_setname_np(pthread_self(), \"thread-name-%u\", 0); return 0; }" @@ -467,9 +494,7 @@ add_definitions("-DHAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG") else() check_c_source_compiles(" -#if defined(__linux__) || defined(__GLIBC__) || defined(__GNU__) || defined(__CYGWIN__)\n #define _GNU_SOURCE 1\n -#endif\n #include <pthread.h>\n int main(void) {\n (void)pthread_setname_np(pthread_self(), \"thread-name\"); return 0; }" @@ -493,6 +518,22 @@ add_definitions("-DHAVE_DLADDR") endif() +# Check for emscripten; use asyncify feature if requested. +check_c_source_compiles(" +#ifndef __EMSCRIPTEN__\n +# error This is not Emscripten\n +#endif\n +int main(void) { return 0; }" + EMSCRIPTEN) +if (EMSCRIPTEN AND enable_emscripten_asyncify) + # Use this option if your program is targeting -sASYNCIFY. The latter is + # required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for + # gctest only. + add_definitions("-DEMSCRIPTEN_ASYNCIFY") + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000") +endif() + add_library(gc ${SRC}) target_link_libraries(gc PRIVATE ${THREADDLLIBS_LIST} ${ATOMIC_OPS_LIBS}) target_include_directories(gc INTERFACE @@ -535,17 +576,29 @@ if (BUILD_SHARED_LIBS AND HAVE_FLAG_WL_NO_UNDEFINED) # Declare that the libraries do not refer to external symbols. - # TODO: use add_link_options() when cmake_minimum_required > 3.13 - target_link_libraries(gc PRIVATE -Wl,--no-undefined) - if (enable_cplusplus) - target_link_libraries(gccpp PRIVATE -Wl,--no-undefined) - if (enable_throw_bad_alloc_library) - target_link_libraries(gctba PRIVATE -Wl,--no-undefined) - endif(enable_throw_bad_alloc_library) - endif(enable_cplusplus) - if (build_cord) - target_link_libraries(cord PRIVATE -Wl,--no-undefined) - endif(build_cord) + if (${CMAKE_VERSION} VERSION_LESS "3.13.0") + target_link_libraries(gc PRIVATE ${WL_NO_UNDEFINED_OPT}) + if (enable_cplusplus) + target_link_libraries(gccpp PRIVATE ${WL_NO_UNDEFINED_OPT}) + if (enable_throw_bad_alloc_library) + target_link_libraries(gctba PRIVATE ${WL_NO_UNDEFINED_OPT}) + endif(enable_throw_bad_alloc_library) + endif(enable_cplusplus) + if (build_cord) + target_link_libraries(cord PRIVATE ${WL_NO_UNDEFINED_OPT}) + endif(build_cord) + else() + target_link_options(gc PRIVATE ${WL_NO_UNDEFINED_OPT}) + if (enable_cplusplus) + target_link_options(gccpp PRIVATE ${WL_NO_UNDEFINED_OPT}) + if (enable_throw_bad_alloc_library) + target_link_options(gctba PRIVATE ${WL_NO_UNDEFINED_OPT}) + endif(enable_throw_bad_alloc_library) + endif(enable_cplusplus) + if (build_cord) + target_link_options(cord PRIVATE ${WL_NO_UNDEFINED_OPT}) + endif(build_cord) + endif() endif() if (BUILD_SHARED_LIBS)
View file
_service:tar_scm:gc-8.2.2.tar.gz/ChangeLog -> _service:tar_scm:gc-8.2.4.tar.gz/ChangeLog
Changed
@@ -1,4 +1,98 @@ +== 8.2.4 2023-05-26 == + +* Abort with appropriate message if first call of mmap fails with EPERM +* Adjust CORD_ec comment placement in ec.h +* Adjust WoW64 workaround to work on UWP/WinRT +* Adjust naming of Win32/64 and x86/64 words in comments and documentation +* Avoid potential race between realloc and GC_block_was_dirty +* Do not double-clear first two words of object in GC_generic_malloc_aligned +* Do not mention FASTLOCK in comment +* Do not mix debug and non-debug allocations in disclaim tests +* Do not prohibit threaded builds with malloc redirection on non-Linux +* Do not prohibit zero proc argument in GC_register_disclaim_proc +* Eliminate '&array may not produce intended result' wcc warnings +* Eliminate 'GC_unmap_end declared but unused' bcc warning in disclaim_bench +* Eliminate 'ISO C++17 does not allow register specifier' gcc warning +* Eliminate 'cast signed to bigger unsigned' CSA warning in WARNs, new_thread +* Eliminate 'n obtained from untrusted source' code defect FP in test_cpp +* Eliminate 'skipping config since MAXSIG/_NSIG is unknown' cppcheck FP +* Eliminate data race FP between remove_protection and write_fault_handler +* Eliminate data race FP reported in need_unreachable_finalization by TSan +* Ensure 'new' system header is included by gc_cpp.h if GC_INCLUDE_NEW +* Ensure GC_NO_PTHREAD_SIGMASK defined if no GC_pthread_sigmask prototype +* Fix 'EMSCRIPTEN macro redefined' compile error +* Fix 'ISO C90 forbids mixed decl and code' warning in SOFT_VDB dirty_init +* Fix 'call to undeclared pthread_setname_np' errors in configure and cmake +* Fix 'failed to create new win32 semaphore' Cygwin fatal error at fork +* Fix 'operator new is missing throw(bad_alloc)' clang warning in gc_cpp.h +* Fix 'overflow in conversion from word' g++ warning in GC_init +* Fix 'unknown option --no-undefined' linker error in cmake script (OS X) +* Fix 'unresolved _end' linker error when targeting Android bitcode +* Fix CORD_next() indent inside loop in test_basics() of cordtest +* Fix DCL_LOCK_STATE placement in GC_set_oom_fn +* Fix GC_excl_table overrun on overflow in GC_exclude_static_roots +* Fix GC_thread_is_registered for finished threads +* Fix GC_unreachable_finalize_mark_proc to ensure its unique address +* Fix GC_unregister_my_thread call before GC functions usage in gctest +* Fix IRIX5 defined wrongly on FreeBSD/mips, WinCE/mips, Tandem S-Series +* Fix allocated objects count increment in alloc8bytes of gctest +* Fix alt-stack handling in GC_push_all_stacks if stack grows up +* Fix comparisons to heap boundary in GC_get_back_ptr_info and GC_mark_from +* Fix data race in GC_heapsize_at_forced_unmap variable +* Fix description of client promise for IGNORE_OFF_PAGE allocated objects +* Fix disabling of automatic dynamic libraries registration +* Fix double initialization of main thread local free lists on Win32 +* Fix gccpp and gctba library names in gcinterface.md +* Fix infinite loop in disable_gc_for_dlopen and GC_wait_for_gc_completion +* Fix infinite wait in pthread_join/detach if thread already finished (Win32) +* Fix joinable threads shutdown on NaCl +* Fix loop condition over dll_thread_table in GC_lookup_pthread (Win32) +* Fix missing GC_CALLBACK for GC_waitForSingleObjectInfinite +* Fix missing extern C for __asan_default_options +* Fix missing libalphagc.so dependency in Makefile.direct +* Fix missing lock while updating GC_in_thread_creation in GC_exit_check +* Fix missing recovery from faults in GC_mark_some on Win64 if MinGW +* Fix missing result check of pthread_attr_getdetachstate in pthread_create +* Fix mistyped function name in documentation of REDIRECT_REALLOC +* Fix negative heap size values reported in WARN +* Fix null pointer dereference in TRACE_TARGET +* Fix of GC_bytes_allocd increment in GC_generic_malloc_inner +* Fix overlapping region assertion in mark_some if malloc redirect on Linux +* Fix potential SIGSEGV on out-of-memory in gctest +* Fix signals delivery fail in find-leak mode if init from non-main thread +* Fix stack top/bottom print order in GC_push_all_stacks if stack grows up +* Fix store-and-dirty call in GC_CONS +* Fix unregistering of thread created by intercepted pthread_create on NaCl +* Fix unused GC_parse_version if no SOFT_VDB and no parallel mark on Linux +* Fix use of unset errno after pthread_create/sigmask calls +* Fix various typos in comments and documentation +* Increment allocated objects count after GC_GCJ_MALLOC() in gctest +* Invoke GC_oom_fn if GC_make_array_descriptor failed because of no memory +* Make Emscripten Asyncify feature optional +* Mention gctba library in README.cmake +* Prevent 'function should return a value' BCC error in CMake script +* Provide meaningful error message in case of Emscripten threaded build +* Reduce local variable scope in resend_lost_signals_retry for cppcheck +* Remove disable-warning options from WCC_MAKEFILE unrecognized by wcc v2.0 +* Remove false warning of missing libpthread.so on Linux +* Remove redundant 'ifdef THREADS' around LOCK/UNLOCK in call_with_alloc_lock +* Remove redundant GC_ATTR_UNUSED for GC_mark_and_push +* Remove unused GC_old_sig_mask from gc_locks.h +* Replace WARN in GC_mark_some wrapper back to GC_COND_LOG_PRINTF +* Specify throw and noexcept for operator new/delete in gc_cpp.h for MS VC +* Support Hurd/x86_64 +* Support client-defined stack pointer adjustment before thread stack push +* Suppress 'unreachable code' wcc warning in I_HOLD_LOCK assertion (CMake) +* Update autotools for release preparation (ac-2.71, am-1.16.5, m4-1.14.19) +* Update dump function name in GC_DUMP_REGULARLY variable documentation +* Use emscripten_stack_get_base instead of emscripten_scan_stack +* Use sbrk() to get OS memory on Emscripten +* Workaround 'writing into region of size 0' gcc warning in suspend_handler +* Workaround CSA null pointer dereference FP in invalidate_map of cord/de +* Workaround a malfunction of soft-dirty bits clearing on Power9 + + == 8.2.2 2022-08-26 == * Abort if no progress with thread suspend/resume signals resending @@ -345,13 +439,35 @@ * Use clock_gettime() instead of clock() on Cygwin and Linux * Use compiler TLS on FreeBSD and NetBSD * Use mprotect-based VDB on PowerPC and S390 (Linux) -* Use soft dirty bits on Linux (i386, powerpc, s390, x86_64) +* Use soft dirty bits on Linux (x86, powerpc, s390, x64) * Workaround 'condition result<=0 is always false' cppcheck FP in get_maps * Workaround 'push_regs configured incorrectly' error (GCC-11) * Workaround 'same value in both branches of ternary operator' cppcheck FP * Workaround various cppcheck false positives +== 8.0.10 2023-05-26 == + +* Abort with appropriate message if first call of mmap fails with EPERM +* Avoid potential race between realloc and GC_block_was_dirty +* Do not prohibit zero proc argument in GC_register_disclaim_proc +* Eliminate '&array may not produce intended result' wcc warnings +* Eliminate 'cast signed to bigger unsigned' CSA warning in GC_new_thread +* Ensure 'new' system header is included by gc_cpp.h if GC_INCLUDE_NEW +* Fix 'overflow in conversion from word' g++ warning in GC_init +* Fix description of client promise for IGNORE_OFF_PAGE allocated objects +* Fix infinite loop in disable_gc_for_dlopen and GC_wait_for_gc_completion +* Fix missing extern C for __asan_default_options +* Fix store-and-dirty call in GC_CONS +* Fix typo in comment of GC_Thread_Rep.dummy +* Fix use of unset errno after pthread_sigmask calls +* Increment allocated objects count after GC_GCJ_MALLOC() in gctest +* Remove redundant GC_ATTR_UNUSED for GC_mark_and_push +* Workaround CSA null pointer dereference FP in invalidate_map of cord/de + +Also, includes 7.6.18 changes + + == 8.0.8 2022-08-26 == * Avoid potential race in GC_init_real_syms after GC_allow_register_threads @@ -846,6 +962,15 @@ * Workaround Thread Sanitizer (TSan) false positive warnings +== 7.6.18 2023-05-26 == + +* Fix IRIX5 defined wrongly on FreeBSD/mips +* Fix alt-stack handling in GC_push_all_stacks if stack grows up +* Fix data race in GC_heapsize_at_forced_unmap variable + +Also, includes 7.4.24 changes + + == 7.6.16 2022-08-26 == * Do not send signal to thread which is suspended manually @@ -1077,7 +1202,7 @@ * Fix typo in comment in specific.h * Fix unbounded heap growth in case of intensive disappearing links usage * Remove API symbols renaming in WCC_MAKEFILE -* Support Haiku/amd64 and Haiku/x86 hosts +* Support Haiku/x64 and Haiku/x86 hosts * Support threads for DragonFly in configure * Workaround 'address of auto-variable returned' cppcheck error * Workaround gctest hang on kFreeBSD (if thread-local allocations are on) @@ -1393,7 +1518,7 @@ * Show WoW64 warning message if running 32-bit on Win64 (enabled by macro) * Standalone profiling callback for threads suspend/resume * Support (add machine description for) TILE-Gx and TILEPro targets -* Support build for Android 64-bit (arm64, mips64, x86_64) +* Support build for Android 64-bit (arm64, mips64, x64) * Support FreeBSD/aarch64, FreeBSD/mips * Support iOS7 64-bit (AArch64) and iOS8+ 32/64-bit (Darwin) * Support MinGW build in scripts @@ -1406,6 +1531,22 @@ Also, includes 7.4.4 changes +== 7.4.24 2023-05-25 == + +* Adjust CORD_ec comment placement in ec.h +* Do not mix debug and non-debug allocations in disclaim tests +* Eliminate 'cast signed to bigger unsigned' CSA warning in WARN calls +* Ensure GC_NO_PTHREAD_SIGMASK defined if no GC_pthread_sigmask prototype +* Fix GC_thread_is_registered for finished threads +* Fix GC_unregister_my_thread call before GC functions usage in gctest +* Fix missing lock while updating GC_in_thread_creation in GC_exit_check +* Fix null pointer dereference in TRACE_TARGET +* Fix of GC_bytes_allocd increment in GC_generic_malloc_inner +* Remove redundant 'ifdef THREADS' around LOCK/UNLOCK in call_with_alloc_lock + +Also, includes 7.2q changes. + + == 7.4.22 2022-08-26 == * Eliminate 'new_l may be used uninitialized' gcc warning in os_dep (Cygwin) @@ -1622,7 +1763,7 @@ == 7.4.4 2016-05-25 == * Allow GC_FAST_MALLOC_GRANS() multiple use in a function -* Also enable the TSX workaround for i386 (Linux) +* Also enable the TSX workaround for Linux/x86 * Avoid unstructured procfs on Solaris
View file
_service:tar_scm:gc-8.2.2.tar.gz/Makefile.am -> _service:tar_scm:gc-8.2.4.tar.gz/Makefile.am
Changed
@@ -14,7 +14,7 @@ # Info (current:revision:age) for the Libtool versioning system. # These numbers should be updated at most once just before the release, # and, optionally, at most once during the development (after the release). -LIBGC_VER_INFO = 6:1:5 +LIBGC_VER_INFO = 6:2:5 LIBGCCPP_VER_INFO = 6:0:5 ## FIXME: `make distcheck' in this directory will not currently work.
View file
_service:tar_scm:gc-8.2.2.tar.gz/Makefile.direct -> _service:tar_scm:gc-8.2.4.tar.gz/Makefile.direct
Changed
@@ -81,7 +81,7 @@ RANLIB= ranlib # For EMX, replace "ranlib" with "ar s". - +# All .o files of libgc.a except for dyn_load.o. OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o \ headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o \ malloc.o checksums.o pthread_support.o pthread_stop_world.o \ @@ -270,7 +270,7 @@ ln sunos5gc.so libgc.so # Alpha/OSF shared library version of the collector -libalphagc.so: $(OBJS) +libalphagc.so: $(OBJS) dyn_load.o $(LD) -shared -o libalphagc.so $(OBJS) dyn_load.o -lc ln libalphagc.so libgc.so
View file
_service:tar_scm:gc-8.2.2.tar.gz/Makefile.in -> _service:tar_scm:gc-8.2.4.tar.gz/Makefile.in
Changed
@@ -916,7 +916,6 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ $(CFLAGS_EXTRA) CFLAGS_EXTRA = @CFLAGS_EXTRA@ -CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ @@ -939,6 +938,7 @@ EXEEXT = @EXEEXT@ EXTRA_TEST_LIBS = @EXTRA_TEST_LIBS@ FGREP = @FGREP@ +FILECMD = @FILECMD@ GC_CFLAGS = @GC_CFLAGS@ GC_VERSION = @GC_VERSION@ GREP = @GREP@ @@ -1050,7 +1050,7 @@ # Info (current:revision:age) for the Libtool versioning system. # These numbers should be updated at most once just before the release, # and, optionally, at most once during the development (after the release). -LIBGC_VER_INFO = 6:1:5 +LIBGC_VER_INFO = 6:2:5 LIBGCCPP_VER_INFO = 6:0:5 # We currently use the source files directly from libatomic_ops, if we @@ -1208,8 +1208,8 @@ gctest_DEPENDENCIES = $(top_builddir)/libgc.la @EMSCRIPTEN_TRUE@gctest_html_SOURCES = $(gctest_SOURCES) @EMSCRIPTEN_TRUE@gctest_html_LDADD = $(gctest_LDADD) -# Bug in the linker not being able to determine that _memalign and -# _memalign is needed? it's part of mmap. +# Bug in the linker not being able to determine that _memalign and _memset +# are needed? it's part of mmap. @EMSCRIPTEN_TRUE@gctest_html_LDFLAGS = -s "EXPORTED_FUNCTIONS='_memalign', '_main', '_memset'" leaktest_SOURCES = tests/leak_test.c leaktest_LDADD = $(test_ldadd)
View file
_service:tar_scm:gc-8.2.2.tar.gz/NT_MAKEFILE -> _service:tar_scm:gc-8.2.4.tar.gz/NT_MAKEFILE
Changed
@@ -1,4 +1,4 @@ -# Makefile for Windows NT. Assumes Microsoft compiler. +# Makefile for Windows (Win32/64). Assumes Microsoft compiler. # Should be invoked as "nmake -f NT_MAKEFILE <args>"; the optional arguments # are: "cpu=AMD64" - to target x64, "cpu=i386" - to target x86, # "enable_static=1" - to build it as a static library, "nodebug=1" - to produce @@ -84,7 +84,7 @@ .SUFFIXES: .SUFFIXES: .obj .cpp .c -# Atomic_ops installation directory. For win32, the source directory +# Atomic_ops installation directory. For Win32, the source directory # should do, since we only need the headers. # We assume this was manually unpacked. AO_SRC_DIR=libatomic_ops/src @@ -159,7 +159,7 @@ cord\tests\de_win.res: cord\tests\de_win.rc cord\tests\de_win.h cord\tests\de_cmds.h $(rc) $(rcvars) -r -fo cord\tests\de_win.res cord\tests\de_win.rc -# Cord/de is a real win32 GUI app. +# Cord/de is a real Windows GUI app. de.exe: cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib cord.lib $(link) /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) -out:de.exe cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib cord.lib gdi32.lib user32.lib
View file
_service:tar_scm:gc-8.2.2.tar.gz/README.md -> _service:tar_scm:gc-8.2.4.tar.gz/README.md
Changed
@@ -1,6 +1,6 @@ # Boehm-Demers-Weiser Garbage Collector -This is version 8.2.2 of a conservative garbage +This is version 8.2.4 of a conservative garbage collector for C and C++. @@ -213,7 +213,7 @@ The collector currently is designed to run essentially unmodified on machines that use a flat 32-bit or 64-bit address space. -That includes the vast majority of Workstations and X86 (X >= 3) PCs. +That includes the vast majority of Workstations and x86 (i386 or later) PCs. In a few cases (Amiga, OS/2, Win32, MacOS) a separate makefile or equivalent is supplied. Many of these have separate README.system @@ -221,7 +221,7 @@ Dynamic libraries are completely supported only under SunOS/Solaris, (and even that support is not functional on the last Sun 3 release), -Linux, FreeBSD, NetBSD, IRIX 5&6, HP/UX, Win32 (not Win32S) and OSF/1 +Linux, FreeBSD, NetBSD, IRIX 5&6, HP/UX, Win32 (not win32s) and OSF/1 on DEC AXP machines plus perhaps a few others listed near the top of dyn_load.c. On other machines we recommend that you do one of the following: @@ -297,8 +297,9 @@ frequent collections at program startup.) 6. `GC_malloc_ignore_off_page(bytes)` - Identical to `GC_malloc`, but the - client promises to keep a pointer to the somewhere within the first 256 - bytes of the object while it is live. (This pointer should normally be + client promises to keep a pointer to the somewhere within the first GC + heap block (512 .. 4096 bytes or even more, depending on the configuration) + of the object while it is live. (This pointer should normally be declared volatile to prevent interference from compiler optimizations.) This is the recommended way to allocate anything that is likely to be larger than 100 KB or so. (`GC_malloc` may result in a failure to reclaim
View file
_service:tar_scm:gc-8.2.2.tar.gz/WCC_MAKEFILE -> _service:tar_scm:gc-8.2.4.tar.gz/WCC_MAKEFILE
Changed
@@ -259,7 +259,7 @@ $(CXX) $(TEST_CXXFLAGS) $*.cc test.obj: tests\test.c .AUTODEPEND - $(CC) $(TEST_CFLAGS) /wcd=13 /wcd=201 /wcd=367 /wcd=368 tests\test.c + $(CC) $(TEST_CFLAGS) /wcd=201 tests\test.c cordtest.obj: cord\tests\cordtest.c .AUTODEPEND $(CC) $(TEST_CFLAGS) $(CORDFLAG) cord\tests\cordtest.c test_cpp.obj: tests\test_cpp.cc .AUTODEPEND
View file
_service:tar_scm:gc-8.2.2.tar.gz/aclocal.m4 -> _service:tar_scm:gc-8.2.4.tar.gz/aclocal.m4
Changed
@@ -14,8 +14,8 @@ m4_ifndef(AC_CONFIG_MACRO_DIRS, m4_defun(_AM_CONFIG_MACRO_DIRS, )m4_defun(AC_CONFIG_MACRO_DIRS, _AM_CONFIG_MACRO_DIRS($@))) m4_ifndef(AC_AUTOCONF_VERSION, m4_copy(m4_PACKAGE_VERSION, AC_AUTOCONF_VERSION))dnl -m4_if(m4_defn(AC_AUTOCONF_VERSION), 2.69,, -m4_warning(this file was generated for autoconf 2.69. +m4_if(m4_defn(AC_AUTOCONF_VERSION), 2.71,, +m4_warning(this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.))
View file
_service:tar_scm:gc-8.2.2.tar.gz/allchblk.c -> _service:tar_scm:gc-8.2.4.tar.gz/allchblk.c
Changed
@@ -827,9 +827,9 @@ if (++GC_large_alloc_warn_suppressed >= GC_large_alloc_warn_interval) { WARN("Repeated allocation of very large block " - "(appr. size %" WARN_PRIdPTR "):\n" + "(appr. size %" WARN_PRIuPTR " KiB):\n" "\tMay lead to memory leak and poor performance\n", - size_needed); + (word)size_needed >> 10); GC_large_alloc_warn_suppressed = 0; } size_avail = orig_avail;
View file
_service:tar_scm:gc-8.2.2.tar.gz/alloc.c -> _service:tar_scm:gc-8.2.4.tar.gz/alloc.c
Changed
@@ -417,9 +417,11 @@ if (!GC_incremental) return; LOCK(); GC_should_start_incremental_collection = TRUE; - ENTER_GC(); - GC_collect_a_little_inner(1); - EXIT_GC(); + if (!GC_dont_gc) { + ENTER_GC(); + GC_collect_a_little_inner(1); + EXIT_GC(); + } UNLOCK(); # endif } @@ -715,8 +717,6 @@ IF_CANCEL(int cancel_state;) GC_ASSERT(I_HOLD_LOCK()); - if (GC_dont_gc) return; - DISABLE_CANCEL(cancel_state); if (GC_incremental && GC_collection_in_progress()) { int i; @@ -734,7 +734,7 @@ GC_parallel_mark_disabled = FALSE; # endif - if (i < max_deficit) { + if (i < max_deficit && !GC_dont_gc) { /* Need to finish a collection. */ # ifdef SAVE_CALL_CHAIN GC_save_callers(GC_last_stack); @@ -765,7 +765,7 @@ if (GC_deficit < 0) GC_deficit = 0; } - } else { + } else if (!GC_dont_gc) { GC_maybe_gc(); } RESTORE_CANCEL(cancel_state); @@ -780,9 +780,11 @@ DCL_LOCK_STATE; LOCK(); - ENTER_GC(); - GC_collect_a_little_inner(1); - EXIT_GC(); + if (!GC_dont_gc) { + ENTER_GC(); + GC_collect_a_little_inner(1); + EXIT_GC(); + } result = (int)GC_collection_in_progress(); UNLOCK(); if (!result && GC_debugging_started) GC_print_all_smashed(); @@ -1271,9 +1273,12 @@ # endif } +STATIC word GC_heapsize_at_forced_unmap = 0; + /* accessed with the allocation lock held */ + /* If stop_func == 0 then GC_default_stop_func is used instead. */ STATIC GC_bool GC_try_to_collect_general(GC_stop_func stop_func, - GC_bool force_unmap GC_ATTR_UNUSED) + GC_bool force_unmap) { GC_bool result; IF_USE_MUNMAP(int old_unmap_threshold;) @@ -1284,6 +1289,11 @@ if (GC_debugging_started) GC_print_all_smashed(); GC_INVOKE_FINALIZERS(); LOCK(); + if (force_unmap) { + /* Record current heap size to make heap growth more conservative */ + /* afterwards (as if the heap is growing from zero size again). */ + GC_heapsize_at_forced_unmap = GC_heapsize; + } DISABLE_CANCEL(cancel_state); # ifdef USE_MUNMAP old_unmap_threshold = GC_unmap_threshold; @@ -1324,13 +1334,8 @@ GC_print_all_errors(); } -STATIC word GC_heapsize_at_forced_unmap = 0; - GC_API void GC_CALL GC_gcollect_and_unmap(void) { - /* Record current heap size to make heap growth more conservative */ - /* afterwards (as if the heap is growing from zero size again). */ - GC_heapsize_at_forced_unmap = GC_heapsize; /* Collect and force memory unmapping to OS. */ (void)GC_try_to_collect_general(GC_never_stop_func, TRUE); } @@ -1457,7 +1462,18 @@ if ((word)p + bytes >= (word)GC_greatest_plausible_heap_addr) { GC_greatest_plausible_heap_addr = (void *)endp; } - +# ifdef SET_REAL_HEAP_BOUNDS + if ((word)p < GC_least_real_heap_addr + || EXPECT(0 == GC_least_real_heap_addr, FALSE)) + GC_least_real_heap_addr = (word)p - sizeof(word); + if (endp > GC_greatest_real_heap_addr) { +# ifdef INCLUDE_LINUX_THREAD_DESCR + /* Avoid heap intersection with the static data roots. */ + GC_exclude_static_roots_inner((void *)p, (void *)endp); +# endif + GC_greatest_real_heap_addr = endp; + } +# endif if (old_capacity > 0) { # ifndef GWW_VDB /* Recycling may call GC_add_to_heap() again but should not */ @@ -1562,13 +1578,12 @@ } space = GET_MEM(bytes); if (EXPECT(NULL == space, FALSE)) { - WARN("Failed to expand heap by %" WARN_PRIdPTR " bytes\n", - (word)bytes); + WARN("Failed to expand heap by %" WARN_PRIuPTR " KiB\n", bytes >> 10); return(FALSE); } GC_add_to_our_memory((ptr_t)space, bytes); GC_INFOLOG_PRINTF("Grow heap to %lu KiB after %lu bytes allocated\n", - TO_KiB_UL(GC_heapsize + (word)bytes), + TO_KiB_UL(GC_heapsize + bytes), (unsigned long)GC_bytes_allocd); /* Adjust heap limits generously for blacklisting to work better. */ @@ -1724,7 +1739,10 @@ GC_gcollect_inner(); } else { # if !defined(AMIGA) || !defined(GC_AMIGA_FASTALLOC) - WARN("Out of Memory! Heap size: %" WARN_PRIdPTR " MiB." +# ifdef USE_MUNMAP + GC_ASSERT(GC_heapsize >= GC_unmapped_bytes); +# endif + WARN("Out of Memory! Heap size: %" WARN_PRIuPTR " MiB." " Returning NULL!\n", (GC_heapsize - GC_unmapped_bytes) >> 20); # endif RESTORE_CANCEL(cancel_state); @@ -1754,7 +1772,8 @@ while (*flh == 0) { ENTER_GC(); # ifndef GC_DISABLE_INCREMENTAL - if (GC_incremental && GC_time_limit != GC_TIME_UNLIMITED) { + if (GC_incremental && GC_time_limit != GC_TIME_UNLIMITED + && !GC_dont_gc) { /* True incremental mode, not just generational. */ /* Do our share of marking work. */ GC_collect_a_little_inner(1); @@ -1777,7 +1796,7 @@ if (NULL == *flh) { ENTER_GC(); if (GC_incremental && GC_time_limit == GC_TIME_UNLIMITED - && !tried_minor) { + && !tried_minor && !GC_dont_gc) { GC_collect_a_little_inner(1); tried_minor = TRUE; } else {
View file
_service:tar_scm:gc-8.2.2.tar.gz/blacklst.c -> _service:tar_scm:gc-8.2.4.tar.gz/blacklst.c
Changed
@@ -18,7 +18,7 @@ * We maintain several hash tables of hblks that have had false hits. * Each contains one bit per hash bucket; If any page in the bucket * has had a false hit, we assume that all of them have. - * See the definition of page_hash_table in gc_private.h. + * See the definition of page_hash_table in gc_priv.h. * False hits from the stack(s) are much more dangerous than false hits * from elsewhere, since the former can pin a large object that spans the * block, even though it does not start on the dangerous block. @@ -230,7 +230,7 @@ } /* - * Is the block starting at h of size len bytes black listed? If so, + * Is the block starting at h of size len bytes black listed? If so, * return the address of the next plausible r such that (r, len) might not * be black listed. (R may not actually be in the heap. We guarantee only * that every smaller value of r after h is also black listed.)
View file
_service:tar_scm:gc-8.2.2.tar.gz/configure -> _service:tar_scm:gc-8.2.4.tar.gz/configure
Changed
@@ -1,11 +1,12 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for gc 8.2.2. +# Generated by GNU Autoconf 2.71 for gc 8.2.4. # # Report bugs to <https://github.com/ivmai/bdwgc/issues>. # # -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. # # # This configure script is free software; the Free Software Foundation @@ -16,14 +17,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -33,46 +36,46 @@ fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi +if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -81,13 +84,6 @@ fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -96,8 +92,12 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -109,30 +109,10 @@ as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. @@ -154,20 +134,22 @@ exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else
View file
_service:tar_scm:gc-8.2.2.tar.gz/configure.ac -> _service:tar_scm:gc-8.2.4.tar.gz/configure.ac
Changed
@@ -14,7 +14,7 @@ dnl Process this file with autoconf to produce configure. dnl Initialization. -AC_INIT(gc,8.2.2,https://github.com/ivmai/bdwgc/issues) +AC_INIT(gc,8.2.4,https://github.com/ivmai/bdwgc/issues) dnl Version must conform to: 0-9+.0-9+.0-9+ AC_CONFIG_SRCDIR(gcj_mlc.c) @@ -86,17 +86,23 @@ AC_MSG_CHECKING(for emscripten) AC_COMPILE_IFELSE(AC_LANG_SOURCE( -#ifdef __EMSCRIPTEN__ -#error "this is emscripten" -#endif -), emscripten=no, emscripten=yes) -# Note -s ASYNCIFY is required to scan the stack, ASYNCIFY_STACK_SIZE is -# probably needed for gctest only. -AS_IF(test "x$emscripten" = "xyes", - gc_cflags="${gc_cflags} -s ASYNCIFY -s ASYNCIFY_STACK_SIZE=128000") +# ifndef __EMSCRIPTEN__ +# error This is not Emscripten +# endif + ), emscripten=yes, emscripten=no) AM_CONDITIONAL(EMSCRIPTEN, test x$emscripten = xyes) AC_MSG_RESULT($emscripten) +AC_ARG_ENABLE(emscripten-asyncify, + AS_HELP_STRING(--enable-emscripten-asyncify, + use Emscripten asyncify feature)) +# Use this option if your program is targeting -sASYNCIFY. The latter is +# required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for +# gctest only. +AS_IF(test "${emscripten}" = yes -a "${enable_emscripten_asyncify}" = yes, + gc_cflags="${gc_cflags} -DEMSCRIPTEN_ASYNCIFY" + gc_cflags="${gc_cflags} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000") + GC_CFLAGS=${gc_cflags} AC_SUBST(GC_CFLAGS) @@ -834,25 +840,25 @@ AC_MSG_CHECKING(for pthread_setname_np) old_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $CFLAGS_EXTRA -Werror" - AC_TRY_COMPILE(#include <pthread.h>, - pthread_setname_np("thread-name"), + AC_TRY_COMPILE( +# define _GNU_SOURCE 1 +# include <pthread.h> + , pthread_setname_np("thread-name"), AC_MSG_RESULT(yes (w/o tid)) AC_DEFINE(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID, 1, Define to use 'pthread_setname_np(const char*)' function.), - AC_TRY_COMPILE(#include <pthread.h>, - pthread_setname_np(pthread_self(), "thread-name-%u", 0), + AC_TRY_COMPILE( +# define _GNU_SOURCE 1 +# include <pthread.h> + , pthread_setname_np(pthread_self(), "thread-name-%u", 0), AC_MSG_RESULT(yes (with tid and arg)) AC_DEFINE(HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG, 1, Define to use 'pthread_setname_np(pthread_t, const char*, void *)' function.), AC_TRY_COMPILE( -#ifdef __CYGWIN__ -#define _GNU_SOURCE 1 -#elif defined(__linux__) || defined(__GLIBC__) || defined(__GNU__) -#define _GNU_SOURCE 1 -#endif -#include <pthread.h>, - pthread_setname_np(pthread_self(), "thread-name"), +# define _GNU_SOURCE 1 +# include <pthread.h> + , pthread_setname_np(pthread_self(), "thread-name"), AC_MSG_RESULT(yes (with tid)) AC_DEFINE(HAVE_PTHREAD_SETNAME_NP_WITH_TID, 1, Define to use 'pthread_setname_np(pthread_t, const char*)' @@ -1047,7 +1053,7 @@ if test "$enable_gcov" = "yes"; then CFLAGS="-D NTHREADS=20 $CFLAGS --coverage" if test "${enable_shared}" = no; then - # FIXME: As of g++-4.8.4/x86_64, in case of shared library build, test_cpp + # FIXME: As of g++-4.8.4/x64, in case of shared library build, test_cpp # linkage fails with "hidden symbol atexit is referenced by DSO" message. CXXFLAGS="$CXXFLAGS --coverage" fi
View file
_service:tar_scm:gc-8.2.2.tar.gz/cord/tests/cordtest.c -> _service:tar_scm:gc-8.2.4.tar.gz/cord/tests/cordtest.c
Changed
@@ -92,7 +92,7 @@ CORD_set_pos(p, x, 64*1024-1); while(CORD_pos_valid(p)) { (void)test_fn(CORD_pos_fetch(p), (void *)(GC_word)13); - CORD_next(p); + CORD_next(p); } if (count != 64*1024 + 2) ABORT("Position based iteration failed");
View file
_service:tar_scm:gc-8.2.2.tar.gz/cord/tests/de.c -> _service:tar_scm:gc-8.2.4.tar.gz/cord/tests/de.c
Changed
@@ -40,7 +40,6 @@ #if (defined(__BORLANDC__) || defined(__CYGWIN__) || defined(__MINGW32__) \ || defined(__NT__) || defined(_WIN32)) && !defined(WIN32) /* If this is DOS or win16, we'll fail anyway. */ - /* Might as well assume win32. */ # define WIN32 #endif @@ -129,7 +128,9 @@ /* Invalidate line map for lines > i */ void invalidate_map(int i) { - while(current_map -> line > i) { + for (;;) { + if (NULL == current_map) exit(4); /* for CSA, should not happen */ + if (current_map -> line <= i) break; current_map = current_map -> previous; current_map_size--; } @@ -170,8 +171,6 @@ current_map_size++; } - - /* Return position of column *c of ith line in */ /* current file. Adjust *c to be within the line.*/ /* A 0 pointer is taken as 0 column. */ @@ -234,7 +233,7 @@ # ifndef WIN32 /* Replace a line in the curses stdscr. All control characters are */ /* displayed as upper case characters in standout mode. This isn't */ -/* terribly appropriate for tabs. */ +/* terribly appropriate for tabs. */ void replace_line(int i, CORD s) { CORD_pos p;
View file
_service:tar_scm:gc-8.2.2.tar.gz/cord/tests/de_win.c -> _service:tar_scm:gc-8.2.4.tar.gz/cord/tests/de_win.c
Changed
@@ -12,11 +12,9 @@ */ /* - * The MS Windows specific part of de. + * The Windows specific part of de. * This started as the generic Windows application template * but significant parts didn't survive to the final version. - * - * This was written by a nonexpert windows programmer. */ #if defined(__BORLANDC__) || defined(__CYGWIN__) || defined(__MINGW32__) \ || defined(__NT__) || defined(_WIN32) || defined(WIN32)
View file
_service:tar_scm:gc-8.2.2.tar.gz/darwin_stop_world.c -> _service:tar_scm:gc-8.2.4.tar.gz/darwin_stop_world.c
Changed
@@ -340,6 +340,10 @@ /* else */ { *paltstack_lo = NULL; } +# if defined(STACKPTR_CORRECTOR_AVAILABLE) && defined(DARWIN_DONT_PARSE_STACK) + if (GC_sp_corrector != 0) + GC_sp_corrector((void **)&lo, (void *)(p -> id)); +# endif # ifdef DEBUG_THREADS GC_log_printf("Darwin: Stack for thread %p is %p,%p)\n", (void *)(word)thread, (void *)lo, (void *)(*phi));
View file
_service:tar_scm:gc-8.2.2.tar.gz/dbg_mlc.c -> _service:tar_scm:gc-8.2.4.tar.gz/dbg_mlc.c
Changed
@@ -136,10 +136,10 @@ ptr_t target = *(ptr_t *)bp; ptr_t alternate_target = *(ptr_t *)alternate_ptr; - if ((word)alternate_target >= (word)GC_least_plausible_heap_addr - && (word)alternate_target <= (word)GC_greatest_plausible_heap_addr - && ((word)target < (word)GC_least_plausible_heap_addr - || (word)target > (word)GC_greatest_plausible_heap_addr)) { + if ((word)alternate_target > GC_least_real_heap_addr + && (word)alternate_target < GC_greatest_real_heap_addr + && ((word)target <= GC_least_real_heap_addr + || (word)target >= GC_greatest_real_heap_addr)) { bp = alternate_ptr; } } @@ -1075,7 +1075,7 @@ { if (0 != my_old_fn) { if (my_old_fn == OFN_UNSET) { - /* register_finalizer() failed; (*ofn) and (*ocd) are unchanged. */ + /* GC_register_finalizer() failed; (*ofn) and (*ocd) are unchanged. */ return; } if (my_old_fn != GC_debug_invoke_finalizer) {
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/README.amiga -> _service:tar_scm:gc-8.2.4.tar.gz/doc/README.amiga
Changed
@@ -49,7 +49,7 @@ GC from returning chip-mem. Beware that it slows down a lot when a program is rapidly allocating/deallocating when there's either very little fast-memory left or very little - chip-memory left. Its not a very common situation, but gctest + chip-memory left. It's not a very common situation, but gctest sometimes (very rare) use many minutes because of this. GC_AMIGA_RETRY - If gc succeed allocating memory, but it is chip-mem,
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/README.cmake -> _service:tar_scm:gc-8.2.4.tar.gz/doc/README.cmake
Changed
@@ -30,7 +30,7 @@ e.g., > cmake -G "Visual Studio 9 2008" . use the gc.sln file generated by cmake to build gc - . specify -Denable_cplusplus=ON option to build gccpp (GC C++ support) + . specify -Denable_cplusplus=ON option to build gccpp, gctba (GC C++ support) . specify -Dbuild_tests=ON option to the tests (and run them by "ctest -V") . you can also run cmake from a build directory to build outside of the source tree. Just specify the path to the source tree: @@ -55,7 +55,7 @@ Another project could add bdwgc as one of its dependencies with something like this in their CMakeLists.txt: -find_package(BDWgc 8.2.2 REQUIRED) +find_package(BDWgc 8.2.4 REQUIRED) add_executable(Foo foo.c) target_link_libraries(Foo BDWgc::gc)
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/README.environment -> _service:tar_scm:gc-8.2.4.tar.gz/doc/README.environment
Changed
@@ -29,7 +29,7 @@ GC_PRINT_VERBOSE_STATS - Turn on even more logging. Not functional with SMALL_CONFIG. -GC_DUMP_REGULARLY - Generate a GC debugging dump GC_dump() on startup +GC_DUMP_REGULARLY - Generate a GC debugging dump (by GC_dump_named) on startup and during every collection. Very verbose. Useful if you have a bug to report, but please include only the last complete dump.
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/README.macros -> _service:tar_scm:gc-8.2.4.tar.gz/doc/README.macros
Changed
@@ -40,10 +40,10 @@ creation routines etc. to GC_ versions. Requires the programmer to explicitly handle thread registration. -GC_NO_THREAD_DECLS Tested by gc.h. MS Windows only. Do not declare +GC_NO_THREAD_DECLS Tested by gc.h. Windows only. Do not declare Windows thread creation routines and do not include windows.h. -GC_DONT_INCLUDE_WINDOWS_H Tested by gc.h. MS Windows only. Do not include +GC_DONT_INCLUDE_WINDOWS_H Tested by gc.h. Windows only. Do not include windows.h from gc.h (but Windows-specific thread creation routines are declared). @@ -57,7 +57,7 @@ operator new and delete are separately overloadable. Used in gc_cpp.h. -GC_NO_INLINE_STD_NEW Tested by gc_cpp.cc and gc_cpp.h. MS Windows only. +GC_NO_INLINE_STD_NEW Tested by gc_cpp.cc and gc_cpp.h. Windows only. Define the system-wide new and delete operators in gccpp.dll instead of providing an inline version of the operators. @@ -79,7 +79,7 @@ GC resides in a different DLL, its entry points should be referenced accordingly, and precautions may need to be taken to properly deal with statically allocated - variables in the main program. Used for MS Windows. + variables in the main program. Used for Windows. Also used by GCC v4+ (only when the dynamic shared library is being built) to hide internally used symbols. @@ -159,7 +159,7 @@ GC_AIX_THREADS Enables support for IBM AIX threads. Deprecated, use GC_THREADS instead. -GC_DGUX386_THREADS Enables support for DB/UX on I386 threads. +GC_DGUX386_THREADS Enables support for DB/UX x86 threads. See README.DGUX386. (Probably has not been tested recently.) Deprecated, use GC_THREADS instead. @@ -230,7 +230,7 @@ be either GC_malloc or GC_malloc_uncollectable, or GC_debug_malloc_replacement. (The latter invokes GC_debug_malloc with dummy source location information, but still results in - properly remembered call stacks on Linux/X86 and Solaris/SPARC. + properly remembered call stacks on Linux/x86 and Solaris/SPARC. It requires that the following two macros also be used.) The former is occasionally useful for working around leaks in code you don't want to (or can't) look at. It may not work for @@ -240,7 +240,7 @@ you should only use GC_debug_malloc_replacement as a malloc replacement. -REDIRECT_REALLOC=<X> Causes GC_realloc to be redirected to X. +REDIRECT_REALLOC=<X> Causes realloc to be redirected to X. The canonical use is REDIRECT_REALLOC=GC_debug_realloc_replacement, together with REDIRECT_MALLOC=GC_debug_malloc_replacement to generate leak reports with call stacks for both malloc and realloc. @@ -355,9 +355,9 @@ SAVE_CALL_COUNT=<n> Set the number of call frames saved with objects allocated through the debugging interface. Affects the amount of information generated in leak reports. Only matters on platforms - on which we can quickly generate call stacks, currently Linux/X86, + on which we can quickly generate call stacks, currently Linux/x86, Linux/SPARC, Solaris/SPARC, and platforms that provide execinfo.h. - Default is zero. On X86, client code should NOT be compiled with + Default is zero. On x86, client code should NOT be compiled with -fomit-frame-pointer. SAVE_CALL_NARGS=<n> Set the number of functions arguments to be saved @@ -372,10 +372,10 @@ that include a pointer to a type descriptor in each allocated object). USE_I686_PREFETCH Causes the collector to issue Pentium III style - prefetch instructions. No effect except on Linux/X86 platforms. + prefetch instructions. No effect except on Linux/x86 platforms. Empirically the code appears to still run correctly on Pentium II processors, though with no performance benefit. May not run on other - X86 processors probably. In some cases this improves performance by 15% + x86 processors probably. In some cases this improves performance by 15% or so. USE_3DNOW_PREFETCH Causes the collector to issue AMD 3DNow style @@ -601,3 +601,9 @@ of __libc_stack_end (or instead of any hard-coded value) for getting the primordial thread stack bottom (useful if the client modifies the program's address space). + +EMSCRIPTEN_ASYNCIFY (Emscripten only) Use Asyncify feature. Note this is + a relatively rarely used feature of Emscripten, most developers do not use + it, and it does not scale well to moderate-to-large code bases. But the + feature is needed to pass gctest, at least. Requires -sASYNCIFY linker + flag.
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/README.solaris2 -> _service:tar_scm:gc-8.2.4.tar.gz/doc/README.solaris2
Changed
@@ -41,7 +41,7 @@ temporarily. In some unlikely cases, this can result in unpleasant heap growth. But it seems better than the race/deadlock issues we had before. -If threads are used on an X86 processor with malloc redirected to +If threads are used on an x86 processor with malloc redirected to GC_malloc, it is necessary to call GC_INIT explicitly before forking the first thread. (This avoids a deadlock arising from calling GC_thr_init with the allocation lock held.)
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/README.win32 -> _service:tar_scm:gc-8.2.4.tar.gz/doc/README.win32
Changed
@@ -1,6 +1,6 @@ The collector has at various times been compiled under Windows 95 and later, NT, and XP, with the original Microsoft SDK, with Visual C++ 2.0, 4.0, and 6, -with the GNU win32 tools, with Borland C++ Builder, with Watcom C, with EMX, +with the GNU Win32 tools, with Borland C++ Builder, with Watcom C, with EMX, and with the Digital Mars compiler (DMC). For historical reasons, @@ -15,7 +15,7 @@ A toy editor (de.exe) based on cords (heavyweight strings represented as trees) has been ported and is included. -It runs fine under either win32 or win32S. It serves as an example +It runs fine under either Win32 or win32s. It serves as an example of a true Windows application, except that it was written by a nonexpert Windows programmer. (There are some peculiarities in the way files are displayed. The <cr> is displayed explicitly @@ -65,7 +65,7 @@ The collector should be buildable under Cygwin with the "./configure; make check" machinery. -MinGW builds (including for x86_64) are available both directly (on a Windows +MinGW builds (including for x64) are available both directly (on a Windows host) and via cross-compilation, e.g. "./configure --host=i686-pc-mingw32; make check" @@ -104,9 +104,9 @@ Ivan V. Demakov's README for the Watcom port: The collector has been tested with Watcom C 10.6, 11.0 and OpenWatcom 2.0. -It runs under win32, win32s, and even under msdos with dos4gw +It runs under Win32 and win32s, and even under DOS with dos4gw dos-extender. It should also run under OS/2, though this isn't -tested. Under win32 the collector can be built either as dll +tested. Under Win32 the collector can be built either as dll or as static library. Note that all compilations were done under Windows 95 or NT. @@ -201,7 +201,7 @@ GC_INIT should be called from the main thread before other GC calls. -We strongly advise against using the TerminateThread() win32 API call, +We strongly advise against using the TerminateThread() Windows API call, especially with the garbage collector. Any use is likely to provoke a crash in the GC, since it makes it impossible for the collector to correctly track threads.
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/README.win64 -> _service:tar_scm:gc-8.2.4.tar.gz/doc/README.win64
Changed
@@ -1,5 +1,5 @@ -64-bit Windows on AMD64/Intel EM64T is supported. A collector can be built -with Microsoft Visual C++ 2005 or with mingw-w64 gcc. +64-bit Windows on AMD64/Intel EM64T (x64) is supported. A collector can be +built with Microsoft Visual C++ 2005 or with mingw-w64 gcc. NT_MAKEFILE has been used in this environment. Type "nmake -f NT_MAKEFILE cpu=AMD64 nodebug=1" in a Visual C++ command line
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/debugging.md -> _service:tar_scm:gc-8.2.4.tar.gz/doc/debugging.md
Changed
@@ -21,7 +21,7 @@ We recommend debugging without incremental collection if possible. (This applies directly to UNIX systems. Debugging with incremental collection under -win32 is worse. See README.win32.) +Win32 is worse. See README.win32.) If the application generates an unhandled SIGSEGV or equivalent, it may often be easiest to set the environment variable `GC_LOOP_ON_ABORT`. On many
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/gc.man -> _service:tar_scm:gc-8.2.4.tar.gz/doc/gc.man
Changed
@@ -90,7 +90,7 @@ .I GC_malloc_atomic_ignore_off_page inform the collector that the client code will always maintain a pointer to -near the beginning of the object (within the first 512 bytes), and that +near the beginning (i.e. within the first heap block) of the object, and that pointers beyond that can be ignored by the collector. This makes it much easier for the collector to place large objects. These are recommended for large object allocation. (Objects expected to be > ~100 KB should be
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/gcinterface.md -> _service:tar_scm:gc-8.2.4.tar.gz/doc/gcinterface.md
Changed
@@ -70,8 +70,8 @@ `void * GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(size_t _bytes_)` - Analogous to `GC_MALLOC` and `GC_MALLOC_ATOMIC`, respectively, except that the client guarantees that as long as the resulting object is of use, a pointer -is maintained to someplace inside the first 512 bytes of the object. This -pointer should be declared volatile to avoid interference from compiler +is maintained to someplace inside the first heap block (hblk) of the object. +This pointer should be declared volatile to avoid interference from compiler optimizations. (Other nonvolatile pointers to the object may exist as well.) This is the preferred way to allocate objects that are likely to be more than 100 KB in size. It greatly reduces the risk that such objects will @@ -187,12 +187,12 @@ in garbage collectible memory by having those classes inherit from class `gc`. For details see `gc_cpp.h` file. -Linking against `libgccpp` in addition to the `gc` library overrides `::new` +Linking against `gccpp` in addition to the `gc` library overrides `::new` (and friends) to allocate traceable but uncollectible memory, making it safe to refer to collectible objects from the resulting memory. If the user includes `gc_cpp.h` but `::new` should not be overridden then -`libgctba` (in addition to the `gc`) library should be linked with to provide +`gctba` (in addition to the `gc`) library should be linked with to provide the definition of `GC_throw_bad_alloc` C++ function used by operator `new` of class `gc`. Alternatively, the client may define `GC_NEW_ABORTS_ON_OOM` macro before include of `gc_cpp.h` (this instructs `::new` to issue an abort instead @@ -206,7 +206,7 @@ which use `malloc` to implement `::new`, it should usually be possible to use a version of the collector that has been compiled as a `malloc` replacement. It is also possible to replace `::new` and other allocation functions -suitably, as is done by `libgccpp`. +suitably, as is done by `gccpp`. Note that user-implemented small-block allocation often works poorly with an underlying garbage-collected large block allocator, since the collector has
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/leak.md -> _service:tar_scm:gc-8.2.4.tar.gz/doc/leak.md
Changed
@@ -57,7 +57,7 @@ reports should be generated with linuxthreads, at least. On a few platforms (currently Solaris/SPARC, Irix, and, with -`-DSAVE_CALL_CHAIN`, Linux/X86), `GC_MALLOC` also causes some more information +`-DSAVE_CALL_CHAIN`, Linux/x86), `GC_MALLOC` also causes some more information about its call stack to be saved in the object. Such information is reproduced in the error reports in very non-symbolic form, but it can be very useful with the aid of a debugger. @@ -73,7 +73,7 @@ The program to be tested for leaks could look like `tests/leak_test.c` file of the distribution. -On an Intel X86 Linux system this produces on the stderr stream: +On a Linux/x86 system this produces on the stderr stream: Found 1 leaked objects: @@ -81,7 +81,7 @@ (On most unmentioned operating systems, the output is similar to this. If the -collector had been built on Linux/X86 with `-DSAVE_CALL_CHAIN`, the output +collector had been built on Linux/x86 with `-DSAVE_CALL_CHAIN`, the output would be closer to the Solaris example. For this to work, the program should not be compiled with `-fomit_frame_pointer`.) @@ -118,12 +118,12 @@ On systems supporting the `adb` debugger, the `tools/callprocs.sh` script can be used to replace program counter values with symbolic names. The collector tries to generate symbolic names for call stacks if it knows how to do so on -the platform. This is true on Linux/X86, but not on most other platforms. +the platform. This is true on Linux/x86, but not on most other platforms. ## Simplified leak detection under Linux It should be possible to run the collector in the leak detection mode on -a program a.out under Linux/X86 as follows: +a program a.out under Linux/x86 as follows: 1. If possible, ensure that a.out is a single-threaded executable. On some platforms this does not work at all for the multi-threaded programs.
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/overview.md -> _service:tar_scm:gc-8.2.4.tar.gz/doc/overview.md
Changed
@@ -91,7 +91,7 @@ The garbage collector distribution includes a C string (`cord.h`) package that provides for fast concatenation and substring operations on long strings. -A simple curses- and win32-based editor that represents the entire file as +A simple curses- and Windows-based editor that represents the entire file as a cord is included as a sample application. Performance of the non-incremental collector is typically competitive with
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/porting.md -> _service:tar_scm:gc-8.2.4.tar.gz/doc/porting.md
Changed
@@ -78,7 +78,7 @@ * `ALIGNMENT` - Defined to be the largest _N_ such that all pointer are guaranteed to be aligned on _N_-byte boundaries. Defining it to be _1_ will always work, but perform poorly. For all modern 32-bit platforms, this - is 4. For all modern 64-bit platforms, this is 8. Whether or not X86 + is 4. For all modern 64-bit platforms, this is 8. Whether or not x86 qualifies as a modern architecture here is compiler- and OS-dependent. * `DATASTART` - The beginning of the main data segment. The collector will trace all memory between `DATASTART` and `DATAEND` for root pointers.
View file
_service:tar_scm:gc-8.2.2.tar.gz/doc/scale.md -> _service:tar_scm:gc-8.2.4.tar.gz/doc/scale.md
Changed
@@ -69,7 +69,7 @@ are different, and represent a smaller change to the original collector source, probably at the expense of extreme scalability. Some of the refinements they suggest, e.g. splitting large objects, were also incorporated -into out approach. +into our approach. The global mark stack is transformed into a global work queue. Unlike the usual case, it never shrinks during a mark phase. The mark threads remove
View file
_service:tar_scm:gc-8.2.2.tar.gz/dyn_load.c -> _service:tar_scm:gc-8.2.4.tar.gz/dyn_load.c
Changed
@@ -258,7 +258,7 @@ } } -# endif /* !USE_PROC ... */ +# endif /* !USE_PROC_FOR_LIBRARIES */ # endif /* SOLARISDL */ #if defined(SCO_ELF) || defined(DGUX) || defined(HURD) || defined(NACL) \ @@ -920,7 +920,7 @@ fd = -1; } -# endif /* USE_PROC || IRIX5 */ +# endif /* USE_PROC_FOR_LIBRARIES || IRIX5 */ # if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
View file
_service:tar_scm:gc-8.2.2.tar.gz/extra/AmigaOS.c -> _service:tar_scm:gc-8.2.4.tar.gz/extra/AmigaOS.c
Changed
@@ -356,7 +356,7 @@ void *GC_amiga_allocwrapper_any(size_t size,void *(*AllocFunction)(size_t size2)){ void *ret; - GC_amiga_dontalloc=TRUE; /* Pretty tough thing to do, but its indeed necessary. */ + GC_amiga_dontalloc=TRUE; /* Pretty tough thing to do, but it's indeed necessary. */ latestsize=size; ret=(*AllocFunction)(size);
View file
_service:tar_scm:gc-8.2.2.tar.gz/extra/msvc_dbg.c -> _service:tar_scm:gc-8.2.4.tar.gz/extra/msvc_dbg.c
Changed
@@ -23,7 +23,7 @@ #if !defined(_M_ARM) && !defined(_M_ARM64) \ && !defined(_M_X64) && defined(_MSC_VER) -/* TODO: arm64, x86_64 currently miss some machine-dependent code below. */ +/* TODO: arm64, x64 currently miss some machine-dependent code below. */ /* See also GC_HAVE_BUILTIN_BACKTRACE in gc_config_macros.h. */ #define GC_BUILD @@ -382,7 +382,7 @@ return buffer - begin; } -/* Compatibility with <execinfo.h> */ +/* Compatibility with execinfo.h: */ int backtrace(void* addresses, int count) {
View file
_service:tar_scm:gc-8.2.2.tar.gz/finalize.c -> _service:tar_scm:gc-8.2.4.tar.gz/finalize.c
Changed
@@ -602,7 +602,7 @@ /* overflow is handled by the caller, and is not a disaster. */ #if defined(_MSC_VER) && defined(I386) GC_ATTR_NOINLINE - /* Otherwise some optimizer bug is tickled in VC for X86 (v19, at least). */ + /* Otherwise some optimizer bug is tickled in VC for x86 (v19, at least). */ #endif STATIC void GC_normal_finalize_mark_proc(ptr_t p) { @@ -647,9 +647,18 @@ /* other objects specify no ordering. */ STATIC void GC_unreachable_finalize_mark_proc(ptr_t p) { + /* A dummy comparison to ensure the compiler not to optimize two */ + /* identical functions into a single one (thus, to ensure a unique */ + /* address of each). Alternatively, GC_noop1(p) could be used. */ + if (EXPECT(NULL == p, FALSE)) return; + GC_normal_finalize_mark_proc(p); } +static GC_bool need_unreachable_finalization = FALSE; + /* Avoid the work if this is not used. */ + /* TODO: turn need_unreachable_finalization into a counter */ + /* Register a finalization function. See gc.h for details. */ /* The last parameter is a procedure that determines */ /* marking for finalization ordering. Any objects marked */ @@ -671,6 +680,8 @@ return; } LOCK(); + if (mp == GC_unreachable_finalize_mark_proc) + need_unreachable_finalization = TRUE; if (EXPECT(NULL == GC_fnlz_roots.fo_head, FALSE) || EXPECT(GC_fo_entries > ((word)1 << GC_log_fo_table_size), FALSE)) { GC_grow_table((struct hash_chain_entry ***)&GC_fnlz_roots.fo_head, @@ -813,14 +824,10 @@ ocd, GC_null_finalize_mark_proc); } -static GC_bool need_unreachable_finalization = FALSE; - /* Avoid the work if this isn't used. */ - GC_API void GC_CALL GC_register_finalizer_unreachable(void * obj, GC_finalization_proc fn, void * cd, GC_finalization_proc *ofn, void ** ocd) { - need_unreachable_finalization = TRUE; GC_ASSERT(GC_java_finalization); GC_register_finalizer_inner(obj, fn, cd, ofn, ocd, GC_unreachable_finalize_mark_proc);
View file
_service:tar_scm:gc-8.2.2.tar.gz/fnlz_mlc.c -> _service:tar_scm:gc-8.2.4.tar.gz/fnlz_mlc.c
Changed
@@ -42,7 +42,7 @@ /* on such fragments is always multiple of 4 (a link to the next */ /* fragment, or NULL). If it is desirable to have a finalizer */ /* which does not use the first word for storing finalization */ - /* info, GC_reclaim_with_finalization must be extended to clear */ + /* info, GC_disclaim_and_reclaim() must be extended to clear */ /* fragments so that the assumption holds for the selected word. */ const struct GC_finalizer_closure *fc = (struct GC_finalizer_closure *)(fc_word @@ -87,7 +87,6 @@ int mark_unconditionally) { GC_ASSERT((unsigned)kind < MAXOBJKINDS); - GC_ASSERT(NONNULL_ARG_NOT_NULL(proc)); if (!EXPECT(GC_find_leak, FALSE)) { GC_obj_kindskind.ok_disclaim_proc = proc; GC_obj_kindskind.ok_mark_unconditionally =
View file
_service:tar_scm:gc-8.2.2.tar.gz/gc_cpp.cc -> _service:tar_scm:gc-8.2.4.tar.gz/gc_cpp.cc
Changed
@@ -33,9 +33,10 @@ #define GC_DONT_INCL_WINDOWS_H #include "gc.h" -#include <new> // for bad_alloc, precedes include of gc_cpp.h - -#include "gc_cpp.h" // for GC_OPERATOR_NEW_ARRAY +#ifndef GC_INCLUDE_NEW +# define GC_INCLUDE_NEW +#endif +#include "gc_cpp.h" #if !(defined(_MSC_VER) || defined(__DMC__)) || defined(GC_NO_INLINE_STD_NEW) @@ -46,24 +47,6 @@ # define GC_ALLOCATOR_THROW_OR_ABORT() throw std::bad_alloc() #endif -# if !defined(GC_NEW_DELETE_THROW_NOT_NEEDED) \ - && !defined(GC_NEW_DELETE_NEED_THROW) && GC_GNUC_PREREQ(4, 2) \ - && (__cplusplus < 201103L || defined(__clang__)) -# define GC_NEW_DELETE_NEED_THROW -# endif - -# ifdef GC_NEW_DELETE_NEED_THROW -# if __cplusplus >= 201703L || _MSVC_LANG >= 201703L - // The "dynamic exception" syntax had been deprecated in C++11 - // and was removed in C++17. -# define GC_DECL_NEW_THROW noexcept(false) -# else -# define GC_DECL_NEW_THROW throw(std::bad_alloc) -# endif -# else -# define GC_DECL_NEW_THROW /* empty */ -# endif - void* operator new(size_t size) GC_DECL_NEW_THROW { void* obj = GC_MALLOC_UNCOLLECTABLE(size); if (0 == obj)
View file
_service:tar_scm:gc-8.2.2.tar.gz/gcj_mlc.c -> _service:tar_scm:gc-8.2.4.tar.gz/gcj_mlc.c
Changed
@@ -31,9 +31,7 @@ * possibly with some tuning of the constants. But the immediate goal * is to get better gcj performance. * - * We assume: - * 1) Counting on explicit initialization of this interface is OK; - * 2) FASTLOCK is not a significant win. + * We assume: counting on explicit initialization of this interface is OK. */ #include "gc_gcj.h"
View file
_service:tar_scm:gc-8.2.2.tar.gz/headers.c -> _service:tar_scm:gc-8.2.4.tar.gz/headers.c
Changed
@@ -138,7 +138,7 @@ result = (ptr_t)GET_MEM(bytes_to_get); if (EXPECT(NULL == result, FALSE)) { WARN("Out of memory - trying to allocate requested amount" - " (%" WARN_PRIdPTR " bytes)...\n", (word)bytes); + " (%" WARN_PRIuPTR " bytes)...\n", bytes); bytes_to_get = ROUNDUP_PAGESIZE_IF_MMAP(bytes); result = (ptr_t)GET_MEM(bytes_to_get); if (result != NULL) {
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/config.h.in -> _service:tar_scm:gc-8.2.4.tar.gz/include/config.h.in
Changed
@@ -110,9 +110,6 @@ /* libatomic_ops AO_or primitive implementation is lock-free. */ #undef HAVE_LOCKFREE_AO_OR -/* Define to 1 if you have the <memory.h> header file. */ -#undef HAVE_MEMORY_H - /* Define to use 'pthread_setname_np(const char*)' function. */ #undef HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID @@ -126,6 +123,9 @@ /* Define to 1 if you have the <stdint.h> header file. */ #undef HAVE_STDINT_H +/* Define to 1 if you have the <stdio.h> header file. */ +#undef HAVE_STDIO_H + /* Define to 1 if you have the <stdlib.h> header file. */ #undef HAVE_STDLIB_H @@ -228,7 +228,9 @@ /* See the comment in gcconfig.h. */ #undef SOLARIS25_PROC_VDB_BUG_FIXED -/* Define to 1 if you have the ANSI C header files. */ +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Define to work around a Solaris 5.3 bug (see dyn_load.c). */
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/cord.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/cord.h
Changed
@@ -283,7 +283,7 @@ /* The file f must be such that ftell reflects the actual character */ /* position in the file, i.e. the number of characters that can be */ /* or were read with fread. On UNIX systems this is always true. */ -/* On MS Windows systems, f must be opened in binary mode. */ +/* On Windows systems, f must be opened in binary mode. */ CORD_API CORD CORD_from_file(FILE * f); /* Equivalent to the above, except that the entire file will be read */
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/ec.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/ec.h
Changed
@@ -36,7 +36,7 @@ * * ... * CORD_ec_init(x); - * while(...) { + * while (...) { * c = getc(f); * ... * CORD_ec_append(x, c); @@ -51,15 +51,14 @@ # define CORD_BUFSZ 128 # endif +/* This structure represents the concatenation of ec_cord with */ +/* ec_buf0 .. ec_bufptr-ec_buf-1. */ typedef struct CORD_ec_struct { CORD ec_cord; char * ec_bufptr; char ec_bufCORD_BUFSZ+1; } CORD_ec1; -/* This structure represents the concatenation of ec_cord with */ -/* ec_buf0 ... (ec_bufptr-ec_buf-1) */ - /* Flush the buffer part of the extended cord into ec_cord. */ /* Note that this is almost the only real function, and it is */ /* implemented in 6 lines in cordxtra.c */
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/gc.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/gc.h
Changed
@@ -222,7 +222,7 @@ /* it a bit safer to use non-topologically- */ /* ordered finalization. Default value is */ /* determined by JAVA_FINALIZATION macro. */ - /* Enables register_finalizer_unreachable to */ + /* Enables GC_register_finalizer_unreachable to */ /* work correctly. */ /* The setter and getter are unsynchronized. */ GC_API void GC_CALL GC_set_java_finalization(int); @@ -916,17 +916,17 @@ /* until it returns 0. */ GC_API int GC_CALL GC_collect_a_little(void); -/* Allocate an object of size lb bytes. The client guarantees that */ -/* as long as the object is live, it will be referenced by a pointer */ -/* that points to somewhere within the first 256 bytes of the object. */ -/* (This should normally be declared volatile to prevent the compiler */ -/* from invalidating this assertion.) This routine is only useful */ -/* if a large array is being allocated. It reduces the chance of */ -/* accidentally retaining such an array as a result of scanning an */ +/* Allocate an object of size lb bytes. The client guarantees that as */ +/* long as the object is live, it will be referenced by a pointer that */ +/* points to somewhere within the first GC heap block (hblk) of the */ +/* object. (This should normally be declared volatile to prevent the */ +/* compiler from invalidating this assertion.) This routine is only */ +/* useful if a large array is being allocated. It reduces the chance */ +/* of accidentally retaining such an array as a result of scanning an */ /* integer that happens to be an address inside the array. (Actually, */ /* it reduces the chance of the allocator not finding space for such */ /* an array, since it will try hard to avoid introducing such a false */ -/* reference.) On a SunOS 4.X or MS Windows system this is recommended */ +/* reference.) On a SunOS 4.X or Windows system this is recommended */ /* for arrays likely to be larger than 100 KB or so. For other systems,*/ /* or if the collector is not configured to recognize all interior */ /* pointers, the threshold is normally much higher. */ @@ -1577,6 +1577,8 @@ /* Return non-zero (TRUE) if and only if the calling thread is */ /* registered with the garbage collector. */ + /* If the thread is finished (e.g. running in a destructor and not */ + /* registered manually again), it is considered as not registered. */ GC_API int GC_CALL GC_thread_is_registered(void); /* Notify the collector about the stack and the alt-stack of the */ @@ -1604,6 +1606,20 @@ /* Stop/start the world explicitly. Not recommended for general use. */ GC_API void GC_CALL GC_stop_world_external(void); GC_API void GC_CALL GC_start_world_external(void); + + /* Provide a verifier/modifier of the stack pointer when pushing the */ + /* thread stacks. This might be useful for a crude integration */ + /* with certain coroutine implementations. (*sp_ptr) is the captured */ + /* stack pointer of the suspended thread with pthread_id (the latter */ + /* is actually of pthread_t type). The functionality is unsupported */ + /* on some targets (the getter always returns 0 in such a case). */ + /* Both the setter and the getter acquire the GC lock. The client */ + /* function (if provided) is called with the GC lock acquired, and */ + /* might be with the world stopped. */ + typedef void (GC_CALLBACK * GC_sp_corrector_proc)(void ** /* sp_ptr */, + void * /* pthread_id */); + GC_API void GC_CALL GC_set_sp_corrector(GC_sp_corrector_proc); + GC_API GC_sp_corrector_proc GC_CALL GC_get_sp_corrector(void); #endif /* GC_THREADS */ /* Wrapper for functions that are likely to block (or, at least, do not */ @@ -2143,7 +2159,7 @@ GC_INIT_CONF_IGNORE_WARN; \ GC_INIT_CONF_INITIAL_HEAP_SIZE; } -/* win32S may not free all resources on process exit. */ +/* win32s may not free all resources on process exit. */ /* This explicitly deallocates the heap. Defined only for Windows. */ GC_API void GC_CALL GC_win32_free_heap(void);
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/gc_cpp.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/gc_cpp.h
Changed
@@ -142,6 +142,10 @@ #include "gc.h" +#ifdef GC_INCLUDE_NEW +# include <new> // for std, bad_alloc +#endif + #ifdef GC_NAMESPACE # define GC_NS_QUALIFY(T) boehmgc::T #else @@ -173,11 +177,28 @@ # define GC_PLACEMENT_DELETE #endif +#if !defined(GC_NEW_DELETE_THROW_NOT_NEEDED) \ + && !defined(GC_NEW_DELETE_NEED_THROW) && GC_GNUC_PREREQ(4, 2) \ + && (__cplusplus < 201103L || defined(__clang__)) +# define GC_NEW_DELETE_NEED_THROW +#endif + +#ifndef GC_NEW_DELETE_NEED_THROW +# define GC_DECL_NEW_THROW /* empty */ +#elif __cplusplus >= 201703L || _MSVC_LANG >= 201703L + // The "dynamic exception" syntax had been deprecated in C++11 + // and was removed in C++17. +# define GC_DECL_NEW_THROW noexcept(false) +#elif defined(GC_INCLUDE_NEW) +# define GC_DECL_NEW_THROW throw(std::bad_alloc) +#else +# define GC_DECL_NEW_THROW /* empty (as bad_alloc might be undeclared) */ +#endif + #if defined(GC_NEW_ABORTS_ON_OOM) || defined(_LIBCPP_NO_EXCEPTIONS) # define GC_OP_NEW_OOM_CHECK(obj) \ do { if (!(obj)) GC_abort_on_oom(); } while (0) #elif defined(GC_INCLUDE_NEW) -# include <new> // for bad_alloc # define GC_OP_NEW_OOM_CHECK(obj) if (obj) {} else throw std::bad_alloc() #else // "new" header is not included, so bad_alloc cannot be thrown directly. @@ -301,7 +322,7 @@ // to arbitrary ordering during linking). # ifdef GC_OPERATOR_NEW_ARRAY - inline void* operator new(size_t size) + inline void* operator new(size_t size) GC_DECL_NEW_THROW { void* obj = GC_MALLOC_UNCOLLECTABLE(size); GC_OP_NEW_OOM_CHECK(obj); @@ -314,7 +335,7 @@ } # endif - inline void* operator new(size_t size) + inline void* operator new(size_t size) GC_DECL_NEW_THROW { void* obj = GC_MALLOC_UNCOLLECTABLE(size); GC_OP_NEW_OOM_CHECK(obj); @@ -380,12 +401,15 @@ // There seems to be no way to redirect new in this environment without // including this everywhere. # ifdef GC_OPERATOR_NEW_ARRAY - void *operator new(size_t size); - void operator delete(void* obj); -# endif + void *operator new(size_t size) GC_DECL_NEW_THROW; + void operator delete(void* obj) GC_NOEXCEPT; + + void* operator new(size_t size, int /* nBlockUse */, + const char * szFileName, int nLine); +# endif // GC_OPERATOR_NEW_ARRAY - void* operator new(size_t size); - void operator delete(void* obj); + void* operator new(size_t size) GC_DECL_NEW_THROW; + void operator delete(void* obj) GC_NOEXCEPT; void* operator new(size_t size, int /* nBlockUse */, const char * szFileName, int nLine);
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/gc_disclaim.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/gc_disclaim.h
Changed
@@ -43,7 +43,7 @@ /* No-op in the leak-finding mode. */ GC_API void GC_CALL GC_register_disclaim_proc(int /*kind*/, GC_disclaim_proc /*proc*/, - int /*mark_from_all*/) GC_ATTR_NONNULL(2); + int /*mark_from_all*/); /* The finalizer closure used by GC_finalized_malloc. */ struct GC_finalizer_closure { @@ -63,6 +63,7 @@ /* slightly bigger than the specified allocation size, and that GC_base */ /* result points to a word prior to the start of the allocated object. */ /* The disclaim procedure is not invoked in the leak-finding mode. */ +/* There is no debugging version of this allocation API. */ GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL GC_finalized_malloc(size_t /*size*/, const struct GC_finalizer_closure * /*fc*/) GC_ATTR_NONNULL(2);
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/gc_gcj.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/gc_gcj.h
Changed
@@ -84,7 +84,8 @@ GC_EXTRA_PARAMS); /* Similar to GC_gcj_malloc, but assumes that a pointer to near the */ -/* beginning of the resulting object is always maintained. */ +/* beginning (i.e. within the first heap block) of the allocated object */ +/* is always maintained. */ GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL GC_gcj_malloc_ignore_off_page(size_t /* lb */, void * /* ptr_to_struct_containing_descr */);
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/gc_inline.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/gc_inline.h
Changed
@@ -27,6 +27,7 @@ /* This interface is most useful for compilers that generate C. */ /* It is also used internally for thread-local allocation. */ /* Manual use is hereby discouraged. */ +/* There is no debugging version of this allocation API. */ #include "gc.h" #include "gc_tiny_fl.h" @@ -193,7 +194,7 @@ GC_MALLOC_WORDS_KIND(result, 2, tiny_fl, GC_I_NORMAL, (void)0); \ if ((result) != 0 /* NULL */) { \ *(void **)(result) = l; \ - GC_PTR_STORE_AND_DIRTY((void **)(result) + 1, r); \ + GC_ptr_store_and_dirty((void **)(result) + 1, r); \ GC_reachable_here(l); \ } \ } while (0)
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/gc_mark.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/gc_mark.h
Changed
@@ -125,7 +125,8 @@ /* Bounds on the heap. Guaranteed valid */ /* Likely to include future heap expansion. */ /* Hence usually includes not-yet-mapped */ - /* memory. */ + /* memory, or might overlap with other data */ + /* roots. */ /* Handle nested references in a custom mark procedure. */ /* Check if obj is a valid object. If so, ensure that it is marked. */ @@ -216,7 +217,7 @@ GC_generic_malloc_ignore_off_page( size_t /* lb */, int /* knd */); /* As above, but pointers to past the */ - /* first page of the resulting object */ + /* first hblk of the resulting object */ /* are ignored. */ /* Generalized version of GC_malloc_atomic_uncollectable. */
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/gc_pthread_redirects.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/gc_pthread_redirects.h
Changed
@@ -61,6 +61,8 @@ || (_POSIX_C_SOURCE >= 199506L) || (_XOPEN_SOURCE >= 500) GC_API int GC_pthread_sigmask(int /* how */, const sigset_t *, sigset_t * /* oset */); +# else +# define GC_NO_PTHREAD_SIGMASK # endif # endif /* !GC_NO_PTHREAD_SIGMASK */
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/gc_version.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/gc_version.h
Changed
@@ -30,7 +30,7 @@ /* it to keep the old-style build process working. */ #define GC_TMP_VERSION_MAJOR 8 #define GC_TMP_VERSION_MINOR 2 -#define GC_TMP_VERSION_MICRO 2 /* 8.2.2 */ +#define GC_TMP_VERSION_MICRO 4 /* 8.2.4 */ #ifdef GC_VERSION_MAJOR # if GC_TMP_VERSION_MAJOR != GC_VERSION_MAJOR \
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/private/darwin_semaphore.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/private/darwin_semaphore.h
Changed
@@ -18,18 +18,17 @@ #ifndef GC_DARWIN_SEMAPHORE_H #define GC_DARWIN_SEMAPHORE_H -#if !defined(GC_DARWIN_THREADS) -# error darwin_semaphore.h included with GC_DARWIN_THREADS not defined +#if !defined(GC_DARWIN_THREADS) && !defined(GC_WIN32_THREADS) +# error darwin_semaphore.h included for improper target #endif #ifdef __cplusplus extern "C" { #endif -/* This is a very simple semaphore implementation for Darwin. It is */ -/* implemented in terms of pthread calls so it is not async signal */ -/* safe. But this is not a problem because signals are not used to */ -/* suspend threads on Darwin. */ +/* This is a very simple semaphore implementation based on pthreads. */ +/* It is not async-signal safe. But this is not a problem because */ +/* signals are not used to suspend threads on the target. */ typedef struct { pthread_mutex_t mutex;
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/private/gc_locks.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/private/gc_locks.h
Changed
@@ -37,12 +37,6 @@ # ifdef PCR GC_EXTERN PCR_Th_ML GC_allocate_ml; -# if defined(CPPCHECK) -# define DCL_LOCK_STATE /* empty */ -# else -# define DCL_LOCK_STATE \ - PCR_ERes GC_fastLockRes; PCR_sigset_t GC_old_sig_mask -# endif # define UNCOND_LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml) # define UNCOND_UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml) # elif defined(NN_PLATFORM_CTR) || defined(NINTENDO_SWITCH)
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/private/gc_pmark.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/private/gc_pmark.h
Changed
@@ -223,7 +223,8 @@ # define TRACE(source, cmd) \ if (GC_trace_addr != 0 && (ptr_t)(source) == GC_trace_addr) cmd # define TRACE_TARGET(target, cmd) \ - if (GC_trace_addr != 0 && (target) == *(ptr_t *)GC_trace_addr) cmd + if (GC_trace_addr != NULL && GC_is_heap_ptr(GC_trace_addr) \ + && (target) == *(ptr_t *)GC_trace_addr) cmd #else # define TRACE(source, cmd) # define TRACE_TARGET(source, cmd)
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/private/gc_priv.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/private/gc_priv.h
Changed
@@ -27,7 +27,9 @@ #endif #if (defined(__linux__) || defined(__GLIBC__) || defined(__GNU__) \ - || defined(__CYGWIN__)) && !defined(_GNU_SOURCE) + || defined(__CYGWIN__) || defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID) \ + || defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID_AND_ARG) \ + || defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID)) && !defined(_GNU_SOURCE) /* Can't test LINUX, since this must be defined before other includes. */ # define _GNU_SOURCE 1 #endif @@ -716,7 +718,7 @@ /* Print warning message, e.g. almost out of memory. */ /* The argument (if any) format specifier should be: */ -/* "%s", "%p" or "%"WARN_PRIdPTR. */ +/* "%s", "%p", "%"WARN_PRIdPTR or "%"WARN_PRIuPTR. */ #define WARN(msg, arg) \ (*GC_current_warn_proc)((/* no const */ char *)("GC Warning: " msg), \ (word)(arg)) @@ -728,8 +730,9 @@ /* client side, so non-standard print type modifiers (like MS "I64d") */ /* should be avoided here if possible. */ #ifndef WARN_PRIdPTR - /* Assume sizeof(void *) == sizeof(long) (or a little-endian machine) */ + /* Assume sizeof(void *) == sizeof(long) or a little-endian machine. */ # define WARN_PRIdPTR "ld" +# define WARN_PRIuPTR "lu" #endif /* A tagging macro (for a code static analyzer) to indicate that the */ @@ -920,7 +923,7 @@ /* Incremental GC with MPROTECT_VDB currently requires the */ /* page size to be a multiple of HBLKSIZE. Since most modern */ /* architectures support variable page sizes down to 4 KB, and */ -/* X86 is generally 4 KB, we now default to 4 KB, except for */ +/* x86 is generally 4 KB, we now default to 4 KB, except for */ /* Alpha: Seems to be used with 8 KB pages. */ /* SMALL_CONFIG: Want less block-level fragmentation. */ #ifndef HBLKSIZE @@ -1110,7 +1113,7 @@ /* list headers. Sometimes called regions. */ unsigned char hb_flags; # define IGNORE_OFF_PAGE 1 /* Ignore pointers that do not */ - /* point to the first page of */ + /* point to the first hblk of */ /* this object. */ # define WAS_UNMAPPED 2 /* This is a free block, which has */ /* been unmapped from the address */ @@ -1421,6 +1424,17 @@ /* obtained scratch area. */ /* Used by GC_register_dynamic_libraries(). */ # endif +# if defined(GC_ASSERTIONS) || defined(INCLUDE_LINUX_THREAD_DESCR) \ + || (defined(KEEP_BACK_PTRS) && ALIGNMENT == 1) +# define SET_REAL_HEAP_BOUNDS +# define GC_least_real_heap_addr GC_arrays._least_real_heap_addr +# define GC_greatest_real_heap_addr GC_arrays._greatest_real_heap_addr + word _least_real_heap_addr; + word _greatest_real_heap_addr; + /* Similar to GC_least/greatest_plausible_heap_addr but */ + /* do not include future (potential) heap expansion. */ + /* Both variables are zero initially. */ +# endif mse *_mark_stack; /* Limits of stack for GC_mark routine. All ranges */ /* between GC_mark_stack (incl.) and GC_mark_stack_top */ @@ -1712,8 +1726,8 @@ # endif /* !ENABLE_DISCLAIM */ } GC_obj_kindsMAXOBJKINDS; -#define beginGC_obj_kinds ((ptr_t)(&GC_obj_kinds)) -#define endGC_obj_kinds (beginGC_obj_kinds + (sizeof GC_obj_kinds)) +#define beginGC_obj_kinds ((ptr_t)(&GC_obj_kinds0)) +#define endGC_obj_kinds (beginGC_obj_kinds + sizeof(GC_obj_kinds)) /* Variables that used to be in GC_arrays, but need to be accessed by */ /* inline allocation code. If they were in GC_arrays, the inlined */ @@ -1725,12 +1739,12 @@ /* Number of bytes allocated during this collection cycle. */ extern ptr_t GC_objfreelistMAXOBJGRANULES+1; /* free list for NORMAL objects */ -# define beginGC_objfreelist ((ptr_t)(&GC_objfreelist)) +# define beginGC_objfreelist ((ptr_t)(&GC_objfreelist0)) # define endGC_objfreelist (beginGC_objfreelist + sizeof(GC_objfreelist)) extern ptr_t GC_aobjfreelistMAXOBJGRANULES+1; /* free list for atomic (PTRFREE) objects */ -# define beginGC_aobjfreelist ((ptr_t)(&GC_aobjfreelist)) +# define beginGC_aobjfreelist ((ptr_t)(&GC_aobjfreelist0)) # define endGC_aobjfreelist (beginGC_aobjfreelist + sizeof(GC_aobjfreelist)) #endif /* SEPARATE_GLOBALS */ @@ -1807,6 +1821,9 @@ GC_INNER void GC_push_all_stack_sections(ptr_t lo, ptr_t hi, struct GC_traced_stack_sect_s *traced_stack_sect); GC_EXTERN word GC_total_stacksize; /* updated on every push_all_stacks */ +# ifdef STACKPTR_CORRECTOR_AVAILABLE + GC_EXTERN GC_sp_corrector_proc GC_sp_corrector; +# endif #else GC_EXTERN ptr_t GC_blocked_sp; GC_EXTERN struct GC_traced_stack_sect_s *GC_traced_stack_sect; @@ -2135,6 +2152,9 @@ #ifdef THREADS GC_INNER void GC_thr_init(void); GC_INNER void GC_init_parallel(void); +# ifndef DONT_USE_ATEXIT + GC_INNER GC_bool GC_is_main_thread(void); +# endif #else GC_INNER GC_bool GC_is_static_root(void *p); /* Is the address p in one of the registered static */ @@ -2233,7 +2253,7 @@ /* Allocate a large block of size lb bytes. */ /* The block is not cleared. flags argument */ /* should be 0 or IGNORE_OFF_PAGE. */ - /* Calls GC_allchblk to do the actual */ + /* Calls GC_allochblk to do the actual */ /* allocation, but also triggers GC and/or */ /* heap expansion as appropriate. */ /* Does not update GC_bytes_allocd, but does */ @@ -2302,11 +2322,11 @@ #if defined(DBG_HDRS_ALL) || defined(GC_GCJ_SUPPORT) \ || !defined(GC_NO_FINALIZATION) GC_INNER void * GC_generic_malloc_inner_ignore_off_page(size_t lb, int k); - /* Allocate an object, where */ - /* the client guarantees that there */ - /* will always be a pointer to the */ - /* beginning of the object while the */ - /* object is live. */ + /* Allocate an object, where the client */ + /* guarantees that there will always be */ + /* a pointer to the beginning (i.e. */ + /* within the first hblk) of the object */ + /* while it is live. */ #endif GC_INNER GC_bool GC_collect_or_expand(word needed_blocks, @@ -2477,11 +2497,13 @@ GC_INNER void GC_unmap_gap(ptr_t start1, size_t bytes1, ptr_t start2, size_t bytes2); - /* Compute end address for an unmap operation on the indicated block. */ - GC_INLINE ptr_t GC_unmap_end(ptr_t start, size_t bytes) - { - return (ptr_t)((word)(start + bytes) & ~(GC_page_size - 1)); - } +# ifndef NOT_GCBUILD + /* Compute end address for an unmap operation on the indicated block. */ + GC_INLINE ptr_t GC_unmap_end(ptr_t start, size_t bytes) + { + return (ptr_t)((word)(start + bytes) & ~(GC_page_size - 1)); + } +# endif #endif /* USE_MUNMAP */ #ifdef CAN_HANDLE_FORK @@ -2724,7 +2746,7 @@ GC_INNER void GC_mark_thread_local_free_lists(void); #endif -#if defined(GLIBC_2_19_TSX_BUG) && defined(THREADS) +#if defined(GLIBC_2_19_TSX_BUG) && defined(PARALLEL_MARK) /* Parse string like <major>.<minor><tail> and return major value. */ GC_INNER int GC_parse_version(int *pminor, const char *pverstr); #endif @@ -3058,18 +3080,20 @@ #endif #if defined(NEED_FIND_LIMIT) \ + || (defined(WRAP_MARK_SOME) && defined(__GNUC__)) \ || (defined(USE_PROC_FOR_LIBRARIES) && defined(THREADS)) GC_EXTERN JMP_BUF GC_jmp_buf; /* Set up a handler for address faults which will longjmp to */ /* GC_jmp_buf. */ GC_INNER void GC_setup_temporary_fault_handler(void); + /* Undo the effect of GC_setup_temporary_fault_handler. */ GC_INNER void GC_reset_fault_handler(void); #endif /* NEED_FIND_LIMIT || USE_PROC_FOR_LIBRARIES */ /* Some convenience macros for cancellation support. */ -#if defined(CANCEL_SAFE) +#ifdef CANCEL_SAFE # if defined(GC_ASSERTIONS) \ && (defined(USE_COMPILER_TLS) \ || (defined(LINUX) && !defined(ARM32) && GC_GNUC_PREREQ(3, 3) \ @@ -3083,7 +3107,7 @@ # define INCR_CANCEL_DISABLE() # define DECR_CANCEL_DISABLE() # define ASSERT_CANCEL_DISABLED() (void)0 -# endif /* GC_ASSERTIONS & ... */ +# endif /* !GC_ASSERTIONS */ # define DISABLE_CANCEL(state) \ do { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state); \ INCR_CANCEL_DISABLE(); } while (0) @@ -3091,7 +3115,7 @@ do { ASSERT_CANCEL_DISABLED(); \
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/private/gcconfig.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/private/gcconfig.h
Changed
@@ -84,7 +84,7 @@ #endif /* Machine dependent parameters. Some tuning parameters can be found */ -/* near the top of gc_private.h. */ +/* near the top of gc_priv.h. */ /* Machine specific parts contributed by various people. See README file. */ @@ -226,13 +226,14 @@ # define VAX # define mach_type_known # endif -# if defined(mips) || defined(__mips) || defined(_mips) +# if (defined(mips) || defined(__mips) || defined(_mips)) && !defined(__TANDEM) # define MIPS # if defined(nec_ews) || defined(_nec_ews) # define EWS4800 # endif # if !defined(LINUX) && !defined(EWS4800) && !defined(NETBSD) \ - && !defined(OPENBSD) + && !defined(OPENBSD) && !defined(FREEBSD) && !defined(_WIN32_WCE) \ + && !defined(__CEGCC__) && !defined(__MINGW32CE__) # if defined(ultrix) || defined(__ultrix) # define ULTRIX # else @@ -574,7 +575,7 @@ # endif # if defined(_MSC_VER) && defined(_M_IA64) # define IA64 -# define MSWIN32 /* Really win64, but we don't treat 64-bit */ +# define MSWIN32 /* Really Win64, but we do not treat 64-bit */ /* variants as a different platform. */ # endif # endif @@ -652,6 +653,11 @@ # define mach_type_known # endif # endif +# if defined(__x86_64__) && defined(__GNU__) +# define HURD +# define X86_64 +# define mach_type_known +# endif # if defined(__TANDEM) /* Nonstop S-series */ /* FIXME: Should recognize Integrity series? */ @@ -698,8 +704,10 @@ # define mach_type_known # endif -# if defined(__EMSCRIPTEN__) -# define EMSCRIPTEN +# if defined(__EMSCRIPTEN__) || defined(EMSCRIPTEN) +# ifndef EMSCRIPTEN +# define EMSCRIPTEN +# endif # define I386 # define mach_type_known # endif @@ -869,7 +877,7 @@ * * Each architecture may also define the style of virtual dirty bit * implementation to be used: - * GWW_VDB: Use win32 GetWriteWatch primitive. + * GWW_VDB: Use Win32 GetWriteWatch primitive. * MPROTECT_VDB: Write protect the heap and catch faults. * PROC_VDB: Use the SVR4 /proc primitives to read dirty bits. * SOFT_VDB: Use the Linux /proc primitives to track dirty bits. @@ -1422,8 +1430,15 @@ # define OS_TYPE "EMSCRIPTEN" # define DATASTART (ptr_t)ALIGNMENT # define DATAEND (ptr_t)ALIGNMENT -# define USE_MMAP_ANON /* avoid /dev/zero, not supported */ + /* Emscripten does emulate mmap and munmap, but those should */ + /* not be used in the collector, since WebAssembly lacks the */ + /* native support of memory mapping. Use sbrk() instead. */ +# undef USE_MMAP +# undef USE_MUNMAP # define STACK_GROWS_DOWN +# if defined(GC_THREADS) && !defined(CPPCHECK) +# error No threads support yet +# endif # endif # if defined(__QNX__) # define OS_TYPE "QNX" @@ -2416,6 +2431,15 @@ # define PROC_VDB # endif # endif +# ifdef HURD +# define OS_TYPE "HURD" +# define HEURISTIC2 +# define SEARCH_FOR_DATA_START + extern int _end; +# define DATAEND ((ptr_t)(_end)) +# define DYNAMIC_LOADING +# define USE_MMAP_ANON +# endif # ifdef CYGWIN32 # ifndef USE_WINALLOC # if defined(THREAD_LOCAL_ALLOC) @@ -2928,7 +2952,7 @@ /* lock. This isn't safe after the world has stopped. So we must */ /* call GC_register_dynamic_libraries before stopping the world. */ /* For performance reasons, this may be beneficial on other */ - /* platforms as well, though it should be avoided in win32. */ + /* platforms as well, though it should be avoided on Windows. */ #endif /* LINUX */ #if defined(SEARCH_FOR_DATA_START) @@ -2997,18 +3021,13 @@ # error Invalid config: GWW_VDB requires USE_WINALLOC #endif -#if (((defined(MSWIN32) || defined(MSWINCE)) && !defined(__GNUC__)) \ - || (defined(MSWIN32) && defined(I386)) /* for Win98 */ \ +#if (defined(MSWIN32) || defined(MSWINCE) \ || (defined(USE_PROC_FOR_LIBRARIES) && defined(THREADS))) \ && !defined(NO_CRT) && !defined(NO_WRAP_MARK_SOME) /* Under rare conditions, we may end up marking from nonexistent */ /* memory. Hence we need to be prepared to recover by running */ /* GC_mark_some with a suitable handler in place. */ - /* TODO: Probably replace __GNUC__ above with ndef GC_PTHREADS. */ - /* FIXME: Should we really need it for WinCE? If yes then */ - /* WRAP_MARK_SOME should be also defined for CeGCC which requires */ - /* CPU/OS-specific code in mark_ex_handler and GC_mark_some (for */ - /* manual stack unwinding and exception handler installation). */ + /* TODO: Should we also define it for Cygwin? */ # define WRAP_MARK_SOME #endif @@ -3043,6 +3062,15 @@ # define HAVE_PTHREAD_ATTR_GET_NP 1 #endif +#if defined(GC_PTHREADS) && !defined(E2K) && !defined(IA64) \ + && (!defined(DARWIN) || defined(DARWIN_DONT_PARSE_STACK)) \ + && !defined(SN_TARGET_PSP2) && !defined(REDIRECT_MALLOC) + /* Note: unimplemented in case of redirection of malloc() because */ + /* the client-provided function might call some pthreads primitive */ + /* which, in turn, may use malloc() internally. */ +# define STACKPTR_CORRECTOR_AVAILABLE +#endif + #if defined(UNIX_LIKE) && defined(THREADS) && !defined(NO_CANCEL_SAFE) \ && !defined(HOST_ANDROID) /* Make the code cancellation-safe. This basically means that we */ @@ -3076,6 +3104,14 @@ # define CAN_HANDLE_FORK #endif +/* Workaround "failed to create new win32 semaphore" Cygwin fatal error */ +/* during semaphores fixup-after-fork. */ +#if defined(CYGWIN32) && defined(GC_WIN32_THREADS) \ + && defined(CAN_HANDLE_FORK) && !defined(EMULATE_PTHREAD_SEMAPHORE) \ + && !defined(CYGWIN_SEM_FIXUP_AFTER_FORK_BUG_FIXED) +# define EMULATE_PTHREAD_SEMAPHORE +#endif + #if defined(CAN_HANDLE_FORK) && !defined(CAN_CALL_ATFORK) \ && !defined(GC_NO_CAN_CALL_ATFORK) && !defined(HOST_TIZEN) \ && !defined(HURD) && (!defined(HOST_ANDROID) || __ANDROID_API__ >= 21) @@ -3106,7 +3142,7 @@ #if !defined(MSGBOX_ON_ERROR) && !defined(NO_MSGBOX_ON_ERROR) \ && !defined(SMALL_CONFIG) && defined(MSWIN32) \ && !defined(MSWINRT_FLAVOR) && !defined(MSWIN_XBOX1) - /* Show Windows message box with "OK" button on a GC fatal error. */ + /* Show a Windows message box with "OK" button on a GC fatal error. */ /* Client application is terminated once the user clicks the button. */ # define MSGBOX_ON_ERROR #endif @@ -3215,7 +3251,7 @@ #endif #if defined(POINTER_SHIFT) && !defined(POINTER_MASK) -# define POINTER_MASK ((word)(-1)) +# define POINTER_MASK ((word)(signed_word)(-1)) #endif #if !defined(FIXUP_POINTER) && defined(POINTER_MASK) @@ -3245,7 +3281,11 @@ # endif # if defined(REDIRECT_MALLOC) && defined(THREADS) && !defined(LINUX) \ && !defined(REDIRECT_MALLOC_IN_HEADER) -# error REDIRECT_MALLOC with THREADS works at most on Linux + /* May work on other platforms (e.g. Darwin) provided the client */ + /* ensures all the client threads are registered with the GC, */ + /* e.g. by using the preprocessor-based interception of the thread */ + /* primitives (i.e., define GC_THREADS and include gc.h from all */ + /* the client files those are using pthread_create and friends). */ # endif #endif /* !CPPCHECK */
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/private/pthread_stop_world.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/private/pthread_stop_world.h
Changed
@@ -43,7 +43,7 @@ /* going into a syscall. 20 is more than we need, but it's an */ /* overestimate in case the instrumented function uses any callee */ /* saved registers, they may be pushed to the stack much earlier. */ - /* Also, on amd64 'push' puts 8 bytes on the stack even though */ + /* Also, on x64 'push' puts 8 bytes on the stack even though */ /* our pointers are 4 bytes. */ # ifdef ARM32 /* Space for r4-r8, r10-r12, r14. */
View file
_service:tar_scm:gc-8.2.2.tar.gz/include/private/pthread_support.h -> _service:tar_scm:gc-8.2.4.tar.gz/include/private/pthread_support.h
Changed
@@ -51,7 +51,7 @@ /* positive about the race between */ /* GC_has_other_debug_info and */ /* GC_suspend_handler_inner (which */ - /* sets store_stop.stack_ptr). */ + /* sets stop_info.stack_ptr). */ # endif struct GC_Thread_Rep * next; /* More recently allocated threads */
View file
_service:tar_scm:gc-8.2.2.tar.gz/ltmain.sh -> _service:tar_scm:gc-8.2.4.tar.gz/ltmain.sh
Changed
@@ -1,12 +1,12 @@ -#! /bin/sh +#! /usr/bin/env sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in -## by inline-source v2014-01-03.01 +## by inline-source v2019-02-19.15 -# libtool (GNU libtool) 2.4.6 +# libtool (GNU libtool) 2.4.7 # Provide generalized library-building support services. # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 -# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -31,8 +31,8 @@ PROGRAM=libtool PACKAGE=libtool -VERSION=2.4.6 -package_revision=2.4.6 +VERSION=2.4.7 +package_revision=2.4.7 ## ------ ## @@ -64,34 +64,25 @@ # libraries, which are installed to $pkgauxdir. # Set a version string for this script. -scriptversion=2015-01-20.17; # UTC +scriptversion=2019-02-19.15; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 -# Copyright (C) 2004-2015 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. - -# As a special exception to the GNU General Public License, if you distribute -# this file as part of a program or library that is built using GNU Libtool, -# you may include this file under the same distribution terms that you use -# for the rest of that program. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2004-2019, 2021 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# <https://opensource.org/license/MIT>, and GPL version 2 or later +# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. -# Please report bugs or propose patches to gary@gnu.org. +# Please report bugs or propose patches to: +# <https://github.com/gnulib-modules/bootstrap/issues> ## ------ ## @@ -139,9 +130,12 @@ _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +# These NLS vars are set unconditionally (bootstrap issue #24). Unset those +# in case the environment reset is needed later and the $save_* variant is not +# defined (see the code above). +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL # Make sure IFS has a sensible default sp=' ' @@ -159,6 +153,26 @@ fi +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } +} + + +# Make sure CDPATH doesn't cause `cd` commands to output the target dir. +func_unset CDPATH + +# Make sure ${,E,F}GREP behave sanely. +func_unset GREP_OPTIONS + ## ------------------------- ## ## Locate command utilities. ## @@ -259,7 +273,7 @@ rm -f conftest.in conftest.tmp conftest.nl conftest.out } - func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } @@ -295,7 +309,7 @@ rm -f conftest.in conftest.tmp conftest.nl conftest.out } - func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } @@ -360,6 +374,35 @@ s/\\(^$_G_bs\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" +# require_check_ifs_backslash +# --------------------------- +# Check if we can use backslash as IFS='\' separator, and set +# $check_ifs_backshlash_broken to ':' or 'false'. +require_check_ifs_backslash=func_require_check_ifs_backslash +func_require_check_ifs_backslash () +{ + _G_save_IFS=$IFS + IFS='\' + _G_check_ifs_backshlash='a\\b' + for _G_i in $_G_check_ifs_backshlash + do + case $_G_i in + a) + check_ifs_backshlash_broken=false + ;; + '') + break + ;; + *) + check_ifs_backshlash_broken=: + break + ;; + esac + done + IFS=$_G_save_IFS + require_check_ifs_backslash=: +} + ## ----------------- ## ## Global variables. ## @@ -580,16 +623,16 @@ { $debug_cmd - func_quote_for_eval "$2" - eval "$1+=\\ \$func_quote_for_eval_result" + func_quote_arg pretty "$2" + eval "$1+=\\ \$func_quote_arg_result" }' else func_append_quoted () { $debug_cmd - func_quote_for_eval "$2" - eval "$1=\$$1\\ \$func_quote_for_eval_result" + func_quote_arg pretty "$2" + eval "$1=\$$1\\ \$func_quote_arg_result" } fi @@ -1091,85 +1134,203 @@ } -# func_quote_for_eval ARG...
View file
_service:tar_scm:gc-8.2.2.tar.gz/m4/libtool.m4 -> _service:tar_scm:gc-8.2.4.tar.gz/m4/libtool.m4
Changed
@@ -1,6 +1,7 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Copyright (C) 1996-2001, 2003-2019, 2021-2022 Free Software +# Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -31,7 +32,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. ) -# serial 58 LT_INIT +# serial 59 LT_INIT # LT_PREREQ(VERSION) @@ -181,6 +182,7 @@ m4_require(_LT_CHECK_SHELL_FEATURES)dnl m4_require(_LT_PATH_CONVERSION_FUNCTIONS)dnl m4_require(_LT_CMD_RELOAD)dnl +m4_require(_LT_DECL_FILECMD)dnl m4_require(_LT_CHECK_MAGIC_METHOD)dnl m4_require(_LT_CHECK_SHAREDLIB_FROM_LINKLIB)dnl m4_require(_LT_CMD_OLD_ARCHIVE)dnl @@ -219,8 +221,8 @@ ofile=libtool can_build_shared=yes -# All known linkers require a '.a' archive for static linking (except MSVC, -# which needs '.lib'). +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld @@ -778,7 +780,7 @@ # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ + $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || @@ -1042,8 +1044,8 @@ _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF @@ -1067,17 +1069,12 @@ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin91*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - 10.012,.*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + darwin*) + case $MACOSX_DEPLOYMENT_TARGET,$host in + 10.012,*|,*powerpc*-darwin5-8*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac @@ -1126,12 +1123,12 @@ output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if($1, CXX, if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ,) else @@ -1245,7 +1242,8 @@ # _LT_WITH_SYSROOT # ---------------- AC_DEFUN(_LT_WITH_SYSROOT, -AC_MSG_CHECKING(for sysroot) +m4_require(_LT_DECL_SED)dnl +AC_MSG_CHECKING(for sysroot) AC_ARG_WITH(sysroot, AS_HELP_STRING(--with-sysroot@<:@=DIR@:>@, Search for dependent libraries within DIR (or the compiler's sysroot @@ -1262,7 +1260,7 @@ fi ;; #( /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( @@ -1292,7 +1290,7 @@ # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; @@ -1309,7 +1307,7 @@ echo '#line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; @@ -1321,7 +1319,7 @@ ;; esac else - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; @@ -1343,7 +1341,7 @@ echo '#line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; @@ -1351,7 +1349,7 @@ emul="${emul}64" ;; esac - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; @@ -1359,7 +1357,7 @@ emul="${emul}ltsmip" ;; esac - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; @@ -1379,14 +1377,14 @@ # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in + case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) - case `/usr/bin/file conftest.o` in + case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; @@ -1454,7 +1452,7 @@ # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in + case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) @@ -1493,9 +1491,22 @@ m4_defun(_LT_PROG_AR, AC_CHECK_TOOLS(AR, ar, false) : ${AR=ar}
View file
_service:tar_scm:gc-8.2.2.tar.gz/m4/ltoptions.m4 -> _service:tar_scm:gc-8.2.4.tar.gz/m4/ltoptions.m4
Changed
@@ -1,7 +1,7 @@ # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software -# Foundation, Inc. +# Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2022 Free +# Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives
View file
_service:tar_scm:gc-8.2.2.tar.gz/m4/ltsugar.m4 -> _service:tar_scm:gc-8.2.4.tar.gz/m4/ltsugar.m4
Changed
@@ -1,6 +1,6 @@ # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 #
View file
_service:tar_scm:gc-8.2.2.tar.gz/m4/ltversion.m4 -> _service:tar_scm:gc-8.2.4.tar.gz/m4/ltversion.m4
Changed
@@ -1,6 +1,7 @@ # ltversion.m4 -- version numbers -*- Autoconf -*- # -# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Copyright (C) 2004, 2011-2019, 2021-2022 Free Software Foundation, +# Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives @@ -9,15 +10,15 @@ # @configure_input@ -# serial 4179 ltversion.m4 +# serial 4245 ltversion.m4 # This file is part of GNU Libtool -m4_define(LT_PACKAGE_VERSION, 2.4.6) -m4_define(LT_PACKAGE_REVISION, 2.4.6) +m4_define(LT_PACKAGE_VERSION, 2.4.7) +m4_define(LT_PACKAGE_REVISION, 2.4.7) AC_DEFUN(LTVERSION_VERSION, -macro_version='2.4.6' -macro_revision='2.4.6' +macro_version='2.4.7' +macro_revision='2.4.7' _LT_DECL(, macro_version, 0, Which release of libtool.m4 was used?) _LT_DECL(, macro_revision, 0) )
View file
_service:tar_scm:gc-8.2.2.tar.gz/m4/lt~obsolete.m4 -> _service:tar_scm:gc-8.2.4.tar.gz/m4/lt~obsolete.m4
Changed
@@ -1,7 +1,7 @@ # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software -# Foundation, Inc. +# Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 Free +# Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives
View file
_service:tar_scm:gc-8.2.2.tar.gz/mach_dep.c -> _service:tar_scm:gc-8.2.4.tar.gz/mach_dep.c
Changed
@@ -326,7 +326,7 @@ ucontext_t ctxt; # ifdef GETCONTEXT_FPU_EXCMASK_BUG /* Workaround a bug (clearing the FPU exception mask) in */ - /* getcontext on Linux/x86_64. */ + /* getcontext on Linux/x64. */ # ifdef X86_64 /* We manipulate FPU control word here just not to force the */ /* client application to use -lm linker option. */ @@ -395,8 +395,8 @@ /* We're not sure whether he would like */ /* to be acknowledged for it or not. */ jmp_buf regs; - word * i = (word *)®s; - ptr_t lim = (ptr_t)(®s) + sizeof(regs); + word *i = (word *)®s0; + ptr_t lim = (ptr_t)(®s0) + sizeof(regs); /* Setjmp doesn't always clear all of the buffer. */ /* That tends to preserve garbage. Clear it. */
View file
_service:tar_scm:gc-8.2.2.tar.gz/malloc.c -> _service:tar_scm:gc-8.2.4.tar.gz/malloc.c
Changed
@@ -154,7 +154,7 @@ } /* Allocate lb bytes for an object of kind k. */ -/* Should not be used to directly to allocate objects */ +/* Should not be used to directly allocate objects */ /* that require special handling on allocation. */ GC_INNER void * GC_generic_malloc_inner(size_t lb, int k) { @@ -199,9 +199,11 @@ obj_link(op) = 0; GC_bytes_allocd += GRANULES_TO_BYTES((word)lg); } else { - op = (ptr_t)GC_alloc_large_and_clear(ADD_SLOP(lb), k, 0); + size_t lb_adjusted = ADD_SLOP(lb); + + op = (ptr_t)GC_alloc_large_and_clear(lb_adjusted, k, 0 /* flags */); if (op != NULL) - GC_bytes_allocd += lb; + GC_bytes_allocd += lb_adjusted; } return op; @@ -210,10 +212,10 @@ #if defined(DBG_HDRS_ALL) || defined(GC_GCJ_SUPPORT) \ || !defined(GC_NO_FINALIZATION) /* Allocate a composite object of size n bytes. The caller */ - /* guarantees that pointers past the first page are not relevant. */ + /* guarantees that pointers past the first hblk are not relevant. */ GC_INNER void * GC_generic_malloc_inner_ignore_off_page(size_t lb, int k) { - word lb_adjusted; + size_t lb_adjusted; void * op; GC_ASSERT(I_HOLD_LOCK()); @@ -265,7 +267,11 @@ LOCK(); result = (ptr_t)GC_alloc_large(lb_rounded, k, 0); if (0 != result) { - if (GC_debugging_started) { + if (GC_debugging_started +# ifndef THREADS + || init +# endif + ) { BZERO(result, n_blocks * HBLKSIZE); } else { # ifdef THREADS @@ -280,9 +286,13 @@ GC_bytes_allocd += lb_rounded; } UNLOCK(); - if (init && !GC_debugging_started && 0 != result) { - BZERO(result, n_blocks * HBLKSIZE); - } +# ifdef THREADS + if (init && !GC_debugging_started && result != NULL) { + /* Clear the rest (i.e. excluding the initial 2 words). */ + BZERO((word *)result + 2, + n_blocks * HBLKSIZE - 2 * sizeof(word)); + } +# endif } if (0 == result) { return((*GC_get_oom_fn())(lb)); @@ -470,9 +480,19 @@ GC_init(); /* if not called yet */ if (!GC_text_mapping("libpthread-", &GC_libpthread_start, &GC_libpthread_end)) { + /* Some libc implementations like bionic, musl and glibc 2.34 */ + /* do not have libpthread.so because the pthreads-related code */ + /* is located in libc.so, thus potential calloc calls from such */ + /* code are forwarded to real (libc) calloc without any special */ + /* handling on the libgc side. Checking glibc version at */ + /* compile time to turn off the warning seems to be fine. */ + /* TODO: Remove GC_text_mapping() call for this case. */ +# if defined(__GLIBC__) \ + && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 34)) WARN("Failed to find libpthread.so text mapping: Expect crash\n", 0); /* This might still work with some versions of libpthread, */ - /* so we don't abort. Perhaps we should. */ + /* so we do not abort. */ +# endif /* Generate message only once: */ GC_libpthread_start = (ptr_t)1; } @@ -600,7 +620,7 @@ LOCK(); GC_bytes_freed += sz; if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= sz; - /* Its unnecessary to clear the mark bit. If the */ + /* It's unnecessary to clear the mark bit. If the */ /* object is reallocated, it doesn't matter. O.w. the */ /* collector will do it, since it's on a free list. */ if (ok -> ok_init && EXPECT(sz > sizeof(word), TRUE)) {
View file
_service:tar_scm:gc-8.2.2.tar.gz/mark.c -> _service:tar_scm:gc-8.2.4.tar.gz/mark.c
Changed
@@ -15,24 +15,10 @@ * */ -#if defined(__MINGW32__) && !defined(__MINGW_EXCPT_DEFINE_PSDK) \ - && defined(__i386__) /* cannot use macros from gcconfig.h */ - /* Otherwise EXCEPTION_REGISTRATION type declaration from winnt.h */ - /* might be used. That declaration has "handler" callback with NTAPI */ - /* attribute. The proper type (with "handler" field compatible with */ - /* GC mark_ex_handler) is declared in excpt.h. The given macro is */ - /* defined before any system header include. */ -# define __MINGW_EXCPT_DEFINE_PSDK 1 -#endif - #include "private/gc_pmark.h" #include <stdio.h> -#if defined(MSWIN32) && defined(__GNUC__) -# include <excpt.h> -#endif - /* Make arguments appear live to compiler. Put here to minimize the */ /* risk of inlining. Used to minimize junk left in registers. */ GC_ATTR_NOINLINE @@ -76,7 +62,7 @@ /*, */ OK_DISCLAIM_INITZ }, # ifdef GC_ATOMIC_UNCOLLECTABLE { &GC_auobjfreelist0, 0, - /* 0 | */ GC_DS_LENGTH, FALSE /* add length to descr */, FALSE + /* 0 | */ GC_DS_LENGTH, FALSE, FALSE /*, */ OK_DISCLAIM_INITZ }, # endif }; @@ -272,10 +258,12 @@ /* We hold the allocation lock. In the case of */ /* incremental collection, the world may not be stopped.*/ #ifdef WRAP_MARK_SOME - /* For win32, this is called after we establish a structured */ - /* exception handler, in case Windows unmaps one of our root */ - /* segments. See below. In either case, we acquire the */ - /* allocator lock long before we get here. */ + /* For Win32, this is called after we establish a structured */ + /* exception (or signal) handler, in case Windows unmaps one */ + /* of our root segments. See below. In either case, we */ + /* acquire the allocator lock long before we get here. */ + /* Note that this code should never generate an incremental */ + /* GC write fault. */ STATIC GC_bool GC_mark_some_inner(ptr_t cold_gc_frame) #else GC_INNER GC_bool GC_mark_some(ptr_t cold_gc_frame) @@ -401,129 +389,36 @@ #ifdef WRAP_MARK_SOME -# if (defined(MSWIN32) || defined(MSWINCE)) && defined(__GNUC__) - - typedef struct { - EXCEPTION_REGISTRATION ex_reg; - void *alt_path; - } ext_ex_regn; - - static EXCEPTION_DISPOSITION mark_ex_handler( - struct _EXCEPTION_RECORD *ex_rec, - void *est_frame, - struct _CONTEXT *context, - void *disp_ctxt GC_ATTR_UNUSED) - { - if (ex_rec->ExceptionCode == STATUS_ACCESS_VIOLATION) { - ext_ex_regn *xer = (ext_ex_regn *)est_frame; - - /* Unwind from the inner function assuming the standard */ - /* function prologue. */ - /* Assumes code has not been compiled with */ - /* -fomit-frame-pointer. */ - context->Esp = context->Ebp; - context->Ebp = *((DWORD *)context->Esp); - context->Esp = context->Esp - 8; - - /* Resume execution at the "real" handler within the */ - /* wrapper function. */ - context->Eip = (DWORD )(xer->alt_path); - - return ExceptionContinueExecution; - - } else { - return ExceptionContinueSearch; - } - } -# endif /* __GNUC__ && MSWIN32 */ - GC_INNER GC_bool GC_mark_some(ptr_t cold_gc_frame) { GC_bool ret_val; -# if defined(MSWIN32) || defined(MSWINCE) -# ifndef __GNUC__ - /* Windows 98 appears to asynchronously create and remove */ + /* Windows appears to asynchronously create and remove */ /* writable memory mappings, for reasons we haven't yet */ /* understood. Since we look for writable regions to */ /* determine the root set, we may try to mark from an */ /* address range that disappeared since we started the */ /* collection. Thus we have to recover from faults here. */ - /* This code does not appear to be necessary for Windows */ - /* 95/NT/2000+. Note that this code should never generate */ - /* an incremental GC write fault. */ /* This code seems to be necessary for WinCE (at least in */ /* the case we'd decide to add MEM_PRIVATE sections to */ /* data roots in GC_register_dynamic_libraries()). */ /* It's conceivable that this is the same issue with */ /* terminating threads that we see with Linux and */ /* USE_PROC_FOR_LIBRARIES. */ - +# if (defined(MSWIN32) || defined(MSWINCE)) && !defined(__GNUC__) __try { ret_val = GC_mark_some_inner(cold_gc_frame); } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { goto handle_ex; } -# if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS) - /* With DllMain-based thread tracking, a thread may have */ - /* started while we were marking. This is logically equivalent */ - /* to the exception case; our results are invalid and we have */ - /* to start over. This cannot be prevented since we can't */ - /* block in DllMain. */ - if (GC_started_thread_while_stopped()) - goto handle_thr_start; -# endif - rm_handler: - return ret_val; - -# else /* __GNUC__ */ - - /* Manually install an exception handler since GCC does */ - /* not yet support Structured Exception Handling (SEH) on */ - /* Win32. */ - - ext_ex_regn er; - -# if GC_GNUC_PREREQ(4, 7) || GC_CLANG_PREREQ(3, 3) -# pragma GCC diagnostic push - /* Suppress "taking the address of label is non-standard" warning. */ -# if defined(__clang__) || GC_GNUC_PREREQ(6, 0) -# pragma GCC diagnostic ignored "-Wpedantic" -# else - /* GCC before ~4.8 does not accept "-Wpedantic" quietly. */ -# pragma GCC diagnostic ignored "-pedantic" -# endif - er.alt_path = &&handle_ex; -# pragma GCC diagnostic pop -# elif !defined(CPPCHECK) /* pragma diagnostic is not supported */ - er.alt_path = &&handle_ex; -# endif - er.ex_reg.handler = mark_ex_handler; - __asm__ __volatile__ ("movl %%fs:0, %0" : "=r" (er.ex_reg.prev)); - __asm__ __volatile__ ("movl %0, %%fs:0" : : "r" (&er)); - ret_val = GC_mark_some_inner(cold_gc_frame); - /* Prevent GCC from considering the following code unreachable */ - /* and thus eliminating it. */ - if (er.alt_path == 0) - goto handle_ex; -# if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS) - if (GC_started_thread_while_stopped()) - goto handle_thr_start; -# endif - rm_handler: - /* Uninstall the exception handler. */ - __asm__ __volatile__ ("mov %0, %%fs:0" : : "r" (er.ex_reg.prev)); - return ret_val; - -# endif /* __GNUC__ */ -# else /* !MSWIN32 */ +# else /* Here we are handling the case in which /proc is used for root */ /* finding, and we have threads. We may find a stack for a */ /* thread that is in the process of exiting, and disappears */ /* while we are marking it. This seems extremely difficult to */ /* avoid otherwise. */ -# ifndef DEFAULT_VDB +# if defined(USE_PROC_FOR_LIBRARIES) && !defined(DEFAULT_VDB) if (GC_auto_incremental) { static GC_bool is_warned = FALSE; @@ -537,26 +432,36 @@ GC_setup_temporary_fault_handler(); if(SETJMP(GC_jmp_buf) != 0) goto handle_ex; ret_val = GC_mark_some_inner(cold_gc_frame); - rm_handler: GC_reset_fault_handler(); - return ret_val; +# endif -# endif /* !MSWIN32 */ +# if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS) + /* With DllMain-based thread tracking, a thread may have */ + /* started while we were marking. This is logically equivalent */ + /* to the exception case; our results are invalid and we have */ + /* to start over. This cannot be prevented since we can't */
View file
_service:tar_scm:gc-8.2.2.tar.gz/mark_rts.c -> _service:tar_scm:gc-8.2.4.tar.gz/mark_rts.c
Changed
@@ -578,9 +578,7 @@ } else { next = GC_next_exclusion((ptr_t)start); } - if (0 != next) { - size_t i; - + if (next != NULL) { if ((word)(next -> e_start) < (word) finish) { /* incomplete error check. */ ABORT("Exclusion ranges overlap"); @@ -590,14 +588,18 @@ next -> e_start = (ptr_t)start; return; } - next_index = next - GC_excl_table; + } + + next_index = GC_excl_table_entries; + if (next_index >= MAX_EXCLUSIONS) ABORT("Too many exclusions"); + if (next != NULL) { + size_t i; + + next_index = (size_t)(next - GC_excl_table); for (i = GC_excl_table_entries; i > next_index; --i) { GC_excl_tablei = GC_excl_tablei-1; } - } else { - next_index = GC_excl_table_entries; } - if (GC_excl_table_entries == MAX_EXCLUSIONS) ABORT("Too many exclusions"); GC_excl_tablenext_index.e_start = (ptr_t)start; GC_excl_tablenext_index.e_end = (ptr_t)finish; ++GC_excl_table_entries; @@ -679,7 +681,8 @@ #ifdef THREADS -GC_INNER void GC_push_all_stack_sections(ptr_t lo, ptr_t hi, +GC_INNER void GC_push_all_stack_sections( + ptr_t lo /* top */, ptr_t hi /* bottom */, struct GC_traced_stack_sect_s *traced_stack_sect) { while (traced_stack_sect != NULL) { @@ -751,8 +754,9 @@ } /* Similar to GC_push_all_stack_sections() but also uses cold_gc_frame. */ -STATIC void GC_push_all_stack_part_eager_sections(ptr_t lo, ptr_t hi, - ptr_t cold_gc_frame, struct GC_traced_stack_sect_s *traced_stack_sect) +STATIC void GC_push_all_stack_part_eager_sections( + ptr_t lo /* top */, ptr_t hi /* bottom */, ptr_t cold_gc_frame, + struct GC_traced_stack_sect_s *traced_stack_sect) { GC_ASSERT(traced_stack_sect == NULL || cold_gc_frame == NULL || (word)cold_gc_frame HOTTER_THAN (word)traced_stack_sect); @@ -890,7 +894,7 @@ /* not robust against mark stack overflow. */ /* Re-register dynamic libraries, in case one got added. */ /* There is some argument for doing this as late as possible, */ - /* especially on win32, where it can change asynchronously. */ + /* especially on Win32, where it can change asynchronously. */ /* In those cases, we do it here. But on other platforms, it's */ /* not safe with the world stopped, so we do it earlier. */ # if !defined(REGISTER_LIBRARIES_EARLY)
View file
_service:tar_scm:gc-8.2.2.tar.gz/misc.c -> _service:tar_scm:gc-8.2.4.tar.gz/misc.c
Changed
@@ -248,7 +248,7 @@ GC_size_mapi = ROUNDED_UP_GRANULES(i); # ifndef _MSC_VER GC_ASSERT(GC_size_mapi < TINY_FREELISTS); - /* Seems to tickle bug in VC++ 2008 for AMD64 */ + /* Seems to tickle bug in VC++ 2008 for x64 */ # endif } /* We leave the rest of the array to be filled in on demand. */ @@ -782,12 +782,18 @@ { if (GC_find_leak && !skip_gc_atexit) { # ifdef THREADS - GC_in_thread_creation = TRUE; /* OK to collect from unknown thread. */ - GC_gcollect(); - GC_in_thread_creation = FALSE; -# else - GC_gcollect(); + /* Check that the thread executing at-exit functions is */ + /* the same as the one performed the GC initialization, */ + /* otherwise the latter thread might already be dead but */ + /* still registered and this, as a consequence, might */ + /* cause a signal delivery fail when suspending the threads */ + /* on platforms that do not guarantee ESRCH returned if */ + /* the signal is not delivered. */ + /* It should also prevent "Collecting from unknown thread" */ + /* abort in GC_push_all_stacks(). */ + if (!GC_is_main_thread() || !GC_thread_is_registered()) return; # endif + GC_gcollect(); } } #endif @@ -1200,7 +1206,8 @@ # if ALIGNMENT > GC_DS_TAGS /* Adjust normal object descriptor for extra allocation. */ if (EXTRA_BYTES != 0) - GC_obj_kindsNORMAL.ok_descriptor = (word)(-ALIGNMENT) | GC_DS_LENGTH; + GC_obj_kindsNORMAL.ok_descriptor = + ((~(word)ALIGNMENT) + 1) | GC_DS_LENGTH; # endif GC_exclude_static_roots_inner(beginGC_arrays, endGC_arrays); GC_exclude_static_roots_inner(beginGC_obj_kinds, endGC_obj_kinds); @@ -1402,7 +1409,7 @@ LOCK(); if (!GC_incremental) { GC_setpagesize(); - /* if (GC_no_win32_dlls) goto out; Should be win32S test? */ + /* TODO: Should we skip enabling incremental if win32s? */ maybe_install_looping_handler(); /* Before write fault handler! */ if (!GC_is_initialized) { UNLOCK(); @@ -2147,13 +2154,9 @@ void * result; DCL_LOCK_STATE; -# ifdef THREADS - LOCK(); -# endif + LOCK(); result = (*fn)(client_data); -# ifdef THREADS - UNLOCK(); -# endif + UNLOCK(); return(result); } @@ -2411,6 +2414,37 @@ UNLOCK(); return fn; } + +# ifdef STACKPTR_CORRECTOR_AVAILABLE + GC_INNER GC_sp_corrector_proc GC_sp_corrector = 0; +# endif + + GC_API void GC_CALL GC_set_sp_corrector( + GC_sp_corrector_proc fn GC_ATTR_UNUSED) + { +# ifdef STACKPTR_CORRECTOR_AVAILABLE + DCL_LOCK_STATE; + + LOCK(); + GC_sp_corrector = fn; + UNLOCK(); +# endif + } + + GC_API GC_sp_corrector_proc GC_CALL GC_get_sp_corrector(void) + { +# ifdef STACKPTR_CORRECTOR_AVAILABLE + GC_sp_corrector_proc fn; + DCL_LOCK_STATE; + + LOCK(); + fn = GC_sp_corrector; + UNLOCK(); + return fn; +# else + return 0; /* unsupported */ +# endif + } #endif /* THREADS */ /* Setter and getter functions for the public R/W function variables. */ @@ -2419,8 +2453,9 @@ GC_API void GC_CALL GC_set_oom_fn(GC_oom_func fn) { - GC_ASSERT(NONNULL_ARG_NOT_NULL(fn)); DCL_LOCK_STATE; + + GC_ASSERT(NONNULL_ARG_NOT_NULL(fn)); LOCK(); GC_oom_fn = fn; UNLOCK();
View file
_service:tar_scm:gc-8.2.2.tar.gz/new_hblk.c -> _service:tar_scm:gc-8.2.4.tar.gz/new_hblk.c
Changed
@@ -112,7 +112,7 @@ word *p, *prev; word *last_object; /* points to last object in new hblk */ - /* Do a few prefetches here, just because its cheap. */ + /* Do a few prefetches here, just because it's cheap. */ /* If we were more serious about it, these should go inside */ /* the loops. But write prefetches usually don't seem to */ /* matter much. */
View file
_service:tar_scm:gc-8.2.2.tar.gz/os_dep.c -> _service:tar_scm:gc-8.2.4.tar.gz/os_dep.c
Changed
@@ -255,7 +255,7 @@ if (maps_size > old_maps_size) { /* This might be caused by e.g. thread creation. */ WARN("Unexpected asynchronous /proc/self/maps growth" - " (to %" WARN_PRIdPTR " bytes)\n", maps_size); + " (to %" WARN_PRIuPTR " bytes)\n", maps_size); } # endif } while (maps_size >= maps_buf_sz @@ -414,7 +414,7 @@ #endif /* NEED_PROC_MAPS */ #if defined(SEARCH_FOR_DATA_START) - /* The I386 case can be handled without a search. The Alpha case */ + /* The x86 case can be handled without a search. The Alpha case */ /* used to be handled differently as well, but the rules changed */ /* for recent Linux versions. This seems to be the easiest way to */ /* cover all versions. */ @@ -515,6 +515,10 @@ #if defined(ADDRESS_SANITIZER) && (defined(UNIX_LIKE) \ || defined(NEED_FIND_LIMIT) || defined(MPROTECT_VDB)) \ && !defined(CUSTOM_ASAN_DEF_OPTIONS) + EXTERN_C_BEGIN + GC_API const char *__asan_default_options(void); + EXTERN_C_END + /* To tell ASan to allow GC to use its own SIGBUS/SEGV handlers. */ /* The function is exported just to be visible to ASan library. */ GC_API const char *__asan_default_options(void) @@ -726,7 +730,7 @@ GetSystemInfo(&GC_sysinfo); # if defined(CYGWIN32) && (defined(MPROTECT_VDB) || defined(USE_MUNMAP)) /* Allocations made with mmap() are aligned to the allocation */ - /* granularity, which (at least on 64-bit Windows OS) is not the */ + /* granularity, which (at least on Win64) is not the */ /* same as the page size. Probably a separate variable could */ /* be added to distinguish the allocation granularity from the */ /* actual page size, but in practice there is no good reason to */ @@ -876,7 +880,8 @@ # define GET_MAIN_STACKBASE_SPECIAL # endif /* AMIGA */ -# if defined(NEED_FIND_LIMIT) || defined(UNIX_LIKE) +# if defined(NEED_FIND_LIMIT) || defined(UNIX_LIKE) \ + || (defined(WRAP_MARK_SOME) && defined(__GNUC__)) typedef void (*GC_fault_handler_t)(int); @@ -942,6 +947,7 @@ # endif /* NEED_FIND_LIMIT || UNIX_LIKE */ # if defined(NEED_FIND_LIMIT) \ + || (defined(WRAP_MARK_SOME) && defined(__GNUC__)) \ || (defined(USE_PROC_FOR_LIBRARIES) && defined(THREADS)) /* Some tools to implement HEURISTIC2 */ # define MIN_PAGE_SIZE 256 /* Smallest conceivable page size, bytes */ @@ -1235,20 +1241,31 @@ } # define GET_MAIN_STACKBASE_SPECIAL #elif defined(EMSCRIPTEN) -# include <emscripten.h> - static void* emscripten_stack_base; +# if defined(USE_EMSCRIPTEN_SCAN_STACK) && defined(EMSCRIPTEN_ASYNCIFY) + /* According to the documentation, emscripten_scan_stack() is only */ + /* guaranteed to be available when building with ASYNCIFY. */ +# include <emscripten.h> - static void scan_stack_cb(void *begin, void *end) - { - (void)begin; - emscripten_stack_base = end; - } + static void *emscripten_stack_base; + + static void scan_stack_cb(void *begin, void *end) + { + (void)begin; + emscripten_stack_base = end; + } +# else +# include <emscripten/stack.h> +# endif ptr_t GC_get_main_stack_base(void) { - emscripten_scan_stack(scan_stack_cb); - return (ptr_t)emscripten_stack_base; +# if defined(USE_EMSCRIPTEN_SCAN_STACK) && defined(EMSCRIPTEN_ASYNCIFY) + emscripten_scan_stack(scan_stack_cb); + return (ptr_t)emscripten_stack_base; +# else + return (ptr_t)emscripten_stack_get_base(); +# endif } # define GET_MAIN_STACKBASE_SPECIAL #elif !defined(AMIGA) && !defined(HAIKU) && !defined(OS2) \ @@ -2024,8 +2041,8 @@ # endif #ifdef DATASTART_USES_BSDGETDATASTART -/* Its unclear whether this should be identical to the above, or */ -/* whether it should apply to non-X86 architectures. */ +/* It's unclear whether this should be identical to the above, or */ +/* whether it should apply to non-x86 architectures. */ /* For now we don't assume that there is always an empty page after */ /* etext. But in some cases there actually seems to be slightly more. */ /* This also deals with holes between read-only data and writable data. */ @@ -2097,7 +2114,11 @@ void GC_register_data_segments(void) { -# if !defined(PCR) && !defined(MACOS) +# if !defined(DYNAMIC_LOADING) && defined(GC_DONT_REGISTER_MAIN_STATIC_DATA) + /* Avoid even referencing DATASTART and DATAEND as they are */ + /* unnecessary and cause linker errors when bitcode is enabled. */ + /* GC_register_data_segments() is not called anyway. */ +# elif !defined(PCR) && !defined(MACOS) # if defined(REDIRECT_MALLOC) && defined(GC_SOLARIS_THREADS) /* As of Solaris 2.3, the Solaris threads implementation */ /* allocates the data structure for the initial thread with */ @@ -2146,7 +2167,7 @@ (ptr_t)LMGetCurrentA5(), FALSE); /* MATTHEW: Handle Far Globals */ # if __option(far_data) - /* Far globals follow he QD globals: */ + /* Far globals follow the QD globals: */ GC_add_roots_inner((ptr_t)LMGetCurrentA5(), (ptr_t)GC_MacGetDataEnd(), FALSE); # endif @@ -2244,7 +2265,8 @@ # undef IGNORE_PAGES_EXECUTABLE if (EXPECT(MAP_FAILED == result, FALSE)) { - if (HEAP_START == last_addr && GC_pages_executable && EACCES == errno) + if (HEAP_START == last_addr && GC_pages_executable + && (EACCES == errno || EPERM == errno)) ABORT("Cannot allocate executable pages"); return NULL; } @@ -2795,7 +2817,9 @@ /* thread stacks. */ #ifndef THREADS -# ifdef EMSCRIPTEN +# if defined(EMSCRIPTEN) && defined(EMSCRIPTEN_ASYNCIFY) +# include <emscripten.h> + static void scan_regs_cb(void *begin, void *end) { GC_push_all_stack((ptr_t)begin, (ptr_t)end); @@ -2803,8 +2827,7 @@ STATIC void GC_CALLBACK GC_default_push_other_roots(void) { - /* This needs "-s ASYNCIFY -s ASYNCIFY_STACK_SIZE=128000" */ - /* but hopefully the latter is only required for gctest. */ + /* Note: this needs -sASYNCIFY linker flag. */ emscripten_scan_registers(scan_regs_cb); } @@ -2887,7 +2910,7 @@ } #if defined(SOFT_VDB) && !defined(NO_SOFT_VDB_LINUX_VER_RUNTIME_CHECK) \ - || (defined(GLIBC_2_19_TSX_BUG) && defined(THREADS)) + || (defined(GLIBC_2_19_TSX_BUG) && defined(PARALLEL_MARK)) GC_INNER int GC_parse_version(int *pminor, const char *pverstr) { char *endp; unsigned long value = strtoul(pverstr, &endp, 10); @@ -2973,7 +2996,7 @@ #ifdef GWW_VDB -# define GC_GWW_BUF_LEN (MAXHINCR * HBLKSIZE / 4096 /* X86 page size */) +# define GC_GWW_BUF_LEN (MAXHINCR * HBLKSIZE / 4096 /* x86 page size */) /* Still susceptible to overflow, if there are very large allocations, */ /* and everything is dirty. */ static PVOID gww_bufGC_GWW_BUF_LEN; @@ -3495,7 +3518,7 @@ GC_VERBOSE_LOG_PRINTF("Replaced other SIGBUS handler\n"); } # endif /* HPUX || LINUX || HURD || (FREEBSD && SUNOS5SIGS) */ -# endif /* ! MS windows */ +# endif /* !MSWIN32 && !MSWINCE */ # if defined(CPPCHECK) && defined(ADDRESS_SANITIZER) GC_noop1((word)&__asan_default_options); # endif @@ -3591,6 +3614,22 @@ * happens to work. */ +# ifdef THREAD_SANITIZER + /* Used by GC_remove_protection only. Potential data race between */ + /* this function and GC_write_fault_handler should not be harmful */ + /* because it would only result in a double call of UNPROTECT() for */ + /* a region. */ + GC_ATTR_NO_SANITIZE_THREAD + static GC_bool get_pht_entry_from_index_async(volatile page_hash_table db, + size_t index)
View file
_service:tar_scm:gc-8.2.2.tar.gz/pthread_start.c -> _service:tar_scm:gc-8.2.4.tar.gz/pthread_start.c
Changed
@@ -60,10 +60,12 @@ # endif me -> status = result; GC_end_stubborn_change(me); /* cannot use GC_dirty */ -# ifndef NACL + /* Cleanup acquires lock, ensuring that we can't exit while */ + /* a collection that thinks we're alive is trying to stop us. */ +# ifdef NACL + GC_thread_exit_proc((void *)me); +# else pthread_cleanup_pop(1); - /* Cleanup acquires lock, ensuring that we can't exit while */ - /* a collection that thinks we're alive is trying to stop us. */ # endif return result; }
View file
_service:tar_scm:gc-8.2.2.tar.gz/pthread_stop_world.c -> _service:tar_scm:gc-8.2.4.tar.gz/pthread_stop_world.c
Changed
@@ -81,7 +81,9 @@ #ifdef DEBUG_THREADS # ifndef NSIG -# if defined(MAXSIG) +# ifdef CPPCHECK +# define NSIG 32 +# elif defined(MAXSIG) # define NSIG (MAXSIG+1) # elif defined(_NSIG) # define NSIG _NSIG @@ -90,7 +92,7 @@ # else # error define NSIG # endif -# endif /* NSIG */ +# endif /* !NSIG */ void GC_print_sig_mask(void) { @@ -356,6 +358,11 @@ me = GC_lookup_thread_async(self); # ifdef GC_ENABLE_SUSPEND_THREAD +# if defined(__GNUC__) && !defined(__clang__) + /* Workaround "writing 8 bytes into a region of size 0" bogus */ + /* gcc warning (produced by gcc-12.2.0/aarch64, at least). */ + if (NULL == me) ABORT("Lookup self failed"); +# endif suspend_cnt = (word)ao_load_async(&(me -> stop_info.ext_suspend_cnt)); # endif if (((word)me->stop_info.last_stop_count & ~(word)THREAD_RESTARTED) @@ -513,10 +520,11 @@ { # if defined(HAVE_CLOCK_GETTIME) && !defined(DONT_TIMEDWAIT_ACK_SEM) # define TIMEOUT_BEFORE_RESEND 10000 /* us */ - int i; struct timespec ts; if (n_live_threads > 0 && clock_gettime(CLOCK_REALTIME, &ts) == 0) { + int i; + TS_NSEC_ADD(ts, TIMEOUT_BEFORE_RESEND * 1000); /* First, try to wait for the semaphore with some timeout. */ /* On failure, fallback to WAIT_UNIT pause and resend of the signal. */ @@ -772,7 +780,8 @@ size_t nthreads = 0; int i; GC_thread p; - ptr_t lo, hi; + ptr_t lo; /* stack top (sp) */ + ptr_t hi; /* bottom */ # if defined(E2K) || defined(IA64) /* We also need to scan the register backing store. */ ptr_t bs_lo, bs_hi; @@ -842,16 +851,28 @@ # endif } # ifdef DEBUG_THREADS - GC_log_printf("Stack for thread %p is %p,%p)\n", - (void *)p->id, (void *)lo, (void *)hi); +# ifdef STACK_GROWS_UP + GC_log_printf("Stack for thread %p is (%p,%p\n", + (void *)(p -> id), (void *)hi, (void *)lo); +# else + GC_log_printf("Stack for thread %p is %p,%p)\n", + (void *)(p -> id), (void *)lo, (void *)hi); +# endif # endif if (0 == lo) ABORT("GC_push_all_stacks: sp not set!"); if (p->altstack != NULL && (word)p->altstack <= (word)lo && (word)lo <= (word)p->altstack + p->altstack_size) { - hi = p->altstack + p->altstack_size; +# ifdef STACK_GROWS_UP + hi = p->altstack; +# else + hi = p->altstack + p->altstack_size; +# endif /* FIXME: Need to scan the normal stack too, but how ? */ - /* FIXME: Assume stack grows down */ } +# ifdef STACKPTR_CORRECTOR_AVAILABLE + if (GC_sp_corrector != 0) + GC_sp_corrector((void **)&lo, (void *)(p -> id)); +# endif GC_push_all_stack_sections(lo, hi, traced_stack_sect); # ifdef STACK_GROWS_UP total_size += lo - hi; @@ -875,7 +896,7 @@ # if defined(E2K) || defined(IA64) # ifdef DEBUG_THREADS GC_log_printf("Reg stack for thread %p is %p,%p)\n", - (void *)p->id, (void *)bs_lo, (void *)bs_hi); + (void *)(p -> id), (void *)bs_lo, (void *)bs_hi); # endif GC_ASSERT(bs_lo != NULL && bs_hi != NULL); /* FIXME: This (if p->id==self) may add an unbounded number of */
View file
_service:tar_scm:gc-8.2.2.tar.gz/pthread_support.c -> _service:tar_scm:gc-8.2.4.tar.gz/pthread_support.c
Changed
@@ -342,7 +342,8 @@ int err = pthread_setname_np(pthread_self(), "GC-marker-%zu", (void*)(size_t)id); if (err != 0) - WARN("pthread_setname_np failed, errno= %" WARN_PRIdPTR "\n", err); + WARN("pthread_setname_np failed, errno= %" WARN_PRIdPTR "\n", + (signed_word)err); } #elif defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID) \ || defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID) @@ -505,8 +506,7 @@ # endif if (REAL_FUNC(pthread_sigmask)(SIG_BLOCK, &set, &oldset) < 0) { - WARN("pthread_sigmask set failed, no markers started," - " errno= %" WARN_PRIdPTR "\n", errno); + WARN("pthread_sigmask set failed, no markers started\n", 0); GC_markers_m1 = 0; (void)pthread_attr_destroy(&attr); return; @@ -519,8 +519,7 @@ for (i = 0; i < available_markers_m1; ++i) { if (0 != REAL_FUNC(pthread_create)(GC_mark_threads + i, &attr, GC_mark_thread, (void *)(word)i)) { - WARN("Marker thread creation failed, errno= %" WARN_PRIdPTR "\n", - errno); + WARN("Marker thread creation failed\n", 0); /* Don't try to create other marker threads. */ GC_markers_m1 = i; break; @@ -530,8 +529,7 @@ # ifndef NO_MARKER_SPECIAL_SIGMASK /* Restore previous signal mask. */ if (REAL_FUNC(pthread_sigmask)(SIG_SETMASK, &oldset, NULL) < 0) { - WARN("pthread_sigmask restore failed, errno= %" WARN_PRIdPTR "\n", - errno); + WARN("pthread_sigmask restore failed\n", 0); } # endif @@ -603,7 +601,7 @@ first_thread_used = TRUE; GC_ASSERT(NULL == GC_threadshv); # if defined(THREAD_SANITIZER) && defined(CPPCHECK) - GC_noop1(result->dummy0); + GC_noop1((unsigned char)result->dummy0); # endif } else { result = (struct GC_Thread_Rep *) @@ -639,12 +637,6 @@ GC_log_printf("Deleting thread %p, n_threads= %d\n", (void *)id, GC_count_threads()); # endif - -# ifdef NACL - GC_nacl_shutdown_gc_thread(); - GC_nacl_gc_thread_self = NULL; -# endif - GC_ASSERT(I_HOLD_LOCK()); while (!THREAD_EQUAL(p -> id, id)) { prev = p; @@ -769,7 +761,7 @@ LOCK(); me = GC_lookup_thread(self); UNLOCK(); - return me != NULL; + return me != NULL && !(me -> flags & FINISHED); } static pthread_t main_pthread_id; @@ -836,7 +828,7 @@ p -> next = 0; # ifdef GC_DARWIN_THREADS /* Update thread Id after fork (it is OK to call */ - /* GC_destroy_thread_local and GC_free_internal */ + /* GC_destroy_thread_local and GC_free_inner */ /* before update). */ me -> stop_info.mach_thread = mach_thread_self(); # endif @@ -850,7 +842,7 @@ /* Some TLS implementations might be not fork-friendly, so */ /* we re-assign thread-local pointer to 'tlfs' for safety */ /* instead of the assertion check (again, it is OK to call */ - /* GC_destroy_thread_local and GC_free_internal before). */ + /* GC_destroy_thread_local and GC_free_inner before). */ res = GC_setspecific(GC_thread_key, &me->tlfs); if (COVERT_DATAFLOW(res) != 0) ABORT("GC_setspecific failed (in child)"); @@ -996,7 +988,8 @@ len = STAT_READ(f, stat_buf, sizeof(stat_buf)-1); /* Unlikely that we need to retry because of an incomplete read here. */ if (len < 0) { - WARN("Failed to read /proc/stat, errno= %" WARN_PRIdPTR "\n", errno); + WARN("Failed to read /proc/stat, errno= %" WARN_PRIdPTR "\n", + (signed_word)errno); close(f); return 1; } @@ -1317,6 +1310,16 @@ # endif } +#ifndef DONT_USE_ATEXIT + STATIC pthread_t GC_main_thread_id; + + GC_INNER GC_bool GC_is_main_thread(void) + { + GC_ASSERT(GC_thr_initialized); + return THREAD_EQUAL(GC_main_thread_id, pthread_self()); + } +#endif /* !DONT_USE_ATEXIT */ + GC_INNER void GC_thr_init(void) { GC_ASSERT(I_HOLD_LOCK()); @@ -1367,6 +1370,9 @@ # else t -> stop_info.stack_ptr = GC_approx_sp(); # endif +# ifndef DONT_USE_ATEXIT + GC_main_thread_id = self; +# endif t -> flags = DETACHED | MAIN_THREAD; if (THREAD_EQUAL(self, main_pthread_id)) { t -> stack = (ptr_t)main_stack; @@ -1392,7 +1398,8 @@ GC_nprocs = GC_get_nprocs(); } if (GC_nprocs <= 0) { - WARN("GC_get_nprocs() returned %" WARN_PRIdPTR "\n", GC_nprocs); + WARN("GC_get_nprocs() returned %" WARN_PRIdPTR "\n", + (signed_word)GC_nprocs); GC_nprocs = 2; /* assume dual-core */ # ifdef PARALLEL_MARK available_markers_m1 = 0; /* but use only one marker */ @@ -1825,6 +1832,10 @@ GC_ASSERT(GC_getspecific(GC_thread_key) == &me->tlfs); GC_destroy_thread_local(&(me->tlfs)); # endif +# ifdef NACL + GC_nacl_shutdown_gc_thread(); + GC_nacl_gc_thread_self = NULL; +# endif # if defined(GC_HAVE_PTHREAD_EXIT) || !defined(GC_NO_PTHREAD_CANCEL) /* Handle DISABLED_GC flag which is set by the */ /* intercepted pthread_cancel or pthread_exit. */ @@ -2088,6 +2099,10 @@ } else if ((me -> flags & FINISHED) != 0) { /* This code is executed when a thread is registered from the */ /* client thread key destructor. */ +# ifdef NACL + GC_nacl_gc_thread_self = me; + GC_nacl_initialize_gc_thread(); +# endif # ifdef GC_DARWIN_THREADS /* Reinitialize mach_thread to avoid thread_suspend fail */ /* with MACH_SEND_INVALID_DEST error. */ @@ -2128,7 +2143,7 @@ /* Called from GC_inner_start_routine(). Defined in this file to */ /* minimize the number of include files in pthread_start.c (because */ -/* sem_t and sem_post() are not used that file directly). */ +/* sem_t and sem_post() are not used in that file directly). */ GC_INNER_PTHRSTART GC_thread GC_start_rtn_prepare_thread( void *(**pstart)(void *), void **pstart_arg, @@ -2244,7 +2259,8 @@ if (NULL == attr) { detachstate = PTHREAD_CREATE_JOINABLE; } else { - pthread_attr_getdetachstate(attr, &detachstate); + if (pthread_attr_getdetachstate(attr, &detachstate) != 0) + ABORT("pthread_attr_getdetachstate failed"); } if (PTHREAD_CREATE_DETACHED == detachstate) my_flags |= DETACHED; si.flags = my_flags;
View file
_service:tar_scm:gc-8.2.2.tar.gz/ptr_chck.c -> _service:tar_scm:gc-8.2.4.tar.gz/ptr_chck.c
Changed
@@ -208,9 +208,10 @@ /* Else do it again correctly: */ # if defined(DYNAMIC_LOADING) || defined(MSWIN32) \ || defined(MSWINCE) || defined(CYGWIN32) || defined(PCR) - GC_register_dynamic_libraries(); - if (GC_is_static_root(p)) - return(p); + if (!GC_no_dls) { + GC_register_dynamic_libraries(); + if (GC_is_static_root(p)) return p; + } # endif goto fail; } else {
View file
_service:tar_scm:gc-8.2.2.tar.gz/reclaim.c -> _service:tar_scm:gc-8.2.4.tar.gz/reclaim.c
Changed
@@ -249,6 +249,7 @@ struct obj_kind *ok = &GC_obj_kindshhdr->hb_obj_kind; int (GC_CALLBACK *disclaim)(void *) = ok->ok_disclaim_proc; + GC_ASSERT(disclaim != 0); # ifndef THREADS GC_ASSERT(sz == hhdr -> hb_sz); # endif @@ -664,7 +665,7 @@ } } } /* otherwise free list objects are marked, */ - /* and its safe to leave them */ + /* and it's safe to leave them. */ BZERO(rlist, (MAXOBJGRANULES + 1) * sizeof(void *)); }
View file
_service:tar_scm:gc-8.2.2.tar.gz/tests/disclaim_bench.c -> _service:tar_scm:gc-8.2.4.tar.gz/tests/disclaim_bench.c
Changed
@@ -63,9 +63,9 @@ switch (model) { # ifndef GC_NO_FINALIZATION case 0: - obj = GC_NEW(struct testobj_s); + obj = (struct testobj_s *)GC_malloc(sizeof(struct testobj_s)); if (obj != NULL) - GC_REGISTER_FINALIZER_NO_ORDER(obj, testobj_finalize, + GC_register_finalizer_no_order(obj, testobj_finalize, &free_count, NULL, NULL); break; # endif @@ -74,7 +74,7 @@ &fclos); break; case 2: - obj = GC_NEW(struct testobj_s); + obj = (struct testobj_s *)GC_malloc(sizeof(struct testobj_s)); break; default: exit(-1); @@ -128,7 +128,7 @@ if (GC_get_find_leak()) printf("This test program is not designed for leak detection mode\n"); - keep_arr = (testobj_t *)GC_MALLOC(sizeof(void *) * KEEP_CNT); + keep_arr = (testobj_t *)GC_malloc(sizeof(void *) * KEEP_CNT); if (NULL == keep_arr) { fprintf(stderr, "Out of memory!\n"); exit(3);
View file
_service:tar_scm:gc-8.2.2.tar.gz/tests/disclaim_weakmap_test.c -> _service:tar_scm:gc-8.2.4.tar.gz/tests/disclaim_weakmap_test.c
Changed
@@ -216,13 +216,13 @@ GC_end_stubborn_change(new_base); /* Add the object to the map. */ - new_link = GC_NEW(struct weakmap_link); + new_link = (struct weakmap_link *)GC_malloc(sizeof(struct weakmap_link)); CHECK_OOM(new_link); new_link->obj = GC_get_find_leak() ? (GC_word)new_obj : GC_HIDE_POINTER(new_obj); new_link->next = *first; GC_END_STUBBORN_CHANGE(new_link); - GC_PTR_STORE_AND_DIRTY(first, new_link); + GC_ptr_store_and_dirty(first, new_link); weakmap_unlock(wm, h); AO_fetch_and_add1(&stat_added); # ifdef DEBUG_DISCLAIM_WEAKMAP @@ -287,7 +287,7 @@ break; my_assert(memcmp(old_obj, obj, wm->key_size) != 0); } - GC_PTR_STORE_AND_DIRTY(link, (*link)->next); + GC_ptr_store_and_dirty(link, (*link)->next); weakmap_unlock(wm, h); return 0; } @@ -295,7 +295,7 @@ struct weakmap *weakmap_new(size_t capacity, size_t key_size, size_t obj_size, unsigned weakobj_kind) { - struct weakmap *wm = GC_NEW(struct weakmap); + struct weakmap *wm = (struct weakmap *)GC_malloc(sizeof(struct weakmap)); CHECK_OOM(wm); # ifdef GC_PTHREADS @@ -311,8 +311,8 @@ wm->obj_size = obj_size; wm->capacity = capacity; wm->weakobj_kind = weakobj_kind; - GC_PTR_STORE_AND_DIRTY(&wm->links, - GC_MALLOC(sizeof(struct weakmap_link *) * capacity)); + GC_ptr_store_and_dirty(&wm->links, + GC_malloc(sizeof(struct weakmap_link *) * capacity)); CHECK_OOM(wm->links); return wm; }
View file
_service:tar_scm:gc-8.2.2.tar.gz/tests/test.c -> _service:tar_scm:gc-8.2.4.tar.gz/tests/test.c
Changed
@@ -436,6 +436,7 @@ : &gcj_class_struct2); CHECK_OUT_OF_MEMORY(r); + AO_fetch_and_add1(&collectable_count); result = (sexpr)(r + 1); result -> sexpr_car = x; GC_PTR_STORE_AND_DIRTY(&result->sexpr_cdr, y); @@ -684,9 +685,11 @@ void test_generic_malloc_or_special(void *p) { size_t size; - int kind = GC_get_kind_and_size(p, &size); + int kind; void *p2; + CHECK_OUT_OF_MEMORY(p); + kind = GC_get_kind_and_size(p, &size); if (size != GC_size(p)) { GC_printf("GC_get_kind_and_size returned size not matching GC_size\n"); FAIL; @@ -1061,13 +1064,16 @@ chktree(t -> rchild, n-1); } - #if defined(GC_PTHREADS) -pthread_key_t fl_key; + pthread_key_t fl_key; +#endif void * alloc8bytes(void) { -# if defined(SMALL_CONFIG) || defined(GC_DEBUG) +# ifndef GC_PTHREADS + AO_fetch_and_add1(&atomic_count); + return GC_MALLOC_ATOMIC(8); +# elif defined(SMALL_CONFIG) || defined(GC_DEBUG) AO_fetch_and_add1(&collectable_count); return(GC_MALLOC(8)); # else @@ -1078,7 +1084,7 @@ my_free_list_ptr = (void **)pthread_getspecific(fl_key); if (my_free_list_ptr == 0) { my_free_list_ptr = GC_NEW_UNCOLLECTABLE(void *); - CHECK_OUT_OF_MEMORY(my_free_list_ptr); + if (NULL == my_free_list_ptr) return NULL; AO_fetch_and_add1(&uncollectable_count); if (pthread_setspecific(fl_key, my_free_list_ptr) != 0) { GC_printf("pthread_setspecific failed\n"); @@ -1088,7 +1094,7 @@ my_free_list = *my_free_list_ptr; if (my_free_list == 0) { my_free_list = GC_malloc_many(8); - CHECK_OUT_OF_MEMORY(my_free_list); + if (NULL == my_free_list) return NULL; } next = GC_NEXT(my_free_list); GC_PTR_STORE_AND_DIRTY(my_free_list_ptr, next); @@ -1098,10 +1104,6 @@ # endif } -#else -# define alloc8bytes() GC_MALLOC_ATOMIC(8) -#endif - #include "gc_inline.h" void test_tinyfl(void) @@ -1124,11 +1126,9 @@ int i; for (i = 0; i < n; i += 8) { - if (alloc8bytes() == 0) { - GC_printf("Out of memory\n"); - FAIL; - } - AO_fetch_and_add1(&atomic_count); + void *p = alloc8bytes(); + + CHECK_OUT_OF_MEMORY(p); } } @@ -1359,9 +1359,8 @@ void run_one_test(void) { # ifndef DBG_HDRS_ALL - char *x; + char *x, *y; char **z; - char *y = (char *)(GC_word)fail_proc1; # endif # ifndef NO_CLOCK CLOCK_TYPE start_time; @@ -1383,28 +1382,41 @@ # endif test_tinyfl(); # ifndef DBG_HDRS_ALL - AO_fetch_and_add1(&collectable_count); /* 1 */ - AO_fetch_and_add1(&collectable_count); /* 2 */ - AO_fetch_and_add1(&collectable_count); /* 3 */ - if ((GC_size(GC_malloc(7)) != 8 && - GC_size(GC_malloc(7)) != MIN_WORDS * sizeof(GC_word)) - || GC_size(GC_malloc(15)) != 16) { + AO_fetch_and_add1(&collectable_count); + x = (char*)GC_malloc(7); + CHECK_OUT_OF_MEMORY(x); + AO_fetch_and_add1(&collectable_count); + y = (char*)GC_malloc(7); + CHECK_OUT_OF_MEMORY(y); + if (GC_size(x) != 8 && GC_size(y) != MIN_WORDS * sizeof(GC_word)) { GC_printf("GC_size produced unexpected results\n"); FAIL; } AO_fetch_and_add1(&collectable_count); - if (GC_size(GC_malloc(0)) != MIN_WORDS * sizeof(GC_word)) { + x = (char*)GC_malloc(15); + CHECK_OUT_OF_MEMORY(x); + if (GC_size(x) != 16) { + GC_printf("GC_size produced unexpected results 2\n"); + FAIL; + } + AO_fetch_and_add1(&collectable_count); + x = (char*)GC_malloc(0); + CHECK_OUT_OF_MEMORY(x); + if (GC_size(x) != MIN_WORDS * sizeof(GC_word)) { GC_printf("GC_malloc(0) failed: GC_size returns %lu\n", - (unsigned long)GC_size(GC_malloc(0))); + (unsigned long)GC_size(x)); FAIL; } AO_fetch_and_add1(&uncollectable_count); - if (GC_size(GC_malloc_uncollectable(0)) != MIN_WORDS * sizeof(GC_word)) { + x = (char*)GC_malloc_uncollectable(0); + CHECK_OUT_OF_MEMORY(x); + if (GC_size(x) != MIN_WORDS * sizeof(GC_word)) { GC_printf("GC_malloc_uncollectable(0) failed\n"); FAIL; } AO_fetch_and_add1(&collectable_count); x = (char*)GC_malloc(16); + CHECK_OUT_OF_MEMORY(x); if (GC_base(GC_PTR_ADD(x, 13)) != x) { GC_printf("GC_base(heap ptr) produced incorrect result\n"); FAIL; @@ -1428,6 +1440,7 @@ GC_printf("Bad INCR/DECR result\n"); FAIL; } + y = (char *)(GC_word)fail_proc1; # ifndef PCR if (GC_base(y) != 0) { GC_printf("GC_base(fn_ptr) produced incorrect result\n"); @@ -1740,7 +1753,8 @@ # endif /* Garbage collect repeatedly so that all inaccessible objects */ /* can be finalized. */ - while (GC_collect_a_little()) { } + if (!GC_is_disabled()) + while (GC_collect_a_little()) { } for (i = 0; i < 16; i++) { GC_gcollect(); # ifndef GC_NO_FINALIZATION @@ -1874,9 +1888,6 @@ (void)GC_get_size_map_at(1); # endif -# ifdef THREADS - GC_unregister_my_thread(); /* just to check it works (for main) */ -# endif # ifdef NO_CLOCK GC_printf("Completed %u collections\n", (unsigned)GC_get_gc_no()); # elif !defined(PARALLEL_MARK) @@ -2297,6 +2308,7 @@ UNTESTED(GC_endthreadex); # endif # endif + (void)GC_unregister_my_thread(); /* just to check it works (for main) */ return(0); } @@ -2459,6 +2471,7 @@ GC_set_on_thread_event(GC_get_on_thread_event()); GC_set_oom_fn(GC_get_oom_fn()); GC_set_push_other_roots(GC_get_push_other_roots()); + GC_set_sp_corrector(GC_get_sp_corrector()); GC_set_start_callback(GC_get_start_callback()); GC_set_stop_func(GC_get_stop_func()); GC_set_suspend_signal(GC_get_suspend_signal()); @@ -2504,6 +2517,8 @@ # ifdef PTW32_STATIC_LIB pthread_win32_thread_detach_np (); pthread_win32_process_detach_np (); +# else + (void)GC_unregister_my_thread(); # endif return(0); }
View file
_service:tar_scm:gc-8.2.2.tar.gz/tests/test_cpp.cc -> _service:tar_scm:gc-8.2.4.tar.gz/tests/test_cpp.cc
Changed
@@ -331,11 +331,14 @@ GC_PTR_STORE_AND_DIRTY(xptr, x); x = 0; if (argc != 2 - || (n = (int)COVERT_DATAFLOW(atoi(argv1))) <= 0) { + || (n = atoi(argv1)) <= 0) { GC_printf("usage: test_cpp number-of-iterations\n" "Assuming 10 iters\n"); n = 10; } +# ifdef LINT2 + if (n > 100 * 1000) n = 100 * 1000; +# endif for (iters = 1; iters <= n; iters++) { GC_printf( "Starting iteration %d\n", iters );
View file
_service:tar_scm:gc-8.2.2.tar.gz/tests/tests.am -> _service:tar_scm:gc-8.2.4.tar.gz/tests/tests.am
Changed
@@ -27,8 +27,8 @@ check_PROGRAMS += gctest.html gctest_html_SOURCES = $(gctest_SOURCES) gctest_html_LDADD = $(gctest_LDADD) -# Bug in the linker not being able to determine that _memalign and -# _memalign is needed? it's part of mmap. +# Bug in the linker not being able to determine that _memalign and _memset +# are needed? it's part of mmap. gctest_html_LDFLAGS = -s "EXPORTED_FUNCTIONS='_memalign', '_main', '_memset'" endif
View file
_service:tar_scm:gc-8.2.2.tar.gz/tools/setjmp_t.c -> _service:tar_scm:gc-8.2.4.tar.gz/tools/setjmp_t.c
Changed
@@ -87,7 +87,10 @@ volatile word sp; unsigned ps = GETPAGESIZE(); JMP_BUF b; - register int x = (int)strlen(a_str); /* 1, slightly disguised */ +# if !defined(__cplusplus) || __cplusplus < 201703L /* before c++17 */ + register +# endif + int x = (int)strlen(a_str); /* 1, slightly disguised */ static volatile int y = 0; sp = (word)(&sp); @@ -101,7 +104,7 @@ ((unsigned long)sp + ps) & ~(ps-1)); } else { printf("Stack appears to grow up.\n"); - printf("Define STACK_GROWS_UP in gc_private.h\n"); + printf("Define STACK_GROWS_UP in gc_priv.h\n"); printf("A good guess for STACKBOTTOM on this machine is 0x%lx.\n", ((unsigned long)sp + ps) & ~(ps-1)); }
View file
_service:tar_scm:gc-8.2.2.tar.gz/tools/threadlibs.c -> _service:tar_scm:gc-8.2.4.tar.gz/tools/threadlibs.c
Changed
@@ -63,12 +63,12 @@ printf("-lpthread\n"); # endif # if defined(GC_WIN32_PTHREADS) -# ifdef PTW32_STATIC_LIB - /* assume suffix s for static version of the win32 pthread library */ - printf("-lpthreadGC2s -lws2_32\n"); -# else - printf("-lpthreadGC2\n"); -# endif +# ifdef PTW32_STATIC_LIB + /* assume suffix s for static version of the pthreads-win32 library */ + printf("-lpthreadGC2s -lws2_32\n"); +# else + printf("-lpthreadGC2\n"); +# endif # endif # if defined(GC_OSF1_THREADS) printf("-pthread -lrt\n"); /* DOB: must be -pthread, not -lpthread */
View file
_service:tar_scm:gc-8.2.2.tar.gz/typd_mlc.c -> _service:tar_scm:gc-8.2.4.tar.gz/typd_mlc.c
Changed
@@ -670,7 +670,8 @@ &complex_descr, &leaf); lb *= n; switch(descr_type) { - case NO_MEM: return(0); + case NO_MEM: + return (*GC_get_oom_fn())(lb); case SIMPLE: return GC_malloc_explicitly_typed(lb, simple_descr); case LEAF:
View file
_service:tar_scm:gc-8.2.2.tar.gz/win32_threads.c -> _service:tar_scm:gc-8.2.4.tar.gz/win32_threads.c
Changed
@@ -44,7 +44,7 @@ #undef _endthreadex #ifdef GC_PTHREADS -# include <errno.h> /* for EAGAIN */ +# include <errno.h> /* for EINTR */ /* Cygwin-specific forward decls */ # undef pthread_create @@ -63,6 +63,12 @@ # include <unistd.h> # endif +# ifdef EMULATE_PTHREAD_SEMAPHORE +# include "private/darwin_semaphore.h" +# else +# include <semaphore.h> +# endif + #elif !defined(MSWINCE) # include <process.h> /* For _beginthreadex, _endthreadex */ # include <errno.h> /* for errno, EAGAIN */ @@ -142,7 +148,7 @@ #endif /* GC_NO_THREADS_DISCOVERY */ /* We have two versions of the thread table. Which one */ -/* we us depends on whether or not GC_win32_dll_threads */ +/* we use depends on whether GC_win32_dll_threads */ /* is set. Note that before initialization, we don't */ /* add any entries to either table, even if DllMain is */ /* called. The main thread will be added on */ @@ -275,6 +281,10 @@ struct thread_local_freelists tlfs; # endif +# if defined(WOW64_THREAD_CONTEXT_WORKAROUND) && defined(MSWINRT_FLAVOR) + PNT_TIB tib; +# endif + # ifdef RETRY_GET_THREAD_CONTEXT ptr_t context_sp; word context_regsPUSHED_REGS_COUNT; @@ -287,9 +297,9 @@ typedef struct GC_Thread_Rep * GC_thread; typedef volatile struct GC_Thread_Rep * GC_vthread; -#ifndef GC_NO_THREADS_DISCOVERY - STATIC DWORD GC_main_thread = 0; +STATIC DWORD GC_main_thread; +#ifndef GC_NO_THREADS_DISCOVERY /* We track thread attachments while the world is supposed to be */ /* stopped. Unfortunately, we cannot stop them from starting, since */ /* blocking in DllMain seems to cause the world to deadlock. Thus, */ @@ -416,12 +426,13 @@ /* GC_win32_dll_threads is set. Always called from the thread being */ /* added. If GC_win32_dll_threads is not set, we already hold the */ /* allocation lock except possibly during single-threaded startup code. */ +/* Does not initialize thread local free lists. */ STATIC GC_thread GC_register_my_thread_inner(const struct GC_stack_base *sb, DWORD thread_id) { GC_vthread me; - /* The following should be a no-op according to the win32 */ + /* The following should be a no-op according to the Win32 */ /* documentation. There is empirical evidence that it */ /* isn't. - HB */ # if defined(MPROTECT_VDB) && !defined(CYGWIN32) @@ -445,7 +456,7 @@ /* It has been claimed that DllMain is really only executed with */ /* a particular system lock held, and thus careful use of locking */ /* around code that doesn't call back into the system libraries */ - /* might be OK. But this hasn't been tested across all win32 */ + /* might be OK. But this has not been tested across all Win32 */ /* variants. */ for (i = 0; InterlockedExchange(&dll_thread_tablei.tm.long_in_use, 1) != 0; @@ -455,8 +466,8 @@ /* InterlockedExchange is supposed to be replaced by */ /* InterlockedExchangePointer, but that's not really what I */ /* want here. */ - /* FIXME: We should eventually declare Win95 dead and use AO_ */ - /* primitives here. */ + /* FIXME: We should eventually declare Windows 95 dead and use */ + /* AO_ primitives here. */ if (i == MAX_THREADS - 1) ABORT("Too many threads"); } @@ -499,6 +510,12 @@ ": errcode= 0x%X", (unsigned)GetLastError()); } # endif +# if defined(WOW64_THREAD_CONTEXT_WORKAROUND) && defined(MSWINRT_FLAVOR) + /* Lookup TIB value via a call to NtCurrentTeb() on thread */ + /* registration rather than calling GetThreadSelectorEntry() which */ + /* is not available on UWP. */ + me -> tib = (PNT_TIB)NtCurrentTeb(); +# endif me -> last_stack_min = ADDR_LIMIT; GC_record_stack_base(me, sb); /* Up until this point, GC_push_all_stacks considers this thread */ @@ -506,9 +523,6 @@ /* Up until this point, this entry is viewed as reserved but invalid */ /* by GC_delete_thread. */ me -> id = thread_id; -# if defined(THREAD_LOCAL_ALLOC) - GC_init_thread_local((GC_tlfs)(&(me->tlfs))); -# endif # ifndef GC_NO_THREADS_DISCOVERY if (GC_win32_dll_threads) { if (GC_please_stop) { @@ -634,7 +648,7 @@ LOCK(); me = GC_lookup_thread_inner(thread_id); UNLOCK(); - return me != NULL; + return me != NULL && !KNOWN_FINISHED(me); } GC_API void GC_CALL GC_register_altstack(void *stack GC_ATTR_UNUSED, @@ -674,7 +688,7 @@ /* If a thread has been joined, but we have not yet */ /* been notified, then there may be more than one thread */ -/* in the table with the same win32 id. */ +/* in the table with the same Win32 thread id. */ /* This is OK, but we need a way to delete a specific one. */ /* Assumes we hold the allocation lock unless */ /* GC_win32_dll_threads is set. Does not actually free */ @@ -737,7 +751,7 @@ GC_vthread t = GC_lookup_thread_inner(id); if (0 == t) { - WARN("Removing nonexistent thread, id= %" WARN_PRIdPTR "\n", id); + WARN("Removing nonexistent thread, id= %" WARN_PRIuPTR "\n", id); } else { GC_delete_gc_thread_no_free(t); } @@ -799,8 +813,8 @@ LOCK(); me = GC_lookup_thread_inner(thread_id); if (me == 0) { + me = GC_register_my_thread_inner(sb, thread_id); # ifdef GC_PTHREADS - me = GC_register_my_thread_inner(sb, thread_id); # if defined(CPPCHECK) GC_noop1(me->flags); # endif @@ -808,26 +822,25 @@ /* Treat as detached, since we do not need to worry about */ /* pointer results. */ # else - GC_register_my_thread_inner(sb, thread_id); + (void)me; # endif - UNLOCK(); - return GC_SUCCESS; } else # ifdef GC_PTHREADS /* else */ if ((me -> flags & FINISHED) != 0) { GC_record_stack_base(me, sb); me -> flags &= ~FINISHED; /* but not DETACHED */ -# ifdef THREAD_LOCAL_ALLOC - GC_init_thread_local((GC_tlfs)(&me->tlfs)); -# endif - UNLOCK(); - return GC_SUCCESS; } else # endif /* else */ { UNLOCK(); return GC_DUPLICATE; } + +# ifdef THREAD_LOCAL_ALLOC + GC_init_thread_local(&me->tlfs); +# endif + UNLOCK(); + return GC_SUCCESS; } #ifdef GC_DISABLE_INCREMENTAL @@ -1058,7 +1071,7 @@ #ifdef GC_PTHREADS /* A quick-and-dirty cache of the mapping between pthread_t */ - /* and win32 thread id. */ + /* and Win32 thread id. */ # define PTHREAD_MAP_SIZE 512 DWORD GC_pthread_map_cachePTHREAD_MAP_SIZE = {0}; # define PTHREAD_MAP_INDEX(pthread_id) \ @@ -1084,7 +1097,7 @@ for (i = 0; i <= my_max && (!AO_load_acquire(&dll_thread_tablei.tm.in_use) - || THREAD_EQUAL(dll_thread_tablei.pthread_id, id)); + || !THREAD_EQUAL(dll_thread_tablei.pthread_id, id)); /* Must still be in_use, since nobody else can */ /* store our thread_id. */
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2