Ivan Maidanski [Thu, 30 Aug 2012 04:52:13 +0000 (08:52 +0400)]
Eliminate 'missing exception specification' warning in gc_cpp.cc (Clang)
* gc_cpp.cc (GC_NEW_DELETE_NEED_THROW): Define new macro (if not defined
yet) for GCC v4.2+ (or clang).
* gc_cpp.cc: Include new (for std::bad_alloc) if
GC_NEW_DELETE_NEED_THROW.
* gc_cpp.cc (GC_DECL_NEW_THROW, GC_DECL_DELETE_THROW): New macros
(used to eliminate compiler "missing exception specification" warning
for 'new' and 'delete' operators).
* gc_cpp.cc (new, delete, new[], delete[]): Use
GC_DECL_NEW/DELETE_THROW to define 'throw' clause properly.
Ivan Maidanski [Thu, 30 Aug 2012 04:39:25 +0000 (08:39 +0400)]
.gitignore: remove path prefix for config.h and stamp-h1
* .gitignore: Add include/config.h.in (to ignore); remove path for
config.h and stamp-h1 (to ignore files both located in /include/private
(old behavior) and in /include folders).
Ivan Maidanski [Thu, 30 Aug 2012 04:32:15 +0000 (08:32 +0400)]
Include "config.h" instead of "private/config.h" on HAVE_CONFIG_H
(Change the behavior of HAVE_CONFIG_H macro to the standard one
which assumes that no folder is specified in #include "config.h".)
Ivan Maidanski [Wed, 1 Aug 2012 22:02:08 +0000 (02:02 +0400)]
Fix GC_clear_stack_inner by using GC_approx_sp
* misc.c (GC_clear_stack_inner): Use GC_approx_sp() instead of
"dummy[0]" set to "&dummy" value (that worked as expected only for
STACK_GROWS_DOWN case).
Ivan Maidanski [Wed, 1 Aug 2012 19:36:16 +0000 (23:36 +0400)]
Fix all address-of-dummy operations by using GC_approx_sp() instead
(previous commit 'd6acbda' has not solved this problem)
* alloc.c (min_bytes_allocd, GC_stopped_mark): Use GC_approx_sp()
instead of "&dummy"; remove 'dummy' local variable.
* dyn_load.c (GC_cond_add_roots): Likewise.
* misc.c (GC_init): Likewise.
* os_dep.c (GC_get_stack_base, GC_get_main_stack_base): Likewise.
* pthread_stop_world.c (GC_suspend_handler_inner,
nacl_pre_syscall_hook, __nacl_suspend_thread_if_needed): Likewise.
* pthread_support.c (GC_thr_init): Likewise.
* ptr_chck.c (GC_on_stack): Likewise.
* win32_threads.c (GC_push_stack_for): Likewise.
* misc.c (GC_clear_stack_inner): Store address of volatile 'dummy'
local array (i.e. 'sp' value) to its first element (and use it in the
comparison of addresses) to prevent any harmful optimizations as C
officially disallows comparisons of pointers to different objects
(e.g., some Mac OS X clang releases might turn a conditional
expression that uses 'dummy' address into a constant); update comment.
* misc.c (GC_call_with_stack_base): Use "&base" instead of "&dummy"
(it is safe to use address of base here); remove dummy variable.
* os_dep.c (currently_updating): Change type from "word" to "int*".
* os_dep.c (async_set_pht_entry_from_index): Remove volatile and casts
for 'update_dummy' local variable.
* tools/setjmp_t.c (main): Define volatile 'sp' local variable, store
its address to it and use it instead of "&dummy"; remove 'dummy' local
variable.
Ivan Maidanski [Wed, 1 Aug 2012 05:50:01 +0000 (09:50 +0400)]
Resolve GCC warning in setjmp_t.c
* tools/setjmp_t.c (nested_sp): Change 'sp' local variable type from
int to word (to avoid 'cast from pointer to int' compiler warning).
* tools/setjmp_t.c (main): Cast pointers to unsigned long via word
type; cast WORDSZ value passed to printf() to match format type
specifier (to avoid compiler warnings).
Ivan Maidanski [Wed, 1 Aug 2012 05:42:36 +0000 (09:42 +0400)]
Fix all address-of-dummy operations by adding volatile
* alloc.c (min_bytes_allocd, GC_stopped_mark): Use volatile for
'dummy' local variable (used to get 'sp' value) to prevent any
harmful optimizations (e.g., some Mac OS X clang releases might turn
a conditional expression that uses 'dummy' address into a constant).
* dyn_load.c (GC_cond_add_roots): Likewise.
* mach_dep.c (GC_with_callee_saves_pushed): Likewise.
* misc.c (GC_clear_stack_inner, GC_init, GC_call_with_stack_base):
Likewise.
* os_dep.c (GC_get_stack_base, GC_get_main_stack_base,
async_set_pht_entry_from_index): Likewise.
* pthread_stop_world.c (nacl_pre_syscall_hook,
__nacl_suspend_thread_if_needed): Likewise.
* pthread_support.c (GC_thr_init): Likewise.
* ptr_chck.c (GC_on_stack): Likewise.
* tools/setjmp_t.c (main): Likewise.
* win32_threads.c (GC_push_stack_for): Likewise.
* dyn_load.c (dummy): Change variable type from char to int.
* include/private/gcconfig.h: Update comment about GC_stackbottom
initialization.
* os_dep.c (GC_get_stack_base): Remove 'sp' local variable.
* os_dep.c (GC_get_main_stack_base): Define and use volatile 'dummy'
variable (instead of 'result') to get 'sp' value (revert part of
commit bddc75f).
* os_dep.c (GC_get_stack_base): Add missing cast of 'dummy' address
(only if NEED_FIND_LIMIT).
* pthread_stop_world.c (GC_suspend_handler_inner): Define and use
volatile 'dummy' variable (instead of 'me') to get 'sp' value (revert
part of commit 31fc0f6).
* pthread_stop_world.c (nacl_pre_syscall_hook,
__nacl_suspend_thread_if_needed): Rename 'local_dummy' to 'dummy'
local variable.
Ivan Maidanski [Tue, 24 Jul 2012 06:34:15 +0000 (10:34 +0400)]
Fix GC_dirty_init by avoiding GC_get_suspend_signal if no threads support
(fix commit '05daaee')
* os_dep.c (GC_dirty_init): Pass SIG_SUSPEND instead of
GC_get_suspend_signal() to sigaddset() if no THREADS (or if
GC_OPENBSD_THREADS, or GC_WIN32_THREADS or NACL).
* pthread_support.c (pthread_sigmask): Assert GC_get_suspend_signal()
does not return -1 (only if not GC_NO_PTHREAD_SIGMASK).
Ivan Maidanski [Fri, 20 Jul 2012 20:36:34 +0000 (00:36 +0400)]
Fix stop_info.stack_ptr assignment in GC_suspend_all for OpenBSD
* os_dep.c (GC_get_stack_base): Abort if pthread_stackseg_np fails
(if GC_OPENBSD_THREADS).
* pthread_stop_world.c (GC_suspend_all): Get correct stack_ptr by
calling pthread_stackseg_np (subtracting ss_size from ss_sp) instead
of retrieving it from OpenBSD pthread implementation-dependent context
(if GC_OPENBSD_THREADS); remove test of stack_ptr and comment.
Ivan Maidanski [Fri, 20 Jul 2012 11:27:54 +0000 (15:27 +0400)]
Test SP obtained from OpenBSD-specific pthread context in GC_suspend_all
* pthread_stop_world.c (GC_suspend_all): Abort if stop_info.stack_ptr
obtained from OpenBSD-specific pthread context is NULL; add FIXME for
GC_OPENBSD_THREADS case (the implementation should probably use
pthread_sp_np).
Ivan Maidanski [Fri, 20 Jul 2012 07:10:10 +0000 (11:10 +0400)]
Disable find-leak GC_gcollect on GC abnormal EXIT
* misc.c (GC_exit_check): Test GC_find_leak, if it is switched off
then do not invoke GC_gcollect.
* misc.c (GC_default_on_abort): Explicitly turn off GC_find_leak to
prevent redundant garbage collection on EXIT (caused by some GC
failure).
Ivan Maidanski [Wed, 18 Jul 2012 15:41:43 +0000 (19:41 +0400)]
Fix GC_err_printf called from atexit hook by duping GC_stderr (Unix)
* misc.c: Include unistd.h if UNIX_LIKE (or CYGWIN32 or SYMBIAN) for
dup() prototype.
* misc.c (GC_init): Test "GC_FIND_LEAK" environment variable before
that for "GC_LOG_FILE" (since the block for the latter uses
GC_find_leak value).
* misc.c (GC_init): Invoke dup (only if UNIX_LIKE or CYGWIN32 or
SYMBIAN) for GC_stderr and GC_stdout in case of GC_find_leak but
when GC_stdout/err are not redirected to a file (to workaround
outputting to closed stderr/out file descriptor when GC_gcollect
(GC_print_callers) is called from atexit hook); add comment.
Ivan Maidanski [Sat, 14 Jul 2012 08:51:01 +0000 (12:51 +0400)]
Recognize GC_SIG_SUSPEND and GC_SIG_THR_RESTART tuning macros in gc.h
* include/gc.h (GC_SIG_SUSPEND, GC_SIG_THR_RESTART): New micro
recognized to tune GC_INIT with the non-default signal to be used by
GC to suspend (and resume, respectively) threads (only if GC_THREADS).
* include/gc.h (GC_INIT_CONF_SUSPEND_SIGNAL,
GC_INIT_CONF_THR_RESTART_SIGNAL): New macro (used internally by
GC_INIT).
* include/gc.h (GC_INIT): Invoke GC_INIT_CONF_SUSPEND_SIGNAL and
GC_INIT_CONF_THR_RESTART_SIGNAL before GC_init().
Add thread suspend/resume signals public setters (POSIX threads)
* include/gc.h (GC_set_suspend_signal, GC_set_thr_restart_signal):
Add public function declaration (to specify non-default signals to
suspend/resume threads).
* include/gc.h (GC_get_suspend_signal, GC_get_thr_restart_signal):
Update comment.
* misc.c (GC_set_suspend_signal, GC_set_thr_restart_signal): Add
public no-op function (only for Darwin, OpenBSD, Win32 and NaCl).
* pthread_stop_world.c (GC_set_suspend_signal,
GC_set_thr_restart_signal): Add public setter to alter the default
signals used to suspend and resume threads (only if not OpenBSD or
NaCl); has no effect if GC is initialized.
Ivan Maidanski [Wed, 4 Jul 2012 15:59:34 +0000 (19:59 +0400)]
Move GC_get_suspend/thr_restart_signal to misc.c for NaCl and OpenBSD
* misc.c (GC_get_suspend_signal, GC_get_thr_restart_signal): Define
also for OpenBSD and NaCl targets in this file (always returns -1).
* pthread_stop_world.c (GC_get_suspend_signal,
GC_get_thr_restart_signal): Move function definition up to the
definition of GC_sig_suspend and GC_sig_thr_restart variables (i.e.,
define function only if not OpenBSD and not NaCl target in this file).
Ivan Maidanski [Wed, 4 Jul 2012 15:00:41 +0000 (19:00 +0400)]
Replace SIG_SUSPEND macro to a variable in pthread_stop_world
* misc.c (GC_get_suspend_signal): Define (as always returning -1) in
this file only if Darwin or Win32 threads.
* os_dep.c (GC_dirty_init): Replace SIG_SUSPEND with the value of
GC_get_suspend_signal() invocation.
* pthread_support.c (pthread_sigmask): Likewise.
* pthread_stop_world.c (GC_sig_suspend): New STATIC variable (only
unless NaCl or OpenBSD) initialized to SIG_SUSPEND.
* pthread_stop_world.c (GC_unblock_gc_signals,
GC_suspend_handler_inner, GC_suspend_all, GC_stop_init): Use
GC_sig_suspend instead of SIG_SUSPEND (only unless NaCl or OpenBSD);
update comment.
* pthread_stop_world.c (GC_get_suspend_signal): Define function (which
returns GC_sig_suspend if available).
Ivan Maidanski [Sat, 23 Jun 2012 18:42:36 +0000 (22:42 +0400)]
Add public GC_set/get_abort_func to replace default GC_on_abort
* include/gc.h (GC_abort_func): New public typedef.
* include/gc.h (GC_set_abort_func, GC_get_abort_func): New API
function declaration.
* include/private/gc_priv.h (GC_on_abort): Change function
declaration to function pointer of GC_abort_func type (only if
SMALL_CONFIG and not PCR).
* misc.c (GC_on_abort): Rename to GC_default_on_abort; make it STATIC
and decorate with GC_CALLBACK; define GC_on_abort variable initialized
to GC_default_on_abort (only if SMALL_CONFIG and not PCR).
* misc.c (GC_set_abort_func, GC_get_abort_func): New public function
(only if if SMALL_CONFIG and not PCR) to alter and read GC_on_abort
value.
Ivan Maidanski [Sun, 24 Jun 2012 09:04:32 +0000 (13:04 +0400)]
Turn off GC_LOOP_ON_ABORT functionality if GC compiled with NO_DEBUGGING
* misc.c (looping_handler, installed_looping_handler): Do not define
if NO_DEBUGGING.
* misc.c (maybe_install_looping_handler): Define as an empty macro if
NO_DEBUGGING.
* misc.c (GC_on_abort): Do not test "GC_LOOP_ON_ABORT" environment
variable if GC_LOOP_ON_ABORT.
Ivan Maidanski [Sun, 24 Jun 2012 08:49:10 +0000 (12:49 +0400)]
Call GC_on_abort (with NULL argument) on exit(1)
* include/private/gc_priv.h (EXIT): Call GC_on_abort(NULL) before
exit(1) (unless PCR) enabling the collector to enter a tight loop
(for debugging purpose) on abnormal EXIT if "GC_LOOP_ON_ABORT"
environment variable is set.
* misc.c (GC_on_abort): Allow "msg" argument to be NULL (skip
printing the message in such a case); update comment.
Ivan Maidanski [Sun, 17 Jun 2012 16:25:09 +0000 (20:25 +0400)]
Fix thread-related tests for pthreads-w32
* tests/initsecondarythread.c: Include "private/config.h" if
HAVE_CONFIG_H (mostly to have GC_WIN32_PTHREADS defined for
pthreads-w32 target).
* tests/thread_leak_test.c: Likewise.
* tests/threadkey_test.c: Likewise.
Ivan Maidanski [Sat, 16 Jun 2012 09:35:53 +0000 (13:35 +0400)]
tools: Include proper header file for configuration macros
* tools/if_mach.c: Include private/gc_priv.h instead of
private/gcconfig.h (to get proper configuration macros defined).
* tools/if_not_there.c: Likewise.
* tools/threadlibs.c: Likewise.
* tools/threadlibs.c: Do not include gc_config_macros.h directly.
Ivan Maidanski [Sat, 16 Jun 2012 08:34:06 +0000 (12:34 +0400)]
Fix test_cpp (ensure the collector recognizes pointers to interiors)
* tests/test_cpp.cc (main): Call GC_set_all_interior_pointers(1)
before GC_INIT to ensure that the collector considers pointers to
object interiors as valid ones (such a pointer could emerge as
a result of a type cast to subclass in case of multiple inheritance);
add comment.
Ivan Maidanski [Sat, 16 Jun 2012 07:57:18 +0000 (11:57 +0400)]
cord tests: Suppress GCC warnings in 'de' app
* cord/tests/de.c (retrieve_line): Change type of "eol" local variable
from int to size_t (to prevent "comparison between signed and unsigned"
compiler warning).
* cord/tests/de_win.c (WinMain): Cast GetLastError() result to
unsigned int (to match printf format specifier).
* cord/tests/de_win.c (AboutBoxCallback): Suppress "unused parameter"
compiler warning for "lParam" (by casting the later to void).
Ivan Maidanski [Fri, 15 Jun 2012 14:24:18 +0000 (18:24 +0400)]
test_cpp: Suppress GCC warnings in WinMain
* tests/test_cpp.cc (ATTR_UNUSED): New macro.
* tests/test_cpp.cc (WinMain): Tag "instance", "prev" and "cmdShow"
arguments with ATTR_UNUSED.
* tests/test_cpp.cc (WinMain): Explicitly cast "xio", "f", "d", "a"
local variables to void (to suppress "variable set but not used"
compiler warning).
Ivan Maidanski [Sat, 9 Jun 2012 18:13:53 +0000 (22:13 +0400)]
Recognize GC_DONT_GC macro in gc.h (causes GC_INIT to turn off GC)
* include/gc.h (GC_INIT_CONF_MAX_RETRIES): Recognize GC_DONT_GC
(set GC_dont_gc to 1 in that case) to turn off GC at start-up (for
a debugging purpose).
Ivan Maidanski [Sat, 2 Jun 2012 15:27:57 +0000 (19:27 +0400)]
Add GC_push_all/conditional() to GC public API
* include/gc_mark.h (GC_push_all, GC_push_conditional): Expose
function as a part of public API (use GC_API and GC_CALL); replace
internal ptr_t and GC_bool type to char* and int, respectively; add
comment.
* mark.c (GC_push_all, GC_push_conditional): Likewise.
* include/private/gc_priv.h (GC_push_all, GC_push_conditional): Remove
function declaration.
* include/private/gc_priv.h (GC_PUSH_CONDITIONAL): New macro used
internally instead of GC_push_conditional (defined depending on
GC_DISABLE_INCREMENTAL).
* include/private/gc_priv.h (GC_PUSH_CONDITIONAL, GC_push_all_stack):
Update comment.
* mark.c (GC_push_conditional): Define for GC_DISABLE_INCREMENTAL case
(rediect to GC_push_all).
* mark_rts.c (GC_push_conditional_with_exclusions): Use
GC_PUSH_CONDITIONAL() instead of GC_push_conditional().
* mark_rts.c (GC_push_roots): Reformat the comment.
Ivan Maidanski [Sat, 2 Jun 2012 08:33:03 +0000 (12:33 +0400)]
Fix visibility of GC_push_all/conditional, GC_push_other_roots symbols
* include/private/gc_priv.h (GC_push_all, GC_push_other_roots):
Declare as GC_API_PRIV (instead of GC_INNER) to make the symbol
externally visible to some well-known 3rd-party software (e.g., ECL).
* include/private/gc_priv.h (GC_push_conditional): Declare as
GC_API_PRIV (only if GC_DISABLE_INCREMENTAL is undefined).
* mark.c (GC_push_all, GC_push_conditional): Remove GC_INNER (to match
the declaration).
* os_dep.c (GC_push_other_roots): Likewise.
Tsugutomo Enami [Sat, 2 Jun 2012 09:31:43 +0000 (13:31 +0400)]
Fix GC_FirstDLOpenedLinkMap() for NetBSD 6 release
(this empty commit contains only the fixed message for the previous commit)
* dyn_load.c: Include sys/param.h and dlfcn.h on NetBSD.
* dyn_load.c (GC_FirstDLOpenedLinkMap): Obtain link map using dlinfo()
on NetBSD if RTLD_DI_LINKMAP feature present (defined).
Tsugutomo Enami [Thu, 31 May 2012 23:12:24 +0000 (03:12 +0400)]
Fix GC_FirstDLOpenedLinkMap() for FreeBSD 9 release
* dyn_load.c: Include sys/param.h and dlfcn.h on FreeBSD.
* dyn_load.c (GC_FirstDLOpenedLinkMap): Obtain link map using dlinfo()
on FreeBSD if RTLD_DI_LINKMAP feature present (defined).
Ivan Maidanski [Wed, 16 May 2012 04:34:10 +0000 (08:34 +0400)]
Fix assertion in GC_malloc_[atomic_]uncollectable (THREADS case only)
* malloc.c (GC_malloc_uncollectable): Do not check assertion on
hb_n_marks to be zero if multi-threaded; add comment.
* mallocx.c (GC_malloc_atomic_uncollectable): Likewise.