* dbg_mlc.c (GC_debug_generic_malloc_inner): Add GC_start_debugging() if not
done. This fixes the missing registration of the debug header displacement.
* dbg_mlc.c (GC_debug_generic_malloc_inner_ignore_off_page): Ditto.
Ivan Maidanski [Sat, 21 Apr 2012 16:18:55 +0000 (20:18 +0400)]
Fix USE_CUSTOM_SPECIFIC mode (if manually enabled) for Win32
* win32_threads.c (GC_unregister_my_thread,
GC_remove_all_threads_but_me, GC_thread_exit_proc): Invoke
GC_remove_specific (if THREAD_LOCAL_ALLOC) after destroying
thread-local list (same as in pthread_support.c).
Ivan Maidanski [Sat, 21 Apr 2012 19:44:19 +0000 (23:44 +0400)]
Code refactoring of specific.c and specific.h;
cast pointers to word instead of unsigned long
* include/private/specific.h (CACHE_HASH, HASH): Add parentheses
around the argument.
* include/private/specific.h (CACHE_HASH): Remove unnecessary cast to
long.
* include/private/specific.h (HASH): Rename "n" argument to "p";
cast "p" to word instead of long; cast result to unsigned.
* include/private/specific.h (quick_thread_id, INVALID_QTID): Cast to
word instead of unsigned long.
* specific.c (GC_key_create_inner): Cast invalid_tse.next (pointer) to
word instead of unsigned long.
* include/private/specific.h (GC_slow_getspecific, GC_getspecific):
Change type of "qtid" from unsigned long to word.
* specific.c (GC_slow_getspecific): Likewise.
* include/private/specific.h (GC_getspecific): Remove "hash_val"
local variable.
* specific.c: Do not include gc_priv.h as included from
thread_local_alloc.h; do not include atomic_ops.h as included from
specific.h file.
Ivan Maidanski [Sat, 21 Apr 2012 16:18:55 +0000 (20:18 +0400)]
Fix USE_CUSTOM_SPECIFIC mode (if manually enabled) for Win32
* win32_threads.c (GC_unregister_my_thread,
GC_remove_all_threads_but_me, GC_thread_exit_proc): Invoke
GC_remove_specific (if THREAD_LOCAL_ALLOC) after destroying
thread-local list (same as in pthread_support.c).
* alloc.c (GC_check_fl_marks): Re-read each pointer atomically before
following the pointed-to link and bail out if the result is different
(this can happen if the thread has popped the object off the
free-list); the function is a no-op if AO_load is unavailable.
Ivan Maidanski [Fri, 20 Apr 2012 05:12:47 +0000 (09:12 +0400)]
Code refactoring of GC_check_tls_for/GC_check_fl_marks
* alloc.c (GC_check_fl_marks): Change prototype (pass pointer to
"freelist" element instead of value); do not define the function if
THREAD_LOCAL_ALLOC undefined.
* include/private/gc_priv.h (GC_check_fl_marks): Likewise.
* alloc.c (GC_check_fl_marks): Skip check if the argument points to
a special (non-pointer) value; update comment; rename "q" local
variable to "list".
* thread_local_alloc.c (GC_check_tls_for): Update code according to
GC_check_fl_marks functionality change (remove checks for special
value).
Ivan Maidanski [Fri, 20 Apr 2012 04:53:46 +0000 (08:53 +0400)]
Code refactoring of GC_generic_malloc_inner (eliminate recursion)
* malloc.c (GC_generic_malloc_inner): Update "lg" value after GC_init
and GC_extend_size_map calls; add assertion on "lg" value after
GC_extend_size_map call; update "opp" and "op" values and retry
allocation instead of recursive call; replace "goto" with return
(remove "out" label).
* include/private/gc_priv.h, alloc.c (GC_check_fl_marks): Re-read each
pointer before following the pointed-to link, and bail out if the result is
different. This can happen if the thread has popped the object off the
free-list. The prototype is changed to allow re-reading the pointers.
* thread_local_alloc.c (GC_check_tls_for): Adjust the calls accordingly.
Ivan Maidanski [Tue, 17 Apr 2012 03:52:08 +0000 (07:52 +0400)]
Minor code refactoring regarding HAVE_BUILTIN_UNWIND_INIT
* include/private/gcconfig.h (HAVE_BUILTIN_UNWIND_INIT): Do not define
for Darwin/ppc and RTEMS.
* mach_dep.c (GC_with_callee_saves_pushed): Remove target-specific
checks for Darwin/ppc and RTEMS as HAVE_BUILTIN_UNWIND_INIT is not
defined in that case.
Fix GC_with_callee_saves_pushed for clang (disable __builtin_unwind_init)
* include/private/gcconfig.h (HAVE_BUILTIN_UNWIND_INIT): Do not define
for clang (as __builtin_unwind_init seems to be a no-op in the latest
clang release).
Ivan Maidanski [Mon, 9 Apr 2012 04:02:42 +0000 (08:02 +0400)]
Do not compile backgraph.c unless configure '--enable-gc-debug'
* Makefile.am (libgc_la_SOURCES): Exclude "backgraph" entry from
unconditional list; add this entry only if MAKE_BACK_GRAPH.
* configure.ac (MAKE_BACK_GRAPH): New AM conditional (defined only if
enable_gc_debug explicitly set to yes).
Ivan Maidanski [Mon, 2 Apr 2012 18:31:22 +0000 (22:31 +0400)]
FIX: Disable incremental mode on Darwin if fork handling requested
* doc/README.macros (NO_HANDLE_FORK): Replace back with HANDLE_FORK
and update.
* include/private/gcconfig.h (CAN_HANDLE_FORK): Define also for Darwin
in case of MPROTECT_VDB.
* misc.c (GC_set_handle_fork): Handle Darwin properly; add comment.
* os_dep.c (GC_dirty_init): Do not turn on GC_dirty_maintained for
Darwin if GC_handle_fork is on; add comment; remove FIXME.
* pthread_support.c (GC_fork_prepare_proc): Remove WARN for Darwin
(since GC_dirty_maintained is off in that case).
* pthread_support.c (GC_fork_child_proc): Remove comment (for Darwin).
Ivan Maidanski [Mon, 2 Apr 2012 16:18:12 +0000 (20:18 +0400)]
Add public GC_set_handle_fork to control forked child handling support
* include/gc.h (GC_set_handle_fork): New API function.
* misc.c (GC_set_handle_fork): Likewise.
* include/private/gc_priv.h (GC_handle_fork): New internal variable
declaration (only if CAN_HANDLE_FORK).
* misc.c (GC_handle_fork): New internal variable (defined only if
CAN_HANDLE_FORK); initialize to TRUE if HANDLE_FORK.
* include/private/gcconfig.h (HANDLE_FORK): Replace with
CAN_HANDLE_FORK.
* pthread_support.c (HANDLE_FORK): Likewise.
* win32_threads.c (HANDLE_FORK): Likewise.
* include/private/gcconfig.h (CAN_HANDLE_FORK): Always define macro if
HANDLE_FORK.
* pthread_support.c (GC_thr_init): Replace HANDLE_FORK with
CAN_HANDLE_FORK; call pthread_atfork only if GC_handle_fork; update
the comment.
* win32_threads.c (GC_thr_init): Likewise.
* tests/test.c (NO_TEST_HANDLE_FORK): Define new macro if fork
handling is not supported (or is a no-op) on the target.
* tests/test.c (INIT_FORK_SUPPORT): New macro (invoke
GC_set_handle_fork unless NO_TEST_HANDLE_FORK).
* tests/test.c (GC_OPT_INIT): New macro (defined to GC_INIT or empty).
* tests/test.c (GC_COND_INIT): Use INIT_FORK_SUPPORT and GC_OPT_INIT.
* tests/test.c (run_one_test): Test NO_TEST_HANDLE_FORK (instead of
target-specific macros).
* win32_threads.c (GC_remove_all_threads_but_me, GC_fork_prepare_proc,
GC_fork_parent_proc, GC_fork_child_proc): Do not test GC_PTHREADS.
* configure.ac (HANDLE_FORK, NO_HANDLE_FORK): Update message.
Ivan Maidanski [Fri, 30 Mar 2012 03:53:06 +0000 (07:53 +0400)]
Remove redundant public GC_HAVE_GET_HEAP_USAGE_SAFE macro
* include/gc.h (GC_HAVE_GET_HEAP_USAGE_SAFE): Remove public HAVE_
macro (since function availability could be determined by autotools);
update the comment.
Andy Wingo [Tue, 27 Mar 2012 11:20:37 +0000 (13:20 +0200)]
configure: add --enable-handle-fork option
* configure.ac: Add --enable-handle-fork option; if explicitly passed,
enables or disables the pthread_atfork support; if not passed, the
default, as determined by gcconfig.h, is to enable HANDLE_FORK if it
is supported on the target platform.
Ivan Maidanski [Sun, 25 Mar 2012 07:07:25 +0000 (11:07 +0400)]
Replace GC_ms_entry declaration with opaque definition for public API
* include/gc_mark.h (GC_ms_entry): Define structure as opaque unless
GC_BUILD (otherwise remains as declaration which is defined in
private/gc_pmark.h).
Ivan Maidanski [Sun, 25 Mar 2012 06:32:05 +0000 (10:32 +0400)]
Fix visibility of some GC internal symbols used by GCJ
(Includes reverting part of commits 68b9f27, 91d5df5, b2345fb)
* allchblk.c (GC_hblkfreelist, GC_free_bytes): Do not define array as
STATIC again but only if GC_GCJ_SUPPORT (for GNU GCJ client).
* blacklst.c (GC_is_black_listed): Do not define as GC_INNER again
(for GNU GCJ client).
* include/private/gc_priv.h (GC_is_black_listed): Likewise.
* include/private/gc_priv.h (GC_hblkfreelist): Restore removed
declaration (but only if GC_GCJ_SUPPORT).
* reclaim.c (GC_n_set_marks): Do not define as STATIC again (for GCJ);
update the comment.
Ivan Maidanski [Tue, 20 Mar 2012 18:35:51 +0000 (22:35 +0400)]
Select GC_REGISTER_MAIN_STATIC_DATA behavior in build script (Symbian)
* build/s60v3/libgc.mmp (GC_DONT_REGISTER_MAIN_STATIC_DATA): Define
macro.
* misc.c (GC_REGISTER_MAIN_STATIC_DATA): Do not define specially for
SYMBIAN.
Ivan Maidanski [Fri, 16 Mar 2012 15:11:08 +0000 (19:11 +0400)]
Fix GC_ALPHA_VERSION comparison in gctest and tools files
* tests/test.c (GC_ALPHA_VERSION): Define to GC_TMP_ALPHA_VERSION if
not defined by gc_version.h.
* tools/add_gc_prefix.c (GC_ALPHA_VERSION): Likewise.
* tools/gcname.c (GC_ALPHA_VERSION): Likewise.
Hans Boehm [Thu, 15 Mar 2012 17:09:05 +0000 (21:09 +0400)]
Speedup calloc size overflow check by preventing division if small values
* malloc.c (GC_SQRT_SIZE_MAX): New macro.
* malloc.c (calloc): Add fast initial size overflow check to avoid
integer division for reasonably small values passed.
Ivan Maidanski [Tue, 6 Mar 2012 19:33:39 +0000 (23:33 +0400)]
Fix configure enabling 'make check' with C++ support for Cygwin/MinGW
* configure.ac (CXXLIBS): New variable; set it to "-lsupc++" for
Cygwin and MinGW if enable_cplusplus and the library is available.
* tests/tests.am (test_cpp_LDADD): Use "CXXLIBS" variable.
Kai Tietz [Fri, 10 Feb 2012 16:30:47 +0000 (16:30 +0000)]
Define GC_DLL if DLL_EXPORT at GC build
(Apply part of commit 6488760 from 'gcc_boehmgc' branch.)
* include/gc_config_macros.h (GC_DLL): Define if we are actually in GC
build and DLL_EXPORT is defined (unless prohibited by GC_NOT_DLL)
preventing GC internal symbols exporting on Cygwin and MinGW.
Ivan Maidanski [Tue, 6 Mar 2012 16:26:24 +0000 (20:26 +0400)]
Fix gctest (for Win32) to avoid GC_print_stats internal variable usage
* include/private/gc_priv.h (GC_print_stats): Update the comment.
* tests/test.c (GC_print_stats, run_one_test, check_heap_stats):
Rename GC_print_stats to print_stats (since the former is used
internally by GC and not exported).
* tests/test.c (print_stats): Always define (either as a macro or
a static int variable) regardless of GC_DLL and SMALL_CONFIG.
* tests/test.c (INIT_PRINT_STATS): New macro (used to initialize
print_stats if needed); GETENV is used if needed and available.
* tests/test.c (GC_COND_INIT): Invoke INIT_PRINT_STATS.
Ivan Maidanski [Tue, 6 Mar 2012 16:10:11 +0000 (20:10 +0400)]
Fix GC_READ_ENV_FILE code for Cygwin
* misc.c: Include windows.h for Cygwin if GC_READ_ENV_FILE (required
for GC_envfile_init).
* misc.c (_MAX_PATH): Move definition to the place before the first
use (only Win32).
Elijah Taylor [Tue, 9 Aug 2011 20:03:46 +0000 (22:03 +0200)]
Fix DATASTART (and other minor improvements) for NaCl target
* include/private/gcconfig.h (DATASTART): Define to a fixed address
for NaCl.
* pthread_stop_world.c (GC_suspend_all): Issue GC warning if it
appears stalled waiting for some threads to park (NaCl only).
* pthread_stop_world.c (nacl_register_gc_hooks): Declare external
function (available from NaCl runtime).
* pthread_stop_world.c (GC_nacl_initialize_gc_thread): Invoke
nacl_register_gc_hooks registring nacl_pre_syscall_hook and
nacl_post_syscall_hook (NaCl only).
Ivan Maidanski [Sun, 4 Mar 2012 10:20:10 +0000 (14:20 +0400)]
tests: Fix subthread_create.c by defining AO_REQUIRE_CAS
* subthread_create.c (AO_REQUIRE_CAS): Define in case of PARALLEL_MARK
(guaranteeing AO_fetch_and_add to be defined at least if GC is built
with parallel marking enabled).
Ivan Maidanski [Wed, 29 Feb 2012 04:39:50 +0000 (08:39 +0400)]
tools: Change some functions declaration style from K-R to ANSI C
* tools/add_gc_prefix.c (main): Remove unused "envp" argument.
* tools/add_gc_prefix.c (main): Replace the K&R-style function
definition with the ANSI C one.
* tools/gcname.c (main): Likewise.
Ivan Maidanski [Mon, 27 Feb 2012 17:49:35 +0000 (21:49 +0400)]
Fix GC_register_my_thread marking thread as detached (Cygwin/pthreads-w32)
* win32_threads.c (GC_register_my_thread): Fix SEGV by setting "me"
to the newly-created thread GC descriptor (if lookup failed) before
altering flags of "me" (only if GC_PTHREADS); add comment (same as
in pthread_support.c).
* win32_threads.c (GC_unregister_my_thread): Remove check for
GC_PTHREADS inside GC_win32_dll_threads (since DllMain-based thread
registration is not supported for pthreads).
* win32_threads.c (GC_pthread_join, GC_pthread_create): Replace check
for non-GC_win32_dll_threads mode with the assertion; move local
variable declarations to function beginning.
Ivan Maidanski [Mon, 27 Feb 2012 16:44:21 +0000 (20:44 +0400)]
Report GC_pthread_join/detach failure with appropriate message
* win32_threads.c (GC_pthread_join): Call GC_lookup_pthread only if
needed (in case of pthreads-w32 target).
* win32_threads.c (GC_pthread_join, GC_pthread_detach): If no thread
is found by GC_lookup_pthread (e.g., the thread has not been created
by GC_pthread_create) then abort with the appropriate message (instead
of null pointer dereference).
Ivan Maidanski [Mon, 27 Feb 2012 16:23:19 +0000 (20:23 +0400)]
Delete GC_init_parallel call in some redirected pthread functions (Win32)
* win32_threads.c (GC_pthread_join, GC_pthread_sigmask,
GC_pthread_detach): Remove useless GC_init_parallel() call (since
parallel_initialized is set either by GC_allow_register_threads or by
redirected pthread_create).