Ivan Maidanski [Thu, 27 Aug 2015 22:37:33 +0000 (01:37 +0300)]
Code refactoring of toggle-ref support
* alloc.c (GC_stopped_mark): Move GC_process_togglerefs() call from
GC_stop_world; do not call it if GC_NO_FINALIZATION or
GC_TOGGLE_REFS_NOT_NEEDED.
* darwin_stop_world.c (GC_stop_world): Remove GC_process_togglerefs()
call.
* pthread_stop_world.c (GC_stop_world): Likewise.
* doc/README.macros (GC_TOGGLE_REFS_NOT_NEEDED): Document.
* finalize.c (GCToggleRef, GC_process_togglerefs, push_and_mark_object,
GC_clear_togglerefs, GC_toggleref_add): Replace GC_PTR with void*.
* include/gc.h (GC_toggleref_add): Likewise.
* finalize.c (GCToggleRef, GC_toggleref_callback, GC_toggleref_arr,
GC_toggleref_array_size, GC_toggleref_array_capacity,
GC_process_togglerefs, push_and_mark_object, GC_mark_togglerefs,
GC_clear_togglerefs, GC_set_toggleref_func, ensure_toggleref_capacity,
GC_toggleref_add): Do not defined if GC_TOGGLE_REFS_NOT_NEEDED.
* finalize.c (GCToggleRef): Add comment.
* finalize.c (GC_toggleref_array): Rename to GC_toggleref_arr.
* finalize.c (GC_toggleref_callback, GC_toggleref_array,
GC_toggleref_array_size, GC_toggleref_array_capacity): Make it STATIC
(instead "static").
* finalize.c (GC_process_togglerefs): Decorate with GC_INNER; remove
"toggle_ref_counts", "res" local variables; rename "w" local variable
to "new_size"; add assertion on lock state; use GC_TOGGLE_REF_* enum
element in switch statement; use BZERO to clear moved elements of
GC_toggleref_arr.
* finalize.c (GC_normal_finalize_mark_proc): Declare (before use).
* finalize.c (push_and_mark_object): Replace PUSH_OBJ with
GC_normal_finalize_mark_proc call.
* finalize.c (GC_mark_togglerefs, GC_clear_togglerefs): Remove
"object" local variable.
* finalize.c (GC_toggleref_register_callback): Rename to
GC_set_toggleref_func; change argument to GC_toggleref_func (which
returns GC_ToggleRefStatus instead of int).
* finalize.c (GC_toggleref_register_callback, GC_toggleref_add):
Decorate with GC_API and GC_CALL.
* include/gc.h (GC_toggleref_register_callback): Likewise.
* finalize.c (GC_set_toggleref_func): Acquire allocation lock.
* finalize.c (GC_get_toggleref_func): New API function.
* finalize.c (ensure_toggleref_capacity): Rename "capacity" argument
to "capacity_inc"; add assertion on argument value; rename "tmp" local
variable to "new_array"; remove unused "old_capacity" variable; replace
memcpy() with BCOPY() call.
* finalize.c (GC_toggleref_add): Rename "strong_ref" argument to
"is_strong_ref".
* finalize.c (GC_finalize): Do not call GC_clear_togglerefs and
GC_mark_togglerefs if GC_TOGGLE_REFS_NOT_NEEDED.
* include/gc.h (GC_ToggleRefStatus, GC_toggleref_func): New type.
* include/gc.h (GC_toggleref_register_callback): Add comment
(including about locking).
* include/gc.h (GC_get_toggleref_func): New API function declaration.
* include/gc.h (GC_toggleref_add): Decorate with GC_CALL; add comment;
add GC_ATTR_NONNULL attribute.
* include/private/gc_priv.h (GC_process_togglerefs): Do not declare if
GC_TOGGLE_REFS_NOT_NEEDED; decorate with GC_INNER.
Ivan Maidanski [Tue, 25 Aug 2015 07:19:05 +0000 (10:19 +0300)]
Fix out-of-memory handling in GC_toggleref_add
* finalize.c (ensure_toggleref_capacity): Change return type from void
to GC_bool; return FALSE on allocation failure (or desired capacity
value overflow).
* finalize.c (GC_toggleref_add): Change return type from void to int.
* include/gc.h (GC_toggleref_add): Likewise.
* finalize.c (GC_toggleref_add): Return GC_NO_MEMORY if
ensure_toggleref_capacity failed, GC_SUCCESS otherwise (including the
case of no callback).
Rodrigo Kumpera [Wed, 26 Feb 2014 17:14:39 +0000 (12:14 -0500)]
Add toggle-ref support
(Apply commit af75406 from 'mono_libgc' branch.)
GC backed toggleref machinery. This enables
an embedder to support toggleref style of external memory management
without hooking up to the host retain/release machinery.
The API export two entry points. The first let the caller register
a callback that decides the state of a given object, by
probably inspecting its native state. The second allows registration
of objects with the toggleref machinery.
The idea of toggleref is that we keep an external reference to an
object and it can be either a strong or weak reference. We use
a weak reference when the external peer has no interest into the
object and a strong otherwise.
Ivan Maidanski [Wed, 19 Aug 2015 07:23:36 +0000 (10:23 +0300)]
Mark fo_head, finalize_now with a single GC_push_all call
(code refactoring)
* finalize.c (GC_fnlz_roots): New static variable.
* finalize.c (GC_fo_head, GC_finalize_now): Move into GC_fnlz_roots
(remove "GC_" prefix for field names).
* finalize.c (GC_push_finalizer_structures): Replace GC_ASSERT and
GC_PUSH_ALL_SYM for GC_fo_head, GC_finalize_now with a single
GC_ASSERT and GC_PUSH_ALL_SYM for GC_fnlz_roots.
* finalize.c (GC_register_finalizer_inner,
GC_register_finalizer_unreachable, GC_finalize,
GC_should_invoke_finalizers, GC_invoke_finalizers,
GC_notify_or_invoke_finalizers): Replace access to GC_fo_head,
GC_finalize_now with access to the corresponding field of
GC_fnlz_roots.
Ivan Maidanski [Fri, 7 Aug 2015 18:00:36 +0000 (21:00 +0300)]
Fix exporting of GC_push_all_eager
* include/gc_mark.h (GC_push_all_eager): Move comment from gc_priv.h.
* include/private/gc_priv.h (GC_push_all_eager): Remove (because has
it might have calling conventions different from that in gc.h).
Ivan Maidanski [Tue, 4 Aug 2015 22:43:46 +0000 (01:43 +0300)]
Distinct long-link table growth log message
* finalize.c (GC_register_disappearing_link_inner): Add tbl_log_name
argument and pass it to GC_COND_LOG_PRINTF (instead of "dl" name).
* finalize.c (GC_general_register_disappearing_link,
GC_register_long_link): Pass corresponding link hashtable short name
("dl" or "long dl") to GC_register_disappearing_link_inner.
Ivan Maidanski [Tue, 4 Aug 2015 22:20:32 +0000 (01:20 +0300)]
Make heap walker accept callback
* alloc.c (GC_mercury_callback_reachable_object): Remove.
* include/gc.h (GC_mercury_callback_reachable_object): Likewise.
* include/private/gc_priv.h (GC_mercury_enumerate_reachable_objects):
Likewise.
* alloc.c (GC_finish_collection): Do not call
GC_mercury_enumerate_reachable_objects.
* include/gc_mark.h (GC_reachable_object_proc): New public typedef.
* include/gc_mark.h (GC_enumerate_reachable_objects_inner): New API
function declaration.
* reclaim.c (enumerate_reachable_s): New struct type.
* reclaim.c (GC_mercury_do_enumerate_reachable_objects): Rename to
GC_do_enumerate_reachable_objects; replace while() with for(); use 2nd
argument to pass client callback and custom data; call client callback
(passed via the argument) instead of
GC_mercury_callback_reachable_object; pass object size in bytes
instead of words to client callback.
* reclaim.c (GC_mercury_enumerate_reachable_objects): Rename to
GC_enumerate_reachable_objects_inner; decorate with GC_API/GC_CALL;
add 2 arguments (client callback and custom data); remove assertion
for GC_mercury_callback_reachable_object; add assertion for acquired
lock.
* tests/test.c: Include gc_mark.h unconditionally.
* tests/test.c (reachable_objs_counter,
reachable_objs_count_enumerator): New function.
* tests/test.c (check_heap_stats): New local variable "obj_count";
invoke GC_call_with_alloc_lock(reachable_objs_count_enumerator);
print final number of reachable objects.
Peter Wang [Mon, 16 Jun 2014 11:05:05 +0000 (21:05 +1000)]
Add support for enumerating the reachable objects in the heap
(Apply part of commit dbf2db8 from 'paulbone/mercury7_4_pbone' branch.)
This can be used to do heap profiling, helping the developer work out which
objects are live or what kinds of objects account for a lot of their heap
space.
* alloc.c:
* include/gc.h:
* include/private/gc_priv.h:
* reclaim.c:
As above.
Ivan Maidanski [Mon, 27 Jul 2015 07:34:35 +0000 (10:34 +0300)]
Code refactoring of 'alt-stack registration support'
* darwin_stop_world.c (GC_stack_range_for, GC_push_all_stacks):
Reformat code dealing with alt-stack.
* pthread_stop_world.c (GC_push_all_stacks): Likewise.
* darwin_stop_world.c (GC_stack_range_for): Cast pointers to word when
compared.
* GC_push_all_stacks (GC_push_all_stacks): Likewise.
* include/gc.h (GC_register_altstack): Reformat comment; decorate with
GC_CALL; comment out argument names; change type of altstack_size and
stack_size to word.
* include/private/pthread_support.h (altstack, altstack_size, stack,
stack_size): Refine and reformat comment.
* include/private/pthread_support.h (altstack_size, stack_size): Change
type from int to word.
* pthread_support.c (main_stack_size, main_altstack_size): Likewise.
* pthread_support.c (main_pthread_self): Rename to main_pthread_id.
* pthread_support.c (GC_register_altstack): Decorate with GC_API and
GC_CALL.
* win32_threads.c (GC_register_altstack): Likewise.
* pthread_support.c (GC_register_altstack): Rename "thread" local
variable to "me"; new local variable "self"; use DCL_LOCK_STATE;
reformat code.
* pthread_support.c (GC_thr_init): New local variable "self"; compare
thread id using THREAD_EQUAL; reformat code.
* win32_threads.c (GC_register_altstack): Add GC_ATTR_UNUSED to all
arguments to avoid compiler warning (while the function is
unimplemented); add TODO.
Zoltan Varga [Mon, 21 May 2012 23:02:05 +0000 (01:02 +0200)]
Add alt-stack registration support
(Apply commit ff4ec56 from 'mono_libgc' branch.)
Fix altstack support in libgc by registering the bounds of the normal
stack and the altstack with it.
* darwin_stop_world.c (GC_stack_range_for): Add paltstack_lo,
paltstack_hi argments; set *paltstack_lo, *paltstack_hi, adjust lo and
hi if p->altstack set.
* darwin_stop_world.c (GC_push_all_stacks): Declare altstack_lo,
altstack_hi local variables; pass &altstack_lo, &altstack_hi to
GC_stack_range_for; do not call GC_push_all_stack(lo, hi) and
adjust total_size by hi-lo if lo is NULL; call
GC_push_all_stack(altstack_lo, altstack_hi) and increment total_size
by altstack_hi-altstack_lo if altstack_lo is non-NULL.
* include/gc.h (GC_register_altstack): New API function declaration.
* include/private/pthread_support.h (GC_Thread_Rep): Add altstack,
altstack_size, stack, stack_size fields.
* pthread_stop_world.c (GC_push_all_stacks): Adjust hi value if
p->altstack set.
* pthread_support.c (main_pthread_self, main_stack, main_altstack,
main_stack_size, main_altstack_size): New static variables.
* pthread_support.c (GC_register_altstack): New function.
* pthread_support.c (GC_thr_init): Set altstack, altstack_size, stack,
stack_size fields from values saved by GC_register_altstack (if called
before GC_thr_init).
* win32_threads.c (GC_register_altstack): New function (unimplemented).
Update the arm32 code to match arm64, powerpc and x86.
* include/private/gc_priv.h: Include machine/trap.h if
DATASTART_USES_BSDGETDATASTART (instead of checking for FREEBSD and
particular CPUs).
* include/private/gcconfig.h (ALIGNMENT, HEURISTIC2,
SEARCH_FOR_DATA_START): Remove for FreeBSD/arm.
* include/private/gcconfig.h (MPROTECT_VDB, SIG_SUSPEND,
SIG_THR_RESTART, DATASTART, DATASTART_USES_BSDGETDATASTART): Define
macro if FREEBSD and ARM32.
* os_dep.c (CODE_OK): Define for FreeBSD/arm.
Ivan Maidanski [Sun, 12 Jul 2015 07:26:06 +0000 (10:26 +0300)]
Code refactoring regarding 'data start' definition for FreeBSD
* include/private/gcconfig.h (DATASTART_USES_BSDGETDATASTART): New
macro defined for FreeBSD when DATASTART is defined to
GC_FreeBSDGetDataStart().
* include/private/gcconfig.h (GC_FreeBSDGetDataStart,
DATASTART_IS_FUNC): Move declare/definition from the place where
DATASTART defined for FreeBSD to common place guarded with the check
of DATASTART_USES_BSDGETDATASTART.
* include/private/gcconfig.h (GC_FreeBSDGetDataStart): Decorate with
GC_INNER.
* os_dep.c (GC_FreeBSDGetDataStart): Likewise.
* os_dep.c (GC_FreeBSDGetDataStart): Define only if
DATASTART_USES_BSDGETDATASTART (instead of checking FREEBSD and
CPU-specific macros).
* include/private/gc_priv.h: Include machine/trap.h if qqqFREEBSD and
AARCH64 defined.
* os_dep.c (GC_FreeBSDGetDataStart, CODE_OK): Define if FREEBSD and
AARCH64.
* include/private/gc_priv.h: Replace checking powerpc/__powerpc__
macros with POWERPC.
* os_dep.c: Likewise.
* include/private/gcconfig.h (ALIGNMENT, HEURISTIC2,
SEARCH_FOR_DATA_START): Do not define for FREEBSD/AARCH64.
* include/private/gcconfig.h (MPROTECT_VDB, FREEBSD_STACKBOTTOM,
DATASTART, DATASTART_IS_FUNC): Define if FREEBSD and AARCH64 defined.
Ivan Maidanski [Mon, 6 Jul 2015 17:37:34 +0000 (20:37 +0300)]
Refine GC_free_space_divisor comment regarding its initial value
* include/gc.h (GC_free_space_divisor): Update comment regarding
initial value which is now controlled by GC_FREE_SPACE_DIVISOR macro
(defined at collector or client compile time).
* include/private/gcconfig.h (NOSYS): Do not define if FREEBSD and
__aarch64__.
* include/private/gcconfig.h (AARCH64, mach_type_known): Define if
FREEBSD and __aarch64__.
* include/private/gcconfig.h (ALIGNMENT, OS_TYPE, DYNAMIC_LOADING,
HEURISTIC2, SEARCH_FOR_DATA_START): Likewise.
Joao Abecasis [Wed, 27 May 2015 12:26:12 +0000 (14:26 +0200)]
Harmonize OSX/iOS configuration; enable compiling for iPhone simulator
Darwin setup would assume i386/x86_64 was OS X, while arm/arm64 was iOS.
The iPhone simulator, however, breaks this assumption, covering both
i386 and x86_64 (depending on the simulated device).
With this patch <TargetConditionals.h> is pulled in and TARGET_OS_IPHONE
used to detect an iOS target -- both device and simulator.
Otherwise, #defines were moved to keep Darwin setup similar across
i386/x86_64/arm/arm64, making GC_DONT_REGISTER_MAIN_STATIC_DATA and
TARGET_OS_IPHONE options respected across the board.
(Apart from the added #include, Darwin on PowerPC is left as it was.)
* include/private/gcconfig.h: Include TargetConditionals.h (if DARWIN).
* include/private/gcconfig.h (DARWIN_DONT_PARSE_STACK): Move definition
to the place of OS_TYPE definition.
* include/private/gcconfig.h (DYNAMIC_LOADING): Define only if
GC_DONT_REGISTER_MAIN_STATIC_DATA (only if DARWIN).
* include/private/gcconfig.h (NO_DYLD_BIND_FULLY_IMAGE): Define only if
TARGET_OS_IPHONE != 0 (including simulator case).
Joao Abecasis [Wed, 27 May 2015 09:31:56 +0000 (11:31 +0200)]
[Fix] Do not reference thread state struct for exception state (Darwin)
THREAD_FLD was being used to indirect access to both thread state and
exception state, which broke compilation for recent versions of iOS in
32-bit mode.
With this THREAD_FLD's logic is split, THREAD_FLD_NAME will prefix field
names as needed, while THREAD_FLD injects "ts_32." wrapper as needed to
access thread state.
Macros to access exception state updated to use THREAD_FLD_NAME.
* include/private/gc_priv.h (THREAD_FLD_NAME): New macro (only if
DARWIN).
* include/private/gc_priv.h (DARWIN_EXC_STATE_DAR): Define using
THREAD_FLD_NAME.
* os_dep.c (DARWIN_EXC_STATE_DAR): Use THREAD_FLD_NAME instead of
THREAD_FLD.
Ivan Maidanski [Wed, 24 Jun 2015 11:51:14 +0000 (14:51 +0300)]
Eliminate warning about 64-bit pointer-to-int cast (Win64/pthreads-w32)
* include/private/gc_locks.h (NUMERIC_THREAD_ID): Cast to unsigned long
through "word" type if GC_WIN32_PTHREADS but not winpthreads (to
suppress "cast from pointer to integer of different size" compiler
warning).
* win32_threads.c (NUMERIC_THREAD_ID): Likewise.
* win32_threads.c (NUMERIC_THREAD_ID): Do not define unless
GC_ASSERTIONS.
Ivan Maidanski [Tue, 23 Jun 2015 12:17:27 +0000 (15:17 +0300)]
Export GC_push_all_eager
* include/gc_mark.h (GC_push_all_eager): New API function declaration.
* mark.c (GC_push_all_eager): Add GC_API, GC_CALL; change arguments
type from ptr_t to char*.
Ivan Maidanski [Sat, 20 Jun 2015 19:22:07 +0000 (22:22 +0300)]
Adjust places where profiling callbacks invoked (to match Mono GC)
* alloc.c (GC_try_to_collect_inner): Move sending of GC_EVENT_START to
the beginning of function (i.e. send right after GC_dont_gc check);
move sending of GC_EVENT_END from GC_finish_collection to the end of
this function (send it only if collection completed successfully); add
TODO note about GC_EVENT_ABANDON notification.
* alloc.c (start_world_inner): Remove.
* alloc.c (GC_stopped_mark): Send GC_EVENT_PRE_STOP_WORLD,
GC_EVENT_POST_STOP_WORLD, GC_EVENT_PRE_START_WORLD,
GC_EVENT_POST_START_WORLD only if THREADS.
* alloc.c (GC_stopped_mark): Send GC_EVENT_MARK_START before
minimizing junk left in registers/stack (instead of after).
* alloc.c (GC_stopped_mark): Do not send GC_EVENT_MARK_END in case of
abandoned collection (add TODO note about GC_EVENT_MARK_ABANDON).
* alloc.c (GC_stopped_mark): Send GC_EVENT_MARK_END after checking
debugged objects for consistency (instead of before it).
* darwin_stop_world.c (GC_suspend_thread_list): Send
GC_EVENT_THREAD_SUSPENDED (in addition to that in GC_stop_world).
* darwin_stop_world.c (GC_thread_resume): Move sending of
GC_EVENT_THREAD_UNSUSPENDED from GC_start_world().
* pthread_stop_world.c (GC_suspend_all, GC_start_world): Do not send
GC_EVENT_THREAD_SUSPENDED if pthread_kill/android_thread_kill failed.
* pthread_stop_world.c (GC_start_world): Send
GC_EVENT_THREAD_UNSUSPENDED after pthread_resume_np (in case of
GC_OPENBSD_UTHREADS).
* win32_threads.c (GC_stop_world): Move sending of
GC_EVENT_THREAD_SUSPENDED to GC_suspend().
* win32_threads.c (GC_suspend, GC_start_world): Remove redundant cast
to void* of THREAD_HANDLE().
Ivan Maidanski [Sun, 17 May 2015 14:37:51 +0000 (17:37 +0300)]
Fix logic/compile errors in "event callbacks" code (Darwin, Pthreads)
* darwin_stop_world.c (GC_stop_world): Replace
GC_EVENT_THREAD_UNSUSPENDED to GC_EVENT_THREAD_SUSPENDED.
* pthread_stop_world.c (GC_on_collection_event): Declare.
* pthread_stop_world.c (GC_suspend_all): Change type of "thread_id"
local variable to pthread_t (or pid_t for Android) instead of int; fix
"threadid" parameter to "thread_id" in GC_on_collection_event call;
implement notification for NaCl target.
* pthread_stop_world.c (GC_start_world): Declare "thread_id" local
variable; implement notification for NaCl target.
Ivan Maidanski [Mon, 4 May 2015 20:21:06 +0000 (23:21 +0300)]
Avoid new[] debug variant definition for ancient MS VC++
(restore behavior broken in commit 3d784ed)
* include/gc_cpp.h (operator new[]): Update comment.
* include/gc_cpp.h (operator new[]): Do not define the debug variant
for MS VC pre-v7; add comment.
Ivan Maidanski [Fri, 8 May 2015 06:26:36 +0000 (09:26 +0300)]
Enable gc.h inclusion by client without implicit include windows.h (Win32)
* doc/README.macros (GC_DONT_INCLUDE_WINDOWS_H): Document.
* include/gc.h: Include windows.h unless GC_DONT_INCLUDE_WINDOWS_H
(only for Win32).
* include/gc.h (DECLSPEC_NORETURN): Define to __declspec(noreturn) by
default if windows.h not included (instead of empty).
* include/gc.h (GC_WIN32_SIZE_T): Define to DWORD (or unsigned long)
unless _WIN64 (instead of GC_uintptr_t which is unsigned int for
32-bit target).
* include/gc.h (GC_DllMain, GC_CreateThread, GC_ExitThread): If WINAPI
undefined (i.e., if windows.h not included by or prior to gc.h) then
declare the prototype using built-in C types instead of Windows types.
Ivan Maidanski [Thu, 16 Apr 2015 07:33:16 +0000 (10:33 +0300)]
Adjust code indentation of malloc/calloc/str[n]dup
(and do not define GC_init_lib_bounds if unused)
* malloc.c (GC_debug_malloc_replacement): Do not define/undefine macro
if REDIRECT_MALLOC_IN_HEADER.
* malloc.c (GC_libpthread_start, GC_libpthread_start,
GC_libpthread_end, GC_libld_start, GC_init_lib_bounds): Do not define
if REDIRECT_MALLOC_IN_HEADER.
* malloc.c (GC_debug_malloc_replacement, malloc, GC_init_lib_bounds,
calloc, strdup, strndup, free): Reformat code (adjust indentation) and
comments.
* malloc (free): Do not call GC_free if IGNORE_FREE defined.
Ivan Maidanski [Sun, 25 Nov 2012 08:07:13 +0000 (12:07 +0400)]
Recognize REDIRECT_MALLOC_IN_HEADER macro
* include/private/gcconfig.h: Do not issue error on REDIRECT_MALLOC
and THREADS if REDIRECT_MALLOC_IN_HEADER defined.
* malloc.c (malloc, calloc, strdup, strndup, free): Do not define if
REDIRECT_MALLOC_IN_HEADER.
* mallocx.c (realloc): Likewise.
Ivan Maidanski [Sun, 5 Apr 2015 15:59:45 +0000 (18:59 +0300)]
Do not pass VC-specific 'pragma message' in gc.h to other compilers (Win64)
* include/gc.h: Pass pragma message (to identify missing predefined
symbols for Win64) only if _MSC_VER (as it is specific to VC); report
the message only on first gc.h inclusion; adjust related comment.
Ivan Maidanski [Sat, 2 Aug 2014 08:17:57 +0000 (12:17 +0400)]
Resolve MessageBoxA at run-time (if requested) in GC_init (Win32)
(and code refactoring of GC_abort)
* misc.c (GC_win32_MessageBoxA): New static routine (only if MSWIN32,
move code from GC_abort).
* misc.c (GC_init, GC_abort): Replace MessageBoxA with
GC_win32_MessageBoxA call (to resolve "MessageBoxA" at run-time if
DONT_USE_USER32_DLL).
Ivan Maidanski [Sat, 2 Aug 2014 07:51:16 +0000 (11:51 +0400)]
Do not show WoW64 warning message unless CHECK_NOT_WOW64 defined (Win32)
* misc.c (GC_init): Do not show warning message box about WoW64 unless
CHECK_NOT_WOW64 (and GC_WIN32_THREADS); use GetModuleHandle instead of
GetModuleHandleA; check GetModuleHandle result; refine comment;
reformat code.
Ivan Maidanski [Mon, 7 Jul 2014 07:12:31 +0000 (11:12 +0400)]
New macro (NO_WINMAIN_ENTRY) to prefer main() instead of WinMain (Win32)
* tests/test.c (WinMain): Do not define if NO_WINMAIN_ENTRY (define
main() instead).
* tests/test_cpp.cc (WinMain): Define (instead of main()) for MSWIN32
and WinCE (but not for MinGW and not if NO_WINMAIN_ENTRY).
Ivan Maidanski [Sun, 18 Nov 2012 08:32:34 +0000 (12:32 +0400)]
Enable huge_test for Win64 (and LLP64 target)
* tests/huge_test.c (GC_WORD_MAX): New macro
* tests/huge_test.c (main): Do not check for long has the same size as
pointer; use unsigned GC_WORD_MAX instead of LONG_MAX; use NULL
instead of 0 for pointers.
Ivan Maidanski [Mon, 6 Apr 2015 17:06:47 +0000 (20:06 +0300)]
Do not include sigcontext.h and asm/sigcontext.h
(these Linux headers define sigcontext which is no longer used as
replaced with ucontext_t in GC 7.0alpha1)
* os_dep.c: Do not include linux/version.h (do not test
LINUX_VERSION_CODE), asm/signal.h, sigcontext.h, asm/sigcontext.h
since struct sigcontext not used in GC v7+.
Ivan Maidanski [Tue, 17 Mar 2015 23:32:30 +0000 (02:32 +0300)]
GC_stack_range_for code refactoring for Darwin/arm64
* darwin_stop_world.c (GC_stack_range_for): Replace "__" register name
prefix with THREAD_FLD(); roll x[0..28] push statements in a loop (for
AARCH64).
Ivan Maidanski [Fri, 27 Feb 2015 18:32:22 +0000 (21:32 +0300)]
Revert "Move asm machine-dependent files to 'src' folder" (partly)
Asm files moved back to base folder to avoid build issues (reported
for NetBSD and Solaris on Sparc). Alternative way is to adjust
configure.ac and Makefile.am properly but it requires more efforts
(including testing).
Ivan Maidanski [Fri, 23 Jan 2015 08:20:53 +0000 (11:20 +0300)]
GC_stack_range_for code refactoring (Darwin/arm)
* darwin_stop_world.c (GC_stack_range_for): Roll GC_push_one() calls
to a loop (for ARM32 only).
* os_dep.c: Remove redundant include mach/thread_status.h as already
included from gc_priv.h (for DARWIN only).
Bruce Hoult [Sun, 4 Jan 2015 15:32:29 +0000 (04:32 +1300)]
Fix OSX issue with snprintf wrapper macro
(bug introduced in commit 7bef74b)
OS X for some reason has problems with defining snprintf as a macro
and including another macro expansion in its arguments.
* cord/tests/cordtest.c (GC_SNPRINTF_BUFSZ_ARG): Remove.
* cord/tests/cordtest.c (GC_SNPRINTF): Do not define if no snprintf()
available.
* cord/tests/cordtest.c (test_printf): If GC_SNPRINTF undefined then
use sprintf() instead.
Bruce Hoult [Sun, 4 Jan 2015 15:33:35 +0000 (04:33 +1300)]
Fix OSX issue with pthread_attr_setstacksize failure
(bug introduced in commit 7bef74b)
* tests/test.c (main): Set stack size to 1000 KiB instead of 1000000 bytes (to avoid pthread_attr_setstacksize failure with
"stacksize is not a multiple of the system page size" error on
Darwin)
Ivan Maidanski [Tue, 4 Nov 2014 14:55:18 +0000 (17:55 +0300)]
Avoid explicit use of machine-specific x_THREAD_STATE macros (Darwin)
(code refactoring)
* include/private/gc_priv.h (GC_MACH_THREAD_STATE,
GC_MACH_THREAD_STATE_COUNT): Remove explicit definition to
PPC_THREAD_STATE[_COUNT], ARM_THREAD_STATE[_COUNT] (as the correct
values are defined via MACHINE_THREAD_STATE[_COUNT] macro).
Ivan Maidanski [Tue, 4 Nov 2014 14:01:08 +0000 (17:01 +0300)]
Fix mistyped ARM_THREAD_STATE macro (Darwin/arm)
* include/private/gc_priv.h (GC_MACH_THREAD_STATE,
GC_MACH_THREAD_STATE_COUNT): Define to ARM_THREAD_STATE[_COUNT],
respectively, instead of mistyped ARM_MACHINE_THREAD_STATE[_COUNT]
(if DARWIN and ARM32).
Tsugutomo Enami [Sun, 2 Nov 2014 07:46:17 +0000 (10:46 +0300)]
Fix FirstDLOpenedLinkMap for case libgc not 1st dynamically linked (NetBSD)
Current GC_FirstDLOpenedLinkMap() for NetBSD calls dlinfo(RTLD_SELF,
RTLD_DI_LINKMAP, &lm) to find link_map. So it will find link_map of
libgc. With guile's case, libgc is link to libguile and libguile is
linked to the guile command, so libgc is not the first one in the
link_map chain. That is why, data section of libguile, where
scm_protects exists, is not added to GC root and GC_is_visible fails.
* dyn_load.c (GC_FirstDLOpenedLinkMap): Iterate over link_map
(provided by dlinfo(RTLD_SELF)) to return 2nd element instead of the
provided one which might not always belong to libgc (only for NETBSD
and defined RTLD_DI_LINKMAP).
Ivan Maidanski [Mon, 20 Oct 2014 20:54:28 +0000 (00:54 +0400)]
Fix missing error handling of pthread_attr_init/getstacksize
* misc.c (GC_init): Explicitly ignore returned value of
pthread_mutexattr_destroy.
* os_dep.c (GC_get_main_stack_base, GC_get_stack_base, GC_dirty_init):
Likewise.
* pthread_support.c (start_mark_threads, pthread_create): Likewise.
* tests/test.c (main): Likewise.
* win32_threads.c (start_mark_threads): Likewise.
* pthread_support.c (pthread_create): ABORT (with the appropriate
message) in case of pthread_attr_getstacksize or pthread_attr_init
failure.
* tests/test.c (main): Print error code and FAIL if pthread_attr_init
or pthread_attr_setstacksize failed (only if GC_PTHREADS).
Yusuke Suzuki [Wed, 1 Oct 2014 18:38:02 +0000 (03:38 +0900)]
Fix __alloc_size__ availability detection (Clang)
Since __clang_major__/__clang_minor__ etc. are vendor dependent values,
we cannot implement the feature detection based on it.
For example, Apple clang versioning is different from the FreeBSD clang.
(At this time, Apple clang version is "6.0 (clang-600.0.51)" and
__clang_major__ is 6.)
Instead of this, we can use the clang feature detection macro,
__has_attribute.
* include/gc_config_macros.h (GC_ATTR_ALLOC_SIZE): Replace predefined
__clang_major/minor__ testing with __has_attribute() one (in case of
clang).