Ivan Maidanski [Fri, 2 Feb 2018 08:32:10 +0000 (11:32 +0300)]
Always fail if FindTopOfStack(0) is not implemented but called (Darwin)
* darwin_stop_world.c [!DARWIN_DONT_PARSE_STACK] (GC_FindTopOfStack):
Initialize frame local variable first (to stack_start).
* darwin_stop_world.c [!DARWIN_DONT_PARSE_STACK && !POWERPC]
(GC_FindTopOfStack): Call ABORT with the appropriate message (instead
of GC_ASSERT) if stack_start iz zero.
Ivan Maidanski [Fri, 2 Feb 2018 08:07:52 +0000 (11:07 +0300)]
Define macro to specify the environment file name extension (Win32/WinCE)
(code refactoring)
* misc.c [GC_READ_ENV_FILE] (GC_ENV_FILE_EXT): New macro.
* misc.c [GC_READ_ENV_FILE && (MSWIN32 || MSWINCE || CYGWIN32)]
(GC_envfile_init): Use GC_ENV_FILE_EXT instead of ".gc.env".
Ivan Maidanski [Thu, 1 Feb 2018 22:21:57 +0000 (01:21 +0300)]
Define ABORT() using _CrtDbgBreak (if available) on Windows host
Issue #173 (bdwgc).
* include/private/gc_priv.h [!CPPCHECK && !PCR && !NO_DEBUGGING
&& (MSWIN32 || MSWINCE)] (ABORT): Use _CrtDbgBreak() instead of
DebugBreak() if _CrtDbgBreak, _DEBUG and _MSC_VER macros are defined.
Jonathan Chambers [Thu, 1 Feb 2018 21:35:49 +0000 (00:35 +0300)]
Fix 'undefined reference to __builtin_unwind_init' linker error (ArmCC)
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* include/private/gcconfig.h (HAVE_BUILTIN_UNWIND_INIT): Do not define
if __ARMCC_VERSION.
Jonathan Chambers [Thu, 1 Feb 2018 08:53:34 +0000 (11:53 +0300)]
Avoid SIGSEGV during GC_INIT on some Android devices
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* include/gc.h [(HOST_ANDROID || __ANDROID__) && !GC_NOT_DLL]
(GC_INIT_CONF_ROOTS): Define to empty unless IGNORE_DYNAMIC_LOADING;
add comment.
Jonathan Chambers [Thu, 1 Feb 2018 08:17:24 +0000 (11:17 +0300)]
Initial support of Sony PlayStation Portable 2
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* alloc.c [!MACOS && !MSWINCE && !SN_TARGET_ORBIS && !__CC_ARM]:
Do not include sys/types.h if SN_TARGET_PSP2.
* dyn_load.c [!MACOS && !_WIN32_WCE && !SN_TARGET_ORBIS && !__CC_ARM]:
Likewise.
* os_dep.c [!OS2 && !PCR && !AMIGA && !MACOS && !MSWINCE
&& !SN_TARGET_ORBIS && !__CC_ARM]: Likewise.
* include/gc_config_macros.h [SN_TARGET_PSP2] (GC_THREADS): Define
macro.
* include/private/gcconfig.h [SN_TARGET_PSP2] (mach_type_known):
Likewise.
* include/private/gcconfig.h [ARM32 && SN_TARGET_PSP2] (NO_HANDLE_FORK,
DATASTART, DATAEND, STACKBOTTOM): Likewise.
* include/private/gcconfig.h [SN_TARGET_PSP2] (THREADS, GET_MEM):
Likewise.
* include/private/gc_locks.h [GC_PTHREADS && !GC_WIN32_THREADS
&& !SN_TARGET_ORBIS]: Do not include gc_atomic_ops.h if SN_TARGET_PSP2.
* include/private/gc_locks.h [SN_TARGET_PSP2]: Include psp2-support.h.
* include/private/gc_locks.h [SN_TARGET_PSP2] (GC_allocate_ml_PSP2):
Declare GC_EXTERN variable.
* include/private/gc_locks.h [SN_TARGET_PSP2] (UNCOND_LOCK,
UNCOND_UNLOCK): Define (using GC_allocate_ml_PSP2 instead of
GC_allocate_ml).
* include/private/gc_priv.h [!HBLKSIZE && (LARGE_CONFIG
|| !SMALL_CONFIG) && SN_TARGET_PSP2] (CPP_LOG_HBLKSIZE): Define to 16
(instead of 12).
* include/private/gcconfig.h [ARM32] (NOSYS): Do not define if
SN_TARGET_PSP2.
* os_dep.c (SBRK_ARG_T, OPT_MAP_ANON, GC_unix_mmap_get_mem,
GC_unix_sbrk_get_mem, GC_unix_get_mem): Likewise.
* pthread_support.c (GC_pthread_join, GC_pthread_detach,
GC_pthread_create): Likewise.
* include/private/gcconfig.h [ARM32 && SN_TARGET_PSP2]
(psp2_get_stack_bottom): Declare external function.
* include/private/gcconfig.h [SN_TARGET_PSP2] (psp2_get_mem): Likewise.
* include/private/gcconfig.h [USE_MUNMAP && !MUNMAP_THRESHOLD
&& SN_TARGET_PSP2] (MUNMAP_THRESHOLD): Define to 2.
* mach_dep.c: Skip everything in this file if SN_TARGET_PSP2.
* pthread_stop_world.c: Likewise.
* misc.c [SN_TARGET_PSP2] (GC_allocate_ml_PSP2): Define global varible
(instead of GC_allocate_ml).
* misc.c [!MSWIN32 && !MSWINCE && !OS2 && !MACOS && !GC_ANDROID_LOG
&& !NN_PLATFORM_CTR && !NINTENDO_SWITCH && !AMIGA && !SN_TARGET_ORBIS
&& !__CC_ARM]: Do not include unistd.h if SN_TARGET_PSP2.
* misc.c [SN_TARGET_PSP2] (GC_write): Define to no-op.
* pthread_support.c: Do not include sys/mman.h if SN_TARGET_PSP2.
Ivan Maidanski [Wed, 31 Jan 2018 21:39:25 +0000 (00:39 +0300)]
Remove ARM32 macro duplicate definition for Nintendo in gcconfig.h
(fix of commit 9718229)
Issue #173 (bdwgc).
* include/private/gcconfig.h [NN_PLATFORM_CTR] (ARM32): Remove macro
duplicate definition.
Jonathan Chambers [Wed, 31 Jan 2018 08:45:26 +0000 (11:45 +0300)]
New macro ALWAYS_SMALL_CLEAR_STACK to avoid clearing large stack sections
(a cherry-pick of commit 95f5767 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
Avoid clearing large sections of the stack. It was clearing
up to 16k which may not be available in cases of small stacks or stack
overflow situations (for some targets).
* misc.c [ALWAYS_SMALL_CLEAR_STACK] (GC_clear_stack): Do only BZERO for
dummy where dummy is a local array of length SMALL_CLEAR_SIZE.
Ivan Maidanski [Wed, 31 Jan 2018 08:11:31 +0000 (11:11 +0300)]
Do not define clear_stack_inner and next_random_no if not used
(code refactoring of commits
4eaea0afa,
b850e1c9b)
* misc.c (SMALL_CLEAR_SIZE): Do not define if already defined; define
even if THREADS is not defined.
* misc.c [STACK_NOT_SCANNED] (GC_clear_stack): Standalone definition
(just return arg).
* misc.c (BIG_CLEAR_SIZE, GC_stack_last_cleared, GC_min_sp,
GC_high_water, GC_bytes_allocd_at_reset, DEGRADE_RATE,
GC_clear_stack_inner, next_random_no): Do not define if
STACK_NOT_SCANNED.
* misc.c [!STACK_NOT_SCANNED] (CLEAR_SIZE): Do not define if
ASM_CLEAR_CODE.
* misc.c (GC_stack_last_cleared, GC_min_sp, GC_high_water,
GC_bytes_allocd_at_reset, GC_clear_stack_inner, next_random_no,
GC_clear_stack): Adjust indentation.
Ivan Maidanski [Tue, 30 Jan 2018 08:11:45 +0000 (11:11 +0300)]
Workaround 'address of auto-variable returned' cppcheck error
* mark_rts.c [CPPCHECK] (GC_approx_sp): Use __builtin_frame_address.
* mark_rts.c (GC_approx_sp): Replace GC_GNUC_PREREQ(4,0) with
__GNUC__>=4; add TODO item.
Jonathan Chambers [Tue, 30 Jan 2018 07:32:38 +0000 (10:32 +0300)]
Initial support of Xbox One (DURANGO) target
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* include/private/gc_priv.h [THREADS && MSWIN_XBOX1] (GC_write_cs):
Declare.
* include/private/gcconfig.h [(_MSC_VER && _M_IX86 >= 300 || _WIN32)
&& _XBOX_ONE] (MSWIN_XBOX1): Define (instead of MSWIN32).
* include/private/gcconfig.h [X86_64 && MSWIN_XBOX1] (NO_GETENV,
DATASTART, DATAEND, STACKBOTTOM, GETPAGESIZE, USE_MMAP, PROT_NONE,
PROT_READ, PROT_WRITE, PROT_EXEC, MAP_PRIVATE, MAP_FIXED, MAP_FAILED):
Define.
* include/private/gcconfig.h [X86_64 && MSWIN_XBOX1]
(durango_get_stack_bottom): Declare external function.
* include/private/gcconfig.h [USE_MUNMAP && !MUNMAP_THRESHOLD
&& MSWIN_XBOX1] (MUNMAP_THRESHOLD): Define to 2; update comment.
* include/private/gcconfig.h [GC_WIN32_THREADS && !CYGWIN32
&& !MSWIN32 && !MSWINCE]: Do not issue #error if MSWIN_XBOX1.
* include/private/gcconfig.h [MSWIN_XBOX1] (durango_get_mem): Declare
function.
* include/private/gcconfig.h [MSWIN_XBOX1] (GET_MEM): Define.
* mark_rts.c [DYNAMIC_LOADING] (GC_cond_register_dynamic_libraries):
Do not call GC_remove_tmp_roots and GC_register_dynamic_libraries
if MSWIN_XBOX1 (set GC_no_dls to true instead).
* misc.c [MSWIN_XBOX1 && THREADS] (GC_write_cs): Define variable.
* misc.c [!MSWIN32 && !MSWINCE && !OS2 && !MACOS && !GC_ANDROID_LOG
&& !NN_PLATFORM_CTR && !NINTENDO_SWITCH && !AMIGA && !SN_TARGET_ORBIS
&& !__CC_ARM]: Do not include unistd.h if MSWIN_XBOX1.
* os_dep.c [!OS2 && !PCR && !AMIGA && !MACOS && !MSWINCE
&& !SN_TARGET_ORBIS && !__CC_ARM && !MSWIN32]: Likewise.
* os_dep.c [MMAP_SUPPORTED && MSWIN_XBOX1] (durango_get_mem): Define
new internal function.
* os_dep.c [!MSWINCE && USE_WINALLOC] (GLOBAL_ALLOC_TEST,
GC_mem_top_down, GC_win32_get_mem, GC_win32_free_heap): Do not define
if MSWIN_XBOX1.
* win32_threads.c [!CYGWIN32 && !MSWINCE] (GC_beginthreadex): Likewise.
* os_dep.c [USE_MUNMAP && !NN_PLATFORM_CTR && !MSWIN32 && !MSWINCE]:
Do not include unistd.h, sys/mman.h, sys/stat.h, sys/types.h if
MSWIN_XBOX1.
* win32_threads.c [GC_ASSERTIONS] (GC_write_disabled): Define only if
MSWIN32 or MSWINCE.
* win32_threads.c [GC_ASSERTIONS] (GC_stop_world): Do not use
GC_write_disabled if MSWIN_XBOX1.
* win32_threads.c [PARALLEL_MARK && !GC_PTHREADS_PARAMARK
&& MSWIN_XBOX1] (GC_start_mark_threads_inner): Use CreateThread()
instead of _beginthreadex().
Jonathan Chambers [Sun, 28 Jan 2018 07:13:10 +0000 (10:13 +0300)]
Initial support of Orbis target
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* alloc.c [!MACOS && !MSWINCE && !__CC_ARM]: Do not include
sys/types.h if SN_TARGET_ORBIS.
* dyn_load.c [!MACOS && !_WIN32_WCE && !__CC_ARM]: Likewise.
* include/gc_config_macros.h [SN_TARGET_ORBIS] (GC_THREADS): Define.
* include/gc_config_macros.h [__FreeBSD__] (GC_FREEBSD_THREADS): Do
not define if SN_TARGET_ORBIS.
* include/private/gcconfig.h [__FreeBSD__ || __DragonFly__
|| __FreeBSD_kernel__] (FREEBSD): Likewise.
* include/private/gcconfig.h [!LINUX && !NETBSD && !FREEBSD
&& !OPENBSD && !DARWIN && !_WIN32 && !__CEGCC__ && !NN_PLATFORM_CTR
!NN_BUILD_TARGET_PLATFORM_NX && !SYMBIAN] (NOSYS): Likewise.
* include/private/gc_locks.h [THREADS && GC_PTHREADS
&& !GC_WIN32_THREADS]: Do not include gc_atomic_ops.h if
SN_TARGET_ORBIS.
* include/private/gc_locks.h [SN_TARGET_ORBIS && GC_PTHREADS]
(USE_PTHREAD_LOCKS): Define.
* include/private/gc_priv.h [SN_TARGET_ORBIS] (CPP_LOG_HBLKSIZE):
Define to 16 (instead of 12).
* include/private/gcconfig.h [SN_TARGET_ORBIS && (__amd64__
|| __x86_64__)] (X86_64): Define.
* include/private/gcconfig.h [X86_64] (CACHE_LINE_SIZE): Do not define
if already defined.
* include/private/gcconfig.h [X86_64 && SN_TARGET_ORBIS] (DATASTART,
DATAEND, STACKBOTTOM): Define.
* include/private/gcconfig.h [X86_64 && SN_TARGET_ORBIS]: Include
pthread.h.
* include/private/gcconfig.h [X86_64 && SN_TARGET_ORBIS]
(ps4_get_stack_bottom): Declare.
* include/private/gcconfig.h [USE_MUNMAP && !MUNMAP_THRESHOLD
&& SN_TARGET_ORBIS] (MUNMAP_THRESHOLD): Define to 2.
* include/private/gcconfig.h [SN_TARGET_ORBIS] (THREADS): Define.
* pthread_support.c: Do not include sys/mman.h, sys/time.h,
sys/types.h, fcntl.h if SN_TARGET_ORBIS.
* pthread_support.c (GC_pthread_join, GC_pthread_detach,
GC_pthread_create): Do not define if SN_TARGET_ORBIS.
Ivan Maidanski [Sat, 27 Jan 2018 07:38:44 +0000 (10:38 +0300)]
Remove duplicate definition of ALIGNMENT macro for OpenBSD/arm
(code refactoring)
* include/private/gcconfig.h [ARM32 && OPENBSD] (ALIGNMENT): Remove
(as it is already defined for ARM32).
Jonathan Chambers [Sat, 27 Jan 2018 07:24:12 +0000 (10:24 +0300)]
Initial support of Nintendo platform
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* include/gc_config_macros.h [(!GC_WIN32_THREADS || GC_WIN32_PTHREADS
|| __CYGWIN32__ || __CYGWIN__) && GC_THREADS] (GC_PTHREADS): Do not
define if NN_PLATFORM_CTR or NN_BUILD_TARGET_PLATFORM_NX.
* include/private/gc_priv.h [NN_PLATFORM_CTR] (CLOCK_TYPE, GET_TIME,
MS_TIME_DIFF): Define macro.
* include/private/gc_priv.h [!PCR && (NN_PLATFORM_CTR
|| NINTENDO_SWITCH)] (STOP_WORLD, START_WORLD): Likewise.
* include/private/gcconfig.h [NN_PLATFORM_CTR] (ARM32,
mach_type_known): Likewise.
* include/private/gcconfig.h [NN_BUILD_TARGET_PLATFORM_NX]
(NINTENDO_SWITCH, mach_type_known): Likewise.
* include/private/gcconfig.h [NN_PLATFORM_CTR] (DATASTART, DATAEND,
STACKBOTTOM): Likewise.
* include/private/gcconfig.h [NINTENDO_SWITCH] (NO_HANDLE_FORK,
DATASTART, DATAEND, STACKBOTTOM): Likewise.
* include/private/gcconfig.h [NN_PLATFORM_CTR || NINTENDO_SWITCH]
(THREADS): Likewise.
* include/private/gcconfig.h [NINTENDO_SWITCH] (GET_MEM):
Likewise.
* misc.c [NN_PLATFORM_CTR || NINTENDO_SWITCH] (WRITE): Likewise.
* include/private/gc_priv.h [NN_PLATFORM_CTR] (n3ds_get_system_tick
n3ds_convert_tick_to_ms): Declare external function.
* include/private/gc_priv.h [!PCR && (NN_PLATFORM_CTR
|| NINTENDO_SWITCH)] (GC_stop_world, GC_start_world): Declare.
* include/private/gcconfig.h [NN_PLATFORM_CTR] (Image$$ZI$$ZI$$Base,
Image$$ZI$$ZI$$Limit, n3ds_get_stack_bottom): Likewise.
* include/private/gcconfig.h [NINTENDO_SWITCH] (__bss_end,
switch_get_stack_bottom): Likewise.
* include/private/gcconfig.h [NINTENDO_SWITCH] (switch_get_mem):
Likewise.
* misc.c [NN_PLATFORM_CTR] (n3ds_log_write): Likewise.
* misc.c [NINTENDO_SWITCH] (switch_log_write): Likewise.
* include/private/gcconfig.h [__aarch64__ && !LINUX && !DARWIN
&& !FREEBSD] (NOSYS): Do not define if NN_BUILD_TARGET_PLATFORM_NX.
* include/private/gcconfig.h [(__arm || __arm__ || __thumb__)
&& !NACL && !LINUX && !NETBSD && !FREEBSD && !OPENBSD && !DARWIN
&& !_WIN32 && !__CEGCC__ && !SYMBIAN] (NOSYS): Do not define
if NN_PLATFORM_CTR or NN_BUILD_TARGET_PLATFORM_NX.
* misc.c [!OS2 && !MACOS && !GC_ANDROID_LOG && !MSWIN32 && !MSWINCE]
(GC_stdout, GC_stderr, GC_log, GC_set_log_fd): Do not define if
NN_PLATFORM_CTR or NINTENDO_SWITCH.
* misc.c [NN_PLATFORM_CTR] (GC_init): Call GC_get_main_stack_base()
to set GC_stackbottom.
* os_dep.c (SBRK_ARG_T, OPT_MAP_ANON, GC_unix_mmap_get_mem,
GC_unix_sbrk_get_mem, GC_unix_get_mem): Do not define if
NINTENDO_SWITCH.
* os_dep.c [USE_MUNMAP]: Do not include unistd.h, sys/mman.h,
sys/stat.h, sys/types.h if NN_PLATFORM_CTR.
* os_dep.c [NN_PLATFORM_CTR || NINTENDO_SWITCH]
(GC_default_push_other_roots): Redirect to GC_push_all_stacks.
Ivan Maidanski [Fri, 26 Jan 2018 13:36:06 +0000 (16:36 +0300)]
Update ChangeLog file
Ivan Maidanski [Fri, 26 Jan 2018 11:30:43 +0000 (14:30 +0300)]
Update ChangeLog file (v7.6 changes only)
(a cherry-pick of commit
62d9d038 from 'release-7_6')
Peter Wang [Thu, 25 Jan 2018 22:35:20 +0000 (01:35 +0300)]
Define HEURISTIC2 when STACKBOTTOM is not defined for OpenBSD
(fix of commit ef879a9)
Issue #198 (bdwgc).
* include/private/gcconfig.h [(POWERPC || SPARC || I386 || MIPS
|| HP_PA || ALPHA || ARM32 || SH && !SH4 || X86_64) && OPENBSD
&& !GC_OPENBSD_THREADS && !USRSTACK] (HEURISTIC2): Define.
* include/private/gcconfig.h [SH && !SH4 && OPENBSD]: Reformat code.
Ivan Maidanski [Wed, 24 Jan 2018 16:19:30 +0000 (19:19 +0300)]
Run command passed to if_not_there directly from Makefile.direct
Issue #199 (bdwgc).
if_not_there tool is modified to accept a single argument (file name).
* Makefile.direct (base_lib, cords, test_cpp, c++, mach_dep.o, mark_rts.o,
cord/cordtest, cord/de, gctest): Replace "if_not_there <file> <command>"
with "if_not_there <file> || <command>".
* Makefile.direct (c++): Add dependency on $(UTILS).
* Makefile.direct (gctest): Remove double spaces.
* tools/if_not_there.c: Update header comment.
* tools/if_not_there.c (main): Allow both 2 and 3 command-line arguments;
return 2 if the file does not exist and argc is 2; update the printed
usage message.
Peter Wang [Wed, 24 Jan 2018 14:37:23 +0000 (17:37 +0300)]
Fix 'undeclared identifier USRSTACK' compiler error on OpenBSD-6.2
Issue #198 (bdwgc).
USRSTACK macro is defined in <machine/vmparam.h> but that is protected
by "ifdef _KERNEL" in <uvm/uvm_param.h>.
* include/private/gcconfig.h [POWERPC && OPENBSD && !GC_OPENBSD_THREADS]
(STACKBOTTOM): Add comment.
* include/private/gcconfig.h [(POWERPC || SPARC || I386 || MIPS
|| HP_PA || ALPHA || ARM32 || SH && !SH4 || X86_64) && OPENBSD
&& !GC_OPENBSD_THREADS] (STACKBOTTOM): Define only if USRSTACK is
defined.
* include/private/gcconfig.h [MIPS && OPENBSD]: Reformat code.
Ivan Maidanski [Wed, 24 Jan 2018 14:10:55 +0000 (17:10 +0300)]
Update ChangeLog file
Ivan Maidanski [Tue, 23 Jan 2018 15:01:37 +0000 (18:01 +0300)]
Update AUTHORS file
Calvin Buckley [Tue, 23 Jan 2018 14:54:59 +0000 (17:54 +0300)]
Initial support of Haiku/amd64
(port of commit e52f300 from 'mono_libgc')
* configure.ac [THREADS=posix && host=*-*-haiku*] (GC_THREADS,
_REENTRANT, PARALLEL_MARK, THREAD_LOCAL_ALLOC): Define macro.
* include/gc_config_macros.h [GC_THREADS && __HAIKU__]
(GC_HAIKU_THREADS): Likewise.
* include/private/gcconfig.h [__HAIKU__ && _X86_] (I386, HAIKU,
mach_type_known): Likewise.
* include/private/gcconfig.h [__HAIKU__ && __amd64__] (X86_64, HAIKU,
mach_type_known): Likewise.
* include/private/gcconfig.h [I386 && HAIKU] (DYNAMIC_LOADING,
MPROTECT_VDB): Likewise.
* include/private/gcconfig.h [X86_64 && HAIKU] (OS_TYPE, GETPAGESIZE,
DATASTART, DYNAMIC_LOADING, MPROTECT_VDB): Likewise.
* include/private/gcconfig.h [HAIKU] (UNIX_LIKE, GET_MEM): Likewise.
* os_dep.c [MPROTECT_VDB && !DARWIN && !MSWIN32 && !MSWINCE
&& HAIKU] (CODE_OK): Likewise.
* dyn_load.c [HAIKU] (GC_register_dynamic_libraries): Implement.
* os_dep.c [HAIKU] (GC_haiku_get_mem): Likewise.
* include/private/gcconfig.h (BEOS): Rename to HAIKU.
* os_dep.c (BEOS): Likewise.
* include/private/gcconfig.h [I386 && HAIKU] (OS_TYPE): Change value
to "HAIKU".
* include/private/gcconfig.h [X86_64 && HAIKU]: Include OS.h; declare
etext symbol.
* include/private/gcconfig.h [HAIKU] (GC_haiku_get_mem): Declare
prototype.
* os_dep.c [(NEED_FIND_LIMIT || UNIX_LIKE) && HAIKU] (old_segv_act):
Define static variable.
* os_dep.c [(NEED_FIND_LIMIT || UNIX_LIKE) && HAIKU]
(GC_set_and_save_fault_handler): Use old_segv_act; call
sigaction(SIGSEGV).
* os_dep.c [NEED_FIND_LIMIT || (USE_PROC_FOR_LIBRARIES && THREADS)]
(GC_reset_fault_handler): Likewise.
* os_dep.c [MPROTECT_VDB && !DARWIN && !USE_WINALLOC && HAIKU]: Do not
include sys/syscall.h.
* pthread_support.c [GC_HAIKU_THREADS] (GC_get_nprocs): Define function.
Zoltan Varga [Tue, 23 Jan 2018 02:38:02 +0000 (05:38 +0300)]
Use HOST_ANDROID define instead of PLATFORM_ANDROID
(a cherry-pick of commit 5d819c8 from 'mono_libgc')
* doc/README.macros (PLATFORM_ANDROID): Rename to HOST_ANDROID.
* dyn_load.c: Rename PLATFORM_ANDROID to HOST_ANDROID.
* include/gc.h: Likewise.
* include/gc_config_macros.h: Likewise.
* include/private/gcconfig.h: Likewise.
* include/private/thread_local_alloc.h: Likewise.
* os_dep.c: Likewise.
* pthread_support.c: Likewise.
* tests/initsecondarythread.c: Likewise.
* tests/test.c: Likewise.
* tools/threadlibs.c: Likewise.
Ivan Maidanski [Tue, 23 Jan 2018 02:22:22 +0000 (05:22 +0300)]
Rename PLATFORM_TIZEN macro to HOST_TIZEN
(code refactoring of commit a3a5949)
* include/private/gcconfig.h (PLATFORM_TIZEN): Rename to HOST_TIZEN.
Ivan Maidanski [Wed, 24 Jan 2018 13:29:26 +0000 (16:29 +0300)]
Update ChangeLog file (v7.6 changes only)
(a cherry-pick of commit
82a81eed from 'release-7_6')
Ivan Maidanski [Mon, 22 Jan 2018 06:34:28 +0000 (09:34 +0300)]
Update ChangeLog file (v7.2 - v7.4 changes only)
(a cherry-pick of commit
357a28b8 from 'release-7_4')
Ivan Maidanski [Wed, 24 Jan 2018 13:13:26 +0000 (16:13 +0300)]
.gitignore: Ignore 'cords' marker file (generated by Makefile.direct)
Ivan Maidanski [Tue, 23 Jan 2018 16:28:21 +0000 (19:28 +0300)]
Fix 'cords' parallel build in Makefile.direct
* Makefile.direct (cords): Create empty "cords" file after the last
if_not_there command is executed.
* Makefile.direct (clean): Remove "cords" file.
Ivan Maidanski [Tue, 23 Jan 2018 15:31:44 +0000 (18:31 +0300)]
Delete dont_ar_* build intermediate files on make clean (Makefile.direct)
* Makefile.direct (clean): Add "rm dont_ar_*"; reorder items.
Ivan Maidanski [Tue, 23 Jan 2018 15:18:55 +0000 (18:18 +0300)]
.gitignore: Ignore dont_ar_* files (generated by Makefile.direct)
Ivan Maidanski [Thu, 18 Jan 2018 22:18:31 +0000 (01:18 +0300)]
Fix libgc version which was changed in a linkage breaking way (master)
Issue #197 (bdwgc).
* Makefile.am (LIBGC_VER_INFO): Change from 5:0:3 to 5:0:4 (to bring
SONAME back to libgc.so.1).
Ivan Maidanski [Thu, 18 Jan 2018 21:55:08 +0000 (00:55 +0300)]
Update AUTHORS file (add Gustavo Giraldez)
Gustavo Giraldez [Thu, 18 Jan 2018 21:52:25 +0000 (00:52 +0300)]
Fix GC allocation mutex in child after a fork
Even though after a fork the child only inherits the single thread
that called the fork(), if another thread in the parent was attempting
to lock the mutex while being held in fork_child_prepare(), the mutex
will be left in an inconsistent state in the child after the UNLOCK().
This is the case, at least, in Mac OS X and leads to an unusable GC in
the child which will block when attempting to perform any GC operation
that acquires the mutex.
* pthread_support.c [CAN_HANDLE_FORK && USE_PTHREAD_LOCKS]
(fork_child_proc): Add assertion (after UNLOCK) that the lock is not
held actually, and, then, re-initialize GC_allocate_ml; add comments.
Paul Bone [Thu, 18 Jan 2018 08:42:05 +0000 (11:42 +0300)]
Pass CFLAGS_FOR_PIC value to CFLAGS in Makefile.direct
(part of commit
91bf29b1a from Mercury-Language/bdwgc)
* Makefile.direct (CFLAGS): Add comment.
* Makefile.direct (CFLAGS, SPECIALCFLAGS): Add $(CFLAGS_FOR_PIC).
Ivan Maidanski [Thu, 18 Jan 2018 08:12:23 +0000 (11:12 +0300)]
Update AUTHORS file (add Alexis Laferriere)
Alexis Laferriere [Mon, 30 Oct 2017 18:54:02 +0000 (14:54 -0400)]
Treat Android platform as Linux (CMake)
* CMakeLists.txt (HOST): Replace "android" string (if present) to
"linux".
Ivan Maidanski [Wed, 17 Jan 2018 22:14:27 +0000 (01:14 +0300)]
Support threads for DragonFly in configure
* configure.ac [THREADS=posix && host=*-*-dragonfly*] (GC_THREADS,
_REENTRANT, PARALLEL_MARK, THREAD_LOCAL_ALLOC): Define similar
to *-*-freebsd*.
Ivan Maidanski [Wed, 17 Jan 2018 21:46:38 +0000 (00:46 +0300)]
Fix missing EOLn output in threadlibs tool
* tools/threadlibs.c [GC_OSF1_THREADS] (main): Print "\n" after "-lrt".
Ivan Maidanski [Wed, 17 Jan 2018 08:45:56 +0000 (11:45 +0300)]
Do not declare dl_iterate_phdr as weak for DragonFly
* dyn_load.c [!USE_PROC_FOR_LIBRARIES && __DragonFly__]
(HAVE_DL_ITERATE_PHDR, DL_ITERATE_PHDR_STRONG): Define.
Ivan Maidanski [Wed, 17 Jan 2018 08:43:09 +0000 (11:43 +0300)]
Fix threadlibs tool to output '-lpthread' for DragonFly
* tools/threadlibs.c [GC_FREEBSD_THREADS && (__DragonFly__
|| !__FREEBSD_version)] (main): Print "-lpthread" (as well as for
__FREEBSD_version >= 500000).
Ivan Maidanski [Wed, 17 Jan 2018 07:46:56 +0000 (10:46 +0300)]
Change compiler invocation example in gc.man to use dynamic libgc
* doc/gc.man (SYNOPSIS): Replace gc.a to -lgc option in the compiler
(cc) invocation example.
Ivan Maidanski [Wed, 17 Jan 2018 07:42:04 +0000 (10:42 +0300)]
Add note of set_free_space_divisor, set_warn_proc ABI change after gc-7.1
Issue #197 (bdwgc).
GC_set_free_space_divisor() and GC_set_warn_proc() used to return
some value. But starting from version 7.1alpha2, these API functions
do not return any value.
* include/gc.h (GC_set_free_space_divisor, GC_set_warn_proc): Add
comment that the setter used to returned the old value in gc-7.1 (and
previous versions).
Ivan Maidanski [Mon, 15 Jan 2018 23:22:37 +0000 (02:22 +0300)]
Prevent DATASTART redefinition for NaCl
(fix commit 9738a14)
* include/private/gcconfig.h [NACL] (NO_PTHREAD_GETATTR_NP): Define.
* include/private/gcconfig.h [I386 && NACL] (OS_TYPE, etext, DATASTART,
_end, DATAEND, STACK_GRAN, HEURISTIC1, NO_PTHREAD_GETATTR_NP,
GETPAGESIZE, MAX_NACL_GC_THREADS): Remove.
Ivan Maidanski [Mon, 15 Jan 2018 23:05:34 +0000 (02:05 +0300)]
Remove Android-specific code in gcconfig.h for M68K
* include/private/gcconfig.h [M68K && LINUX && __ELF__]
(SEARCH_FOR_DATA_START): Do not check PLATFORM_ANDROID macro.
Ivan Maidanski [Mon, 15 Jan 2018 22:19:01 +0000 (01:19 +0300)]
Travis CI: Fix ASan build with Clang-4.0 (add sudo)
Jonathan Chambers [Mon, 15 Jan 2018 22:03:05 +0000 (01:03 +0300)]
Initial support of TIZEN platform
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* include/private/gcconfig.h [TIZEN] (PLATFORM_TIZEN): New macro.
* include/private/gcconfig.h [I386 && LINUX && __ELF__
&& PLATFORM_TIZEN] (SEARCH_FOR_DATA_START, GC_NO_SIGSETJMP): Define.
* include/private/gcconfig.h [ARM32 && LINUX && __ELF__
&& PLATFORM_TIZEN] (SEARCH_FOR_DATA_START): Likewise.
* include/private/gcconfig.h [PLATFORM_TIZEN && !GETPAGESIZE]
(GETPAGESIZE): Define to sysconf(_SC_PAGESIZE).
* include/private/gcconfig.h [CAN_HANDLE_FORK] (CAN_CALL_ATFORK): Do
not define if PLATFORM_TIZEN.
Ivan Maidanski [Mon, 15 Jan 2018 05:20:02 +0000 (08:20 +0300)]
Fix global operator delete definition for C++14 in gc_cpp
Issue #195 (bdwgc).
Sized variants of global operator delete should be defined along with
the non-sized ones. Otherwise compiler might invoke the one from the
standard library (as observed in e.g. Cygwin) leading to a crash.
* gc_cpp.cc [!_MSC_VER && __cplusplus>201103L] (operator delete):
Define sized variant (the size argument is ignored for now).
* gc_cpp.cc [!_MSC_VER && __cplusplus>201103L && GC_OPERATOR_NEW_ARRAY
&& !CPPCHECK] (operator delete[]): Likewise.
Ivan Maidanski [Sun, 14 Jan 2018 07:51:06 +0000 (10:51 +0300)]
Fix last_reclaimed..gc_no interval comparison to threshold in unmap_old
(fix commit
14c324f8b)
* allchblk.c [USE_MUNMAP] (GC_unmap_old): Replace
(unsigned short)GC_gc_no-hb_last_reclaimed to
(unsigned short)(GC_gc_no-hb_last_reclaimed) to handle
value wrapping in hb_last_reclaimed (and the truncated GC_gc_no)
correctly.
Jonathan Chambers [Sun, 14 Jan 2018 07:23:34 +0000 (10:23 +0300)]
Implement memory unmapping for Sony PS/3
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* os_dep.c [USE_MUNMAP && !MSWIN32 && !MSWINCE && SN_TARGET_PS3]:
Include sys/mman.h instead of sys/memory.h.
* os_dep.c [USE_MUNMAP && !USE_WINALLOC && SN_TARGET_PS3]
(GC_unmap): Call ps3_free_mem() instead of mmap().
Peter Wang [Fri, 12 Jan 2018 16:50:47 +0000 (19:50 +0300)]
Remove obsolete advice about linking with _DYNAMIC=0 (Linux)
Issue #196 (bdwgc).
The mentioned GCC option is not needed since gc-5.0alpha3 (when
_DYNAMIC symbol was declared as weak in dyn_load.c).
Even more, the advice is problematic for Alpine Linux (and probably
other systems using musl) as building a program with gcc -static
produces a binary containing a _DYNAMIC symbol with a non-zero address,
and forcing the address to 0 causes a crash during GC initialization.
* doc/README.linux: Remove note that static executable should be
linked with the gcc option "-Wl,-defsym,_DYNAMIC=0".
Jonathan Chambers [Fri, 12 Jan 2018 16:18:46 +0000 (19:18 +0300)]
Reduce the default MUNMAP_THRESHOLD value to 2 for Sony PS/3
(part of commit 9379c66 from Unity-Technologies/bdwgc)
Issue #173 (bdwgc).
* include/private/gcconfig.h [USE_MUNMAP && !MUNMAP_THRESHOLD
&& SN_TARGET_PS3] (MUNMAP_THRESHOLD): Define to 2; add comment.
Ivan Maidanski [Thu, 11 Jan 2018 23:57:32 +0000 (02:57 +0300)]
Add check that gc_cpp operator delete is called (test_cpp)
Issue #195 (bdwgc).
* tests/test_cpp.cc (GC_CHECKED_DELETE): New macro.
* tests/test_cpp.cc (main): Use GC_CHECKED_DELETE() instead of operator
delete (where it is expected that the operator defined in gc_cpp.c/h
is called).
Ivan Maidanski [Thu, 11 Jan 2018 22:08:37 +0000 (01:08 +0300)]
New field (expl_freed_bytes_since_gc) in public prof_stats_s
* include/gc.h (GC_prof_stats_s): Add expl_freed_bytes_since_gc field
(to the end of the structure).
* misc.c [!GC_GET_HEAP_USAGE_NOT_NEEDED] (fill_prof_stats): Store
GC_bytes_freed value to pstats->expl_freed_bytes_since_gc.
Ivan Maidanski [Thu, 11 Jan 2018 21:56:36 +0000 (00:56 +0300)]
New API function (get_expl_freed_bytes_since_gc)
Note: this function could be used in test_cpp to check that the proper
operator delete is called.
* include/gc.h (GC_get_expl_freed_bytes_since_gc): New function
prototype.
* mallocx.c (GC_get_expl_freed_bytes_since_gc): New function definition
(which returns GC_bytes_freed).
Ivan Maidanski [Thu, 28 Dec 2017 08:37:57 +0000 (11:37 +0300)]
Prevent multiple sem_post calls for a thread in suspend_handler
(fix commit
af409e4bd)
Issue #181 (bdwgc).
* pthread_stop_world.c [!GC_OPENBSD_UTHREADS && !NACL
&& THREAD_SANITIZER] (GC_suspend_handler_inner): Call pthread_sigmask()
after last_stop_count update (thus preventing duplicate sem_post() call
in case of GC_suspend_handler_inner is re-entered (if GC_retry_signals);
refine comment.
Ivan Maidanski [Thu, 28 Dec 2017 08:18:25 +0000 (11:18 +0300)]
Do not call sem_getvalue in stop_world if one thread exists
* pthread_stop_world.c [!GC_OPENBSD_UTHREADS && !NACL] (GC_stop_world):
Do not call sem_getvalue() if n_live_threads is zero (matters only if
GC_retry_signals).
Ivan Maidanski [Thu, 28 Dec 2017 08:04:40 +0000 (11:04 +0300)]
Add assertion for suspend_ack_sem in start_world
This is to check that sem_post() is not called twice for a thread
(to stop) in GC_suspend_handler.
* pthread_stop_world.c [!NACL && GC_ASSERTIONS && !GC_OPENBSD_UTHREADS]
(GC_start_world): Add assertion that GC_suspend_ack_sem has zero value.
Ivan Maidanski [Wed, 27 Dec 2017 08:13:31 +0000 (11:13 +0300)]
Travis CI: Test GC_NETBSD_THREADS_WORKAROUND
Ivan Maidanski [Thu, 28 Dec 2017 07:48:28 +0000 (10:48 +0300)]
Allow GC_NETBSD_THREADS_WORKAROUND macro manual definition
* include/private/gcconfig.h [GC_NETBSD_THREADS]
(GC_NETBSD_THREADS_WORKAROUND): Define; copy comment from
pthread_stop_world.c.
* pthread_stop_world.c [!GC_OPENBSD_UTHREADS && !NACL
&& GC_NETBSD_THREADS] (GC_NETBSD_THREADS_WORKAROUND): Remove.
* pthread_stop_world.c [!GC_OPENBSD_UTHREADS && !NACL]
(GC_restart_ack_sem): Define only if GC_NETBSD_THREADS_WORKAROUND.
Ivan Maidanski [Wed, 27 Dec 2017 08:09:48 +0000 (11:09 +0300)]
Fix error code in abort message if sem_wait failed in start_world (NetBSD)
* pthread_stop_world.c [GC_NETBSD_THREADS_WORKAROUND] (GC_start_world):
Print errno instead of the value returned by sem_wait if the latter has
failed; remove "code" local variable.
Ivan Maidanski [Mon, 25 Dec 2017 07:57:58 +0000 (10:57 +0300)]
Travis CI: Do not use 'trusty' build environment
Ivan Maidanski [Mon, 25 Dec 2017 07:30:13 +0000 (10:30 +0300)]
Update ChangeLog file
Ivan Maidanski [Fri, 22 Dec 2017 21:05:41 +0000 (00:05 +0300)]
Update ChangeLog file (add gc-7.4.8 release date)
Ivan Maidanski [Thu, 21 Dec 2017 21:40:34 +0000 (00:40 +0300)]
Update ChangeLog file (add gc-7.2i release date)
Ivan Maidanski [Tue, 19 Dec 2017 21:53:44 +0000 (00:53 +0300)]
Update ChangeLog file (v7.6 changes only)
Ivan Maidanski [Tue, 19 Dec 2017 08:10:23 +0000 (11:10 +0300)]
Update ChangeLog file (v7.2 - v7.4 changes only)
(Cherry-pick commit
b15b52be from 'release-7_4' branch.)
Ivan Maidanski [Sun, 17 Dec 2017 07:42:17 +0000 (10:42 +0300)]
Remove duplicate check whether MPROTECT_VDB is defined
(fix commit
db26b7e4b)
* tests/test.c [GC_PTHREADS && MPROTECT_VDB && !REDIRECT_MALLOC
&& !MAKE_BACK_GRAPH && !USE_PROC_FOR_LIBRARIES && !NO_INCREMENTAL]
(main): Remove duplicate defined(MPROTECT_VDB).
Ivan Maidanski [Fri, 15 Dec 2017 07:15:05 +0000 (10:15 +0300)]
Workaround TSan hang in free_inner when called from at-fork child handler
* pthread_support.c [CAN_HANDLE_FORK] (GC_remove_all_threads_but_me):
Do not call GC_INTERNAL_FREE(p) if THREAD_SANITIZER and CAN_CALL_ATFORK;
add comment.
Ivan Maidanski [Thu, 14 Dec 2017 21:54:04 +0000 (00:54 +0300)]
Eliminate UBSan warning of overflow during descr subtraction in mark_from
There is no unsigned overflow because descr has a negative value
actually when it is subtracted from type_descr.
* mark.c (GC_mark_from): Cast descr to signed_word
in (type_descr-(descr+...)).
Ivan Maidanski [Thu, 14 Dec 2017 07:24:34 +0000 (10:24 +0300)]
Workaround TSan false positive in remove_all_threads_but_me
* pthread_support.c [CAN_HANDLE_FORK] (store_to_threads_table): New
static function (defined with GC_ATTR_NO_SANITIZE_THREAD attribute
if CAN_CALL_ATFORK); add comment.
* pthread_support.c [CAN_CALL_ATFORK] (GC_remove_all_threads_but_me):
Call store_to_threads_table instead of GC_threads[hv]=me.
Ivan Maidanski [Thu, 14 Dec 2017 06:53:18 +0000 (09:53 +0300)]
Do not add no_sanitize_thread to fork at-handlers if no pthread_atfork
(fix commit 3a52469)
* pthread_support.c [THREAD_SANITIZER] (GC_wait_for_gc_completion): Do
not skip I_HOLD_LOCK() assertion unless CAN_CALL_ATFORK.
* pthread_support.c [CAN_HANDLE_FORK && GC_ASSERTIONS]
(fork_prepare_proc, fork_parent_proc, fork_child_proc): Do not add
GC_ATTR_NO_SANITIZE_THREAD attribute unless CAN_CALL_ATFORK.
Ivan Maidanski [Thu, 14 Dec 2017 06:42:32 +0000 (09:42 +0300)]
Do not call set_handle_fork(1) in gctest if pthread_atfork not supported
* tests/test.c [!NO_TEST_HANDLE_FORK && HANDLE_FORK]
(INIT_FORK_SUPPORT): Do not define to GC_set_handle_fork(1) unless
CAN_CALL_ATFORK.
Ivan Maidanski [Thu, 14 Dec 2017 06:34:00 +0000 (09:34 +0300)]
Travis CI: Test explicit at-fork handlers invocation (TSan)
Ivan Maidanski [Wed, 13 Dec 2017 14:27:36 +0000 (17:27 +0300)]
Travis CI: Test with increased number of test threads
Ivan Maidanski [Wed, 13 Dec 2017 06:27:32 +0000 (09:27 +0300)]
Revert 'Workaround TSan hang in GC_free_inner when called from at-fork'
This reverts commit
d8e271ea8ab4477fc3ac8edb884bbf858d401343.
Because there is a better solution not to skip GC_INTERNAL_FREE in
GC_remove_all_threads_but_me if called from GC_atfork_child.
Ivan Maidanski [Tue, 12 Dec 2017 16:56:28 +0000 (19:56 +0300)]
Really prevent hang in sem_wait in stop_world if compiled with TSan
(fix commit af409e4)
Issue #181 (bdwgc).
* pthread_stop_world.c [!GC_OPENBSD_UTHREADS && !NACL
&& THREAD_SANITIZER] (GC_retry_signals): Initialize to TRUE.
* pthread_stop_world.c [!GC_OPENBSD_UTHREADS && !NACL]
(GC_store_stack_ptr): Update comment.
* pthread_stop_world.c [!GC_OPENBSD_UTHREADS && !NACL
&& GC_ENABLE_SUSPEND_THREAD] (GC_suspend_thread): Likewise.
* pthread_stop_world.c [!GC_OPENBSD_UTHREADS && !NACL
&& THREAD_SANITIZER] (GC_stop_world): Do not use sem_trywait+sleep
workaround (not needed if GC_retry_signals).
Ivan Maidanski [Tue, 12 Dec 2017 16:24:02 +0000 (19:24 +0300)]
Fix gctest failure if compiled with TSan and parallel marker
As of clang-4.0, Thread Sanitizer does not support creation of threads
in the forked process (before exec). So, GC_start_mark_threads()
is a no-op now if TSan is enabled.
* misc.c [THREADS && PARALLEL_MARK && CAN_HANDLE_FORK]
(GC_start_mark_threads): Do not call GC_start_mark_threads_inner()
if THREAD_SANITIZER; add comment.
Ivan Maidanski [Tue, 12 Dec 2017 16:04:17 +0000 (19:04 +0300)]
Use same macro (NTHREADS) across all tests to specify number of threads
(code refactoring)
* tests/disclaim_test.c [GC_PTHREADS] (THREAD_CNT): Rename to NTHREADS;
do not define if already defined.
* tests/disclaim_test.c [!GC_PTHREADS] (THREAD_CNT): Rename to
NTHREADS; undefine it first.
* tests/disclaim_test.c (MUTATE_CNT, main): Rename THREAD_CNT to
NTHREADS.
* tests/subthread_create.c [!NTHREADS] (INITIAL_THREAD_COUNT): Rename
to NTHREADS; add comment.
* tests/subthread_create.c (main): Rename INITIAL_THREAD_COUNT to
NTHREADS.
* tests/threadkey_test.c (LIMIT, main): Rename LIMIT to NTHREADS.
Ivan Maidanski [Fri, 8 Dec 2017 15:03:19 +0000 (18:03 +0300)]
Travis CI: Workaround disclaim_test failure when TSan is used
(fix commit 153a2c7)
GC incremental mode is not supported if compiled with TSan for now.
Ivan Maidanski [Thu, 7 Dec 2017 21:52:50 +0000 (00:52 +0300)]
Workaround TSan data race report in check_fl_marks
* alloc.c [GC_ASSERTIONS && THREAD_LOCAL_ALLOC
&& AO_HAVE_load_acquire_read] (GC_check_fl_marks): Skip the whole check
if THREAD_SANITIZER; add comment.
Ivan Maidanski [Thu, 7 Dec 2017 08:54:15 +0000 (11:54 +0300)]
Use __builtin_expect in SIZET_SAT_ADD macro
* include/private/gc_priv.h (EXPECT): Move the definition to be before
SIZET_SAT_ADD.
* include/private/gc_priv.h (SIZET_SAT_ADD): Use EXPECT().
Ivan Maidanski [Mon, 4 Dec 2017 06:42:47 +0000 (09:42 +0300)]
Turn on incremental mode (if available) in disclaim_test
* tests/disclaim_test.c [NO_INCREMENTAL] (main): Call
GC_enable_incremental() afer GC_init_finalized_malloc() call.
Petter A. Urkedal [Sun, 3 Dec 2017 11:42:59 +0000 (12:42 +0100)]
Fix marking of disclaim-reachable objects in the incremental mode
Issue #192 (bdwgc).
Unconditional marking is done analogously to marking from uncollectible
blocks, since they are meant to secure access to data for disclaim
notifiers after the data is no longer marked.
* mark.c [ENABLE_DISCLAIM] (GC_push_next_marked_dirty): Honor
MARK_UNCONDITIONALLY when rescanning dirty blocks during incremental
marking.
Ivan Maidanski [Fri, 1 Dec 2017 16:43:02 +0000 (19:43 +0300)]
Travis CI: Add a test with TSan with parallel marker (Linux/clang)
Ivan Maidanski [Fri, 1 Dec 2017 16:38:02 +0000 (19:38 +0300)]
Fix data race in do_local_mark when comparing active_count to helper_count
* mark.c [PARALLEL_MARK] (has_inactive_helpers): New static function
(which compares GC_active_count to GC_helper_count with the mark lock
held).
* mark.c [PARALLEL_MARK && GC_ASSERTIONS] (GC_do_local_mark): Remove
GC_acquire_mark_lock() with immediate GC_acquire_mark_unlock(); add
the appropriate comment to the function description instead.
* mark.c [PARALLEL_MARK] (GC_do_local_mark): Call has_inactive_helpers()
instead of GC_active_count<GC_helper_count; do not call
has_inactive_helpers() unless local_top>local_mark_stack+1.
Ivan Maidanski [Fri, 1 Dec 2017 16:23:13 +0000 (19:23 +0300)]
Fix data race in mark_thread when updating mark_no
* mark.c [PARALLEL_MARK] (GC_mark_local, GC_help_marker): Update
description comment; remove GC_acquire_mark_lock() call at the function
beginning; remove GC_release_mark_lock() call on return.
* mark.c [PARALLEL_MARK] (GC_do_parallel_mark): Remove
GC_acquire/release_mark_lock() calls around GC_mark_local() call.
* pthread_support.c [PARALLEL_MARK] (GC_mark_thread): Remove
GC_release_mark_lock() call.
* win32_threads.c [PARALLEL_MARK] (GC_mark_thread): Likewise.
Ivan Maidanski [Fri, 1 Dec 2017 08:48:08 +0000 (11:48 +0300)]
Workaround TSan warning about data race in generic_malloc_many
It is acceptable to update GC_bytes_found counter without
synchronization (so, it is OK to have inaccurate value in
GC_bytes_found in favor of performance).
* mallocx.c [PARALLEL_MARK && THREAD_SANITIZER]
(GC_generic_malloc_many): Acquire the allocation lock to update
GC_bytes_found (after successful GC_reclaim_generic).
* mallocx.c [PARALLEL_MARK && !THREAD_SANITIZER]
(GC_generic_malloc_many): Move GC_bytes_found update into the block
executed with the mark lock held.
Ivan Maidanski [Fri, 1 Dec 2017 07:35:59 +0000 (10:35 +0300)]
Workaround TSan false positives in add_to_black_list_normal/stack
* blacklst.c (GC_add_to_black_list_normal, GC_add_to_black_list_stack):
Call set_pht_entry_from_index_concurrent() instead of
set_pht_entry_from_index().
* include/private/gc_priv.h [PARALLEL_MARK && THREAD_SANITIZER]
(set_pht_entry_from_index_concurrent): New macro (use AO_or).
* include/private/gc_priv.h [!PARALLEL_MARK || !THREAD_SANITIZER]
(set_pht_entry_from_index_concurrent): Define to
set_pht_entry_from_index.
Ivan Maidanski [Wed, 29 Nov 2017 23:19:10 +0000 (02:19 +0300)]
Document base and size of objects allocated by finalized_malloc
* include/gc_disclaim.h (GC_finalized_malloc): Refine comment (add
a note about GC_base and GC_size).
Ivan Maidanski [Wed, 29 Nov 2017 22:24:33 +0000 (01:24 +0300)]
Update comment in finalized_disclaim to match FINALIZER_CLOSURE_FLAG
(fix commit 012da3f)
* fnlz_mlc.c [ENABLE_DISCLAIM] (GC_finalized_disclaim): Update/refine
comment (about the lowest 2 bits of the first word).
Ivan Maidanski [Wed, 29 Nov 2017 22:18:19 +0000 (01:18 +0300)]
Remove done_init static variable from fnlz_mlc.c
(code refactoring)
GC_init_finalized_malloc!=0 is used instead of boolean done_init.
* fnlz_mlc.c [ENABLE_DISCLAIM] (done_init): Remove static variable.
* fnlz_mlc.c [ENABLE_DISCLAIM] (GC_init_finalized_malloc,
GC_finalized_malloc): Use GC_finalized_kind instead of done_init.
* fnlz_mlc.c [ENABLE_DISCLAIM] (GC_init_finalized_malloc): Add
assertion that the result of GC_new_kind_inner() is non-zero.
Ivan Maidanski [Wed, 29 Nov 2017 22:10:20 +0000 (01:10 +0300)]
Fix assertion violation about disabled cancel in try_to_collect_inner
* misc.c [!GC_DISABLE_INCREMENTAL && !KEEP_BACK_PTRS]
(GC_enable_incremental): Wrap GC_gcollect_inner and GC_read_dirty calls
into DISABLE/RESTORE_CANCEL.
Ivan Maidanski [Wed, 29 Nov 2017 21:51:40 +0000 (00:51 +0300)]
Workaround TSan false positive about read of mark_lock_holder
The assertion should not be violated in GC_acquire_mark_lock even
reading from GC_mark_lock_holder is done before acquiring the mark lock.
* pthread_support.c [PARALLEL_MARK && NUMERIC_THREAD_ID_UNIQUE]
(GC_acquire_mark_lock): Skip assertion on GC_mark_lock_holder (before
acquiring the lock) if THREAD_SANITIZER.
* win32_threads.c [PARALLEL_MARK] (GC_acquire_mark_lock): Likewise.
Ivan Maidanski [Wed, 29 Nov 2017 18:26:28 +0000 (21:26 +0300)]
Add a sanity check that load_acquire and store_release are available
* pthread_stop_world.c [(!AO_HAVE_load_acquire
|| !AO_HAVE_store_release) && !CPPCHECK]: Issue error that
libatomic_ops does not define AO_load_acquire and/or AO_store_release
so the client should manually define AO_REQUIRE_CAS macro.
Ivan Maidanski [Wed, 29 Nov 2017 18:14:59 +0000 (21:14 +0300)]
Improve comment in store_stack_ptr in pthread_stop_world.c
(fix commit a194093)
* pthread_stop_world.c (GC_store_stack_ptr): Refine comment about the
atomic primitives usage.
Ivan Maidanski [Wed, 29 Nov 2017 18:09:52 +0000 (21:09 +0300)]
Remove explicit case of TRUE/FALSE to AO_t in suspend/resume_thread
(fix commit ce09fd5)
* pthread_stop_world.c [GC_ENABLE_SUSPEND_THREAD
&& !GC_OPENBSD_UTHREADS && !NACL] (GC_suspend_thread,
GC_resume_thread): Do not case TRUE/FALSE to AO_t explicitly.
Ivan Maidanski [Wed, 29 Nov 2017 17:47:59 +0000 (20:47 +0300)]
Guard against USE_PTHREAD_LOCKS and USE_SPIN_LOCK are both defined
USE_SPIN_LOCK might be specified by client. As it and USE_PTHREAD_LOCKS
are mutually exclusive, one of them should be undefined.
* include/private/gc_locks.h [(!AO_HAVE_test_and_set_acquire
|| GC_RTEMS_PTHREADS || SN_TARGET_PS3 || GC_WIN32_THREADS || LINT2)
&& GC_PTHREADS] (USE_SPIN_LOCK): Undefine (as USE_PTHREAD_LOCKS is
defined).
Ivan Maidanski [Wed, 29 Nov 2017 17:15:49 +0000 (20:15 +0300)]
Fix data race in make_descriptor when setting explicit_typing_initialized
(fix commit 5f350a0)
* typd_mlc.c [AO_HAVE_load_acquire] (GC_explicit_typing_initialized):
Add volatile qualifier.
* typd_mlc.c [AO_HAVE_load_acquire] (GC_make_descriptor): Remove
cast of &GC_explicit_typing_initialized; do not check THREADS macro;
fallback to locked checking of GC_explicit_typing_initialized if
AO_HAVE_store_release is not defined; use AO_store_release to set
GC_explicit_typing_initialized (to true).
* typd_mlc.c (GC_make_descriptor): Reformat code dealing with
GC_explicit_typing_initialized (check whether AO_HAVE_load_acquire is
defined only once).
Ivan Maidanski [Wed, 29 Nov 2017 17:06:48 +0000 (20:06 +0300)]
Revert 'Eliminate TSan warning about data race in make_descriptor'
This reverts commit
a3ee14468b807ecf2d6fa279699b7a9879443bdf.
Because it just hides a potential data race.
Ivan Maidanski [Wed, 29 Nov 2017 08:16:21 +0000 (11:16 +0300)]
Travis CI: Add tests with TSan (only without parallel mark, Linux/clang)