platform/upstream/libgc.git
9 years agoCode refactoring of 'finalization extension API'
Ivan Maidanski [Sun, 19 Jul 2015 14:14:16 +0000 (17:14 +0300)]
Code refactoring of 'finalization extension API'

* finalize.c (GC_object_finalized_proc, GC_set_finalizer_notify_proc):
Use GC_await_finalize_proc type.
* finalize.c (GC_object_finalized_proc): Use STATIC instead of
"static".
* finalize.c (GC_set_finalizer_notify_proc): Rename to
GC_set_await_finalize_proc.
* include/gc.h (GC_set_finalizer_notify_proc): Likewise.
* finalize.c (GC_set_await_finalize_proc): Add LOCK/UNLOCK.
* finalize.c (GC_set_await_finalize_proc): Decorate with GC_CALL.
* include/gc.h (GC_set_await_finalize_proc): Likewise.
* finalize.c (GC_get_await_finalize_proc): New API function.
* include/gc.h (GC_await_finalize_proc): New type.
* include/gc.h (GC_set_await_finalize_proc): Document.
* include/gc.h (GC_get_await_finalize_proc): New API function
declaration.

9 years agoImplement the finalization extension API
Rodrigo Kumpera [Fri, 30 May 2014 01:51:29 +0000 (21:51 -0400)]
Implement the finalization extension API
(Apply commit c429e9f from 'mono_libgc' branch.)

Conflicts:

    finalize.c
    include/gc.h

9 years agoFix Makefile.direct for Cygwin
Paul Bone [Thu, 16 Jul 2015 17:31:24 +0000 (20:31 +0300)]
Fix Makefile.direct for Cygwin
(Apply part of commit 9f229e2 from "paulbone/mercury7_4_pbone" branch.)

* Makefile.direct (CXX, AS): Add comment.
* Makefile.direct (LD): New variable.
* Makefile.direct (libalphagc.so, libirixgc.so, mach_dep.o): Use LD
variable.
* Makefile.direct (mach_dep.o): Replace "as $(AS_ABI_FLAG)" with $(AS).
* Makefile.direct (mach_dep.o, mark_rts.o): Add Cygwin-specific rules.

9 years agoUpdate AUTHORS file
Ivan Maidanski [Tue, 14 Jul 2015 08:16:52 +0000 (11:16 +0300)]
Update AUTHORS file

9 years agoCode refactoring regarding 'data start' definition for FreeBSD
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).

9 years agoFix support of FreeBSD/aarch64
Carlos J. Puga Medina [Sat, 11 Jul 2015 18:31:40 +0000 (21:31 +0300)]
Fix support of FreeBSD/aarch64

* 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.

9 years agoCode refactoring, add test and document GC_get_memory_use
Ivan Maidanski [Thu, 9 Jul 2015 21:29:43 +0000 (00:29 +0300)]
Code refactoring, add test and document GC_get_memory_use

* include/gc.h (GC_get_memory_use): Add comment.
* include/gc.h (GC_get_memory_use): Decorate with GC_CALL; change
return type from long to size_t.
* misc.c (GC_get_memory_use): Likewise.
* misc.c (get_size): Rename to block_add_size.
* misc.c (get_size): Rename lptr parameter to pbytes; code refactoring.
* misc.c (GC_get_memory_use): Rename "c" local variable to "bytes";
add DCL_LOCK_STATE.
* tests/test.c (check_heap_stats): Call GC_get_memory_use (and print
returned value).

9 years agoAdd API function to calculate total memory in use by all GC blocks
Eli Barzilay [Wed, 8 Jul 2015 21:49:31 +0000 (00:49 +0300)]
Add API function to calculate total memory in use by all GC blocks
(Apply part of commit db2b9f1 from 'racket_gc' branch.)

* include/gc.h (GC_get_memory_use): New API function declaration.
* misc.c (get_size, GC_get_memory_use): New function.

9 years agoUpdate AUTHORS file
Ivan Maidanski [Tue, 7 Jul 2015 22:48:57 +0000 (01:48 +0300)]
Update AUTHORS file

9 years agoFix GC_get_stack_base if called before GC_init (Win32)
Eli Barzilay [Tue, 7 Jul 2015 22:22:23 +0000 (01:22 +0300)]
Fix GC_get_stack_base if called before GC_init (Win32)
(Apply part of commit db2b9f1 from 'racket_gc' branch.)

* os_dep.c (GC_get_stack_base): Call GC_setpagesize if GC_page_size is
not initialized (only if MSWIN32 but not CYGWIN32).

9 years agoExport GC_push_finalizer_structures
Ivan Maidanski [Mon, 6 Jul 2015 18:46:55 +0000 (21:46 +0300)]
Export GC_push_finalizer_structures

* include/gc_mark.h (GC_push_finalizer_structures): New API function
declaration.
* include/private/gc_priv.h (GC_push_finalizer_structures): Remove.

9 years agoRefine GC_free_space_divisor comment regarding its initial value
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).

9 years agoUpdate AUTHORS file
Ivan Maidanski [Sat, 4 Jul 2015 07:12:43 +0000 (10:12 +0300)]
Update AUTHORS file

9 years agoSupport FreeBSD/aarch64
Carlos J. Puga Medina [Fri, 3 Jul 2015 18:55:54 +0000 (21:55 +0300)]
Support FreeBSD/aarch64

* 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.

9 years agoFix various spelling errors
David Van Horn [Wed, 2 Feb 2011 19:56:42 +0000 (14:56 -0500)]
Fix various spelling errors
(Apply commit 1efc418 from 'racket_gc' branch.)

* ChangeLog: Fix typo (accommodate).
* win32_threads.c (GC_pthread_create): Fix typo (interceptable).

Conflicts:

    Makefile.dj
    doc/README.changes
    dyn_load.c
    win32_threads.c

9 years agowin32: support MinGW build
Matthew Flatt [Fri, 7 Dec 2012 13:58:40 +0000 (07:58 -0600)]
win32: support MinGW build
(Apply commit 7f44cc9 from 'racket_gc' branch.)

A MinGW build is the same shape as a MSVC build (but without
MzCOM), unlike a Cygwin build.

* include/gc_config_macros.h (GC_API): Define to declspec(dllexport)
if GC_DLL and __MINGW32_DELAY_LOAD__ (even if no GC_BUILD).

Conflicts:

    include/gc_config_macros.h

9 years agoUpdate AUTHORS file
Ivan Maidanski [Sun, 28 Jun 2015 08:07:16 +0000 (11:07 +0300)]
Update AUTHORS file

9 years agoHarmonize OSX/iOS configuration; enable compiling for iPhone simulator
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).

9 years ago[Fix] Do not reference thread state struct for exception state (Darwin)
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.

9 years agoEliminate warning about 64-bit pointer-to-int cast (Win64/pthreads-w32)
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.

9 years agoExport GC_push_all_eager
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*.

9 years agoAdd profiling callback events to indicate start/end of reclaim phase
Ivan Maidanski [Tue, 23 Jun 2015 11:52:41 +0000 (14:52 +0300)]
Add profiling callback events to indicate start/end of reclaim phase

* alloc.c (GC_finish_collection): Send GC_EVENT_RECLAIM_START and
GC_EVENT_RECLAIM_END to indicate objects marking phase start/end.
* include/gc.h (GC_EventType): Add GC_EVENT_RECLAIM_START/END.

9 years agoStandalone profiling callback for threads suspend/resume
Ivan Maidanski [Tue, 23 Jun 2015 11:39:29 +0000 (14:39 +0300)]
Standalone profiling callback for threads suspend/resume

* alloc.c (GC_on_collection_event, GC_set_on_collection_event,
GC_get_on_collection_event): Move from misc.c.
* alloc.c (GC_on_collection_event): Make STATIC.
* include/private/gc_priv.h (GC_on_collection_event): Remove
declaration.
* include/gc.h (GC_on_collection_event_proc): Remove 2nd argument of
the callback.
* alloc.c (GC_try_to_collect_inner, GC_stopped_mark): Likewise.
* darwin_stop_world.c (GC_suspend_thread_list, GC_stop_world,
GC_thread_resume): Use GC_on_thread_event instead of
GC_on_collection_event.
* pthread_stop_world.c (GC_suspend_all, GC_start_world): Likewise.
* win32_threads.c (GC_suspend, GC_start_world): Likewise.
* include/gc.h (GC_on_collection_event_proc): Update comment.
* include/gc.h (GC_set_on_collection_event,
GC_get_on_collection_event): Add comment.
* include/gc.h (GC_on_thread_event_proc): New callback type (only if
GC_THREADS).
* include/gc.h (GC_set_on_thread_event, GC_get_on_thread_event): New
API function declaration (only if GC_THREADS).
* include/private/gc_priv.h (GC_on_thread_event): New variable
declaration (only if THREADS).
* misc.c (GC_on_thread_event): New global variable (only if THREADS).
* misc.c (GC_set_on_thread_event, GC_get_on_thread_event): New API
function (only if THREADS).

9 years agoAdjust places where profiling callbacks invoked (to match Mono GC)
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().

9 years agoRename GCEventKind to GC_EventType (profiling event type)
Ivan Maidanski [Fri, 19 Jun 2015 21:26:07 +0000 (00:26 +0300)]
Rename GCEventKind to GC_EventType (profiling event type)

* include/gc.h (GCEventKind, GC_on_collection_event_proc): Rename
GCEventKind to GC_EventType.

9 years agoRename and reorder profiling callback events (to match Mono GC API)
Ivan Maidanski [Fri, 19 Jun 2015 16:23:29 +0000 (19:23 +0300)]
Rename and reorder profiling callback events (to match Mono GC API)

* include/gc.h (GCEventKind): Reorder events.
* include/gc.h (GCEventKind): Rename events (GC_EVENT_COLLECTION_BEGIN
to GC_EVENT_START, GC_EVENT_MARK_BEGIN to GC_EVENT_MARK_START,
GC_EVENT_COLLECTION_END to GC_EVENT_END,
GC_EVENT_STOPWORLD_BEGIN/END to GC_EVENT_PRE/POST_STOP_WORLD,
GC_EVENT_STARTWORLD_BEGIN/END to GC_EVENT_PRE/POST_START_WORLD).
* alloc.c (GC_try_to_collect_inner, start_world_inner, GC_stopped_mark,
GC_finish_collection): Likewise.

9 years agoMerge branch 'profiling-callbacks'
Ivan Maidanski [Sun, 17 May 2015 18:03:22 +0000 (21:03 +0300)]
Merge branch 'profiling-callbacks'

9 years agoCode refactoring of "event callbacks" functionality
Ivan Maidanski [Sun, 17 May 2015 15:23:52 +0000 (18:23 +0300)]
Code refactoring of "event callbacks" functionality

* alloc.c (GC_on_collection_event): Remove declaration (moved to
gc_priv.h).
* darwin_stop_world.c (GC_on_collection_event): Likewise.
* pthread_stop_world.c (GC_on_collection_event): Likewise.
* win32_threads.c (GC_on_collection_event): Likewise.
* alloc.c (start_world): Rename to start_world_inner; inline it.
* darwin_stop_world.c (GC_start_world): Wrap long code lines.
* pthread_stop_world.c (GC_suspend_all, GC_start_world): Likewise.
* win32_threads.c (GC_stop_world, GC_start_world): Likewise.
* include/gc.h: Remove trailing space at EOLn.
* include/private/gc_priv.h (GC_on_collection_event): Declare global
variable (using GC_EXTERN).
* misc.c (GC_on_collection_event): Add GC_INNER; replace NULL to 0.

9 years agoFix logic/compile errors in "event callbacks" code (Darwin, Pthreads)
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.

9 years agoUpdate AUTHORS file
Ivan Maidanski [Sun, 17 May 2015 11:43:35 +0000 (14:43 +0300)]
Update AUTHORS file

9 years agoUpdate AUTHORS file
Ivan Maidanski [Sun, 17 May 2015 11:10:32 +0000 (14:10 +0300)]
Update AUTHORS file

9 years agoAdd build system plumbing for building with -Werror.
Alex Ronne Petersen [Tue, 10 Jun 2014 07:34:01 +0000 (09:34 +0200)]
Add build system plumbing for building with -Werror.

* Makefile.am (AM_CFLAGS): Add $(WERROR_CFLAGS).
* configure.ac (WERROR_CFLAGS): Define based on --enable-werror new
configure option value.

Conflicts:

    Makefile.am
    configure.ac

9 years agoUpdate ChangeLog file
Ivan Maidanski [Sat, 16 May 2015 10:56:03 +0000 (13:56 +0300)]
Update ChangeLog file

9 years agoUpdate ChangeLog file
Ivan Maidanski [Thu, 14 May 2015 22:00:01 +0000 (01:00 +0300)]
Update ChangeLog file
(Apply commit e2ed67b from 'release-7_4' branch.)

Conflicts:

    ChangeLog

9 years agoMerge branch 'jtotz-bdwgc-integrate-2'
Ivan Maidanski [Mon, 11 May 2015 16:16:08 +0000 (19:16 +0300)]
Merge branch 'jtotz-bdwgc-integrate-2'

9 years agoAvoid new[] debug variant definition for ancient MS VC++
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.

Conflicts:

    include/gc_cpp.h

9 years agoRe-enable gc_cpp.h usage for GC compiled without ATOMIC_UNCOLLECTABLE
Ivan Maidanski [Fri, 10 Apr 2015 23:01:41 +0000 (02:01 +0300)]
Re-enable gc_cpp.h usage for GC compiled without ATOMIC_UNCOLLECTABLE

GC_ATOMIC_UNCOLLECTABLE macro is recognized (in gc_cpp.h) to enable
GC_malloc_atomic_uncollectable functionality.

* include/gc_cpp.h (enum GCPlacement): Remove NoGCPointerFree alias.
* include/gc_cpp.h (enum GCPlacement): Do not declare PointerFreeNoGC
element unless GC_ATOMIC_UNCOLLECTABLE defined.
* include/gc_cpp.h (gc::operator new, operator new): Do not handle
PointerFreeNoGC (and do not call GC_MALLOC_ATOMIC_UNCOLLECTABLE) unless
GC_ATOMIC_UNCOLLECTABLE defined.

9 years agoReformat code of gc_cpp.cc/h
Ivan Maidanski [Mon, 11 May 2015 15:25:22 +0000 (18:25 +0300)]
Reformat code of gc_cpp.cc/h

* include/gc_cpp.h: Reformat code (and comments).
* gc_cpp.cc: Likewise.
* include/gc_cpp.h (operator new): Replace if-then-else with switch.

Conflicts:

    include/gc_cpp.h

9 years agoRestore definition of new/delete operators in gc_cpp.cc (for non-VC)
Ivan Maidanski [Mon, 4 May 2015 17:28:24 +0000 (20:28 +0300)]
Restore definition of new/delete operators in gc_cpp.cc (for non-VC)
(revert part of commit 3d784ed)

* gc_cpp.cc (new, delete, new[], delete[]): Add definition (unless
_MSC_VER defined).

Conflicts:

    gc_cpp.cc

9 years agoRemove commented out code in gc_cpp.cc/h
Ivan Maidanski [Mon, 11 May 2015 15:12:03 +0000 (18:12 +0300)]
Remove commented out code in gc_cpp.cc/h
(code refactoring)

* gc_cpp.cc: Remove commented out code.
* include/gc_cpp.h: Likewise.

Conflicts:

    gc_cpp.cc
    include/gc_cpp.h

9 years agoput all the cpp stuff in header
Johannes Totz [Tue, 13 Jul 2010 14:14:53 +0000 (15:14 +0100)]
put all the cpp stuff in header
otherwise vc9 will mix up new and delete operators (due to arbitrary ordering during linking)

Conflicts:

gc_cpp.cc
include/gc_cpp.h

9 years agoenable atomic-uncollectable
Johannes Totz [Mon, 24 Jan 2011 17:56:37 +0000 (17:56 +0000)]
enable atomic-uncollectable
pretty much the same as system's malloc, but is useful in force-include scenarios

Conflicts:

    include/gc.h
    include/gc_cpp.h
    vc9/libgc.vcproj

9 years agoEnable gc.h inclusion by client without implicit include windows.h (Win32)
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.

9 years agoAdjust code indentation of malloc/calloc/str[n]dup
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.

Conflicts:

malloc.c

9 years agoRecognize REDIRECT_MALLOC_IN_HEADER macro
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.

Conflicts:

    include/gc.h
    include/private/gcconfig.h
    malloc.c
    mallocx.c

9 years agoDo not pass VC-specific 'pragma message' in gc.h to other compilers (Win64)
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.

Conflicts:

    include/gc.h

9 years agodebug helper for preproc symbol mix up
Johannes Totz [Tue, 24 Aug 2010 19:40:51 +0000 (20:40 +0100)]
debug helper for preproc symbol mix up
i got bitten by it... for some reason _WIN64 is not defined all the time. glitch in vc9?

Conflicts:

    include/gc.h

9 years agoRemove erroneous GC_use_threads_discovery call from GC_DllMain
Ivan Maidanski [Sun, 25 Nov 2012 09:42:04 +0000 (13:42 +0400)]
Remove erroneous GC_use_threads_discovery call from GC_DllMain

* win32_threads.c (GC_use_threads_discovery): Uncomment assertion;
update comment.
* win32_threads.c (GC_DllMain): Remove erroneous
GC_use_threads_discovery call; add comment.
* windows-untested/vc9/libgc.vcproj (PreprocessorDefinitions): Add
GC_DISCOVER_TASK_THREADS (due to removal of GC_use_threads_discovery
from GC_DllMain).

Conflicts:

    win32_threads.c

9 years agovc9: Move to windows-untested; adjust scripts in *.vcproj
Ivan Maidanski [Sun, 18 Nov 2012 08:18:50 +0000 (12:18 +0400)]
vc9: Move to windows-untested; adjust scripts in *.vcproj

9 years agono _DLL should not be defined here! it's predefined by the compiler
Johannes Totz [Thu, 24 Mar 2011 12:36:25 +0000 (12:36 +0000)]
no _DLL should not be defined here! it's predefined by the compiler
depending on which runtime library option was enabled

Conflicts:

    vc9/libgc.vcproj

9 years agoadd two more test cases
Johannes Totz [Fri, 20 Aug 2010 01:09:56 +0000 (02:09 +0100)]
add two more test cases

Conflicts:

tests/huge_test.c

9 years agoadd x64
Johannes Totz [Thu, 29 Jul 2010 15:18:09 +0000 (16:18 +0100)]
add x64
note that size_t types are 64 bit wide on x64 whereas dword types stay fixed at being 32 bit wide

Conflicts:

    include/gc.h
    win32_threads.c

9 years agofix us some project files for vc9
Johannes Totz [Tue, 13 Jul 2010 14:15:27 +0000 (15:15 +0100)]
fix us some project files for vc9

Conflicts:

windows-untested/vc60/gc.dsp
windows-untested/vc60/libgc.dsp
windows-untested/vc60/libgcmt.dsp
windows-untested/vc70/gc.vcproj
windows-untested/vc70/libgc.vcproj
windows-untested/vc70/libgcmt.vcproj

9 years agoResolve MessageBoxA at run-time (if requested) in GC_init (Win32)
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).

Conflicts:

misc.c

9 years agoDo not show WoW64 warning message unless CHECK_NOT_WOW64 defined (Win32)
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.

Conflicts:

misc.c

9 years agogc_init() is a better place for this warning
Johannes Totz [Mon, 24 Jan 2011 18:11:52 +0000 (18:11 +0000)]
gc_init() is a better place for this warning

Conflicts:

misc.c
win32_threads.c

9 years agoNew macro (NO_WINMAIN_ENTRY) to prefer main() instead of WinMain (Win32)
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).

Conflicts:

tests/test.c
tests/test_cpp.cc

9 years agohuge_test: turn GC_WORD_MAX into a signed constant
Ivan Maidanski [Thu, 10 Jul 2014 21:03:54 +0000 (01:03 +0400)]
huge_test: turn GC_WORD_MAX into a signed constant

* tests/huge_test.c (GC_IGNORE_WARN): Refine comment.
* tests/huge_test.c (GC_WORD_MAX): Replace with GC_SWORD_MAX; change
type to GC_signed_word.

9 years agoEnable huge_test for Win64 (and LLP64 target)
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.

Conflicts:

tests/huge_test.c

9 years agoRename ATOMIC_UNCOLLECTABLE to GC_ATOMIC_UNCOLLECTABLE
Ivan Maidanski [Sat, 11 Apr 2015 07:25:45 +0000 (10:25 +0300)]
Rename ATOMIC_UNCOLLECTABLE to GC_ATOMIC_UNCOLLECTABLE
(code refactoring)

* Makefile.direct (CFLAGS): Add GC_ prefix to ATOMIC_UNCOLLECTABLE.
* SMakefile.amiga: Likewise.
* configure.ac (enable_atomic_uncollectible): Likewise.
* dbg_mlc.c (GC_print_obj, GC_debug_malloc_atomic_uncollectable,
GC_debug_free, GC_debug_realloc): Likewise.
* doc/README.Mac: Likewise.
* doc/README.macros (ATOMIC_UNCOLLECTABLE): Likewise.
* extra/AmigaOS.c (GC_amiga_allocwrapper_any): Likewise.
* include/new_gc_alloc.h: Likewise.
* include/private/gc_priv.h (struct _GC_arrays, AUNCOLLECTABLE):
Likewise.
* mallocx.c (GC_auobjfreelist_ptr, GC_generic_or_special_malloc,
GC_malloc_atomic_uncollectable): Likewise.
* mark.c (GC_obj_kinds, GC_N_KINDS_INITIAL_VALUE): Likewise.
* include/private/gc_priv.h (GC_ATOMIC_UNCOLLECTABLE): Define if
ATOMIC_UNCOLLECTABLE defined (for compatibility with the clients that
do not use GC makefiles).

9 years ago.gitignore: Add *.vcproj.*.user (copied from .hgignore)
Ivan Maidanski [Sun, 18 Nov 2012 08:00:13 +0000 (12:00 +0400)]
.gitignore: Add *.vcproj.*.user (copied from .hgignore)

9 years agoRemove commented out code in AmigaOS.c, gcconfig.h and os_dep.c
Ivan Maidanski [Mon, 6 Apr 2015 17:27:02 +0000 (20:27 +0300)]
Remove commented out code in AmigaOS.c, gcconfig.h and os_dep.c

* doc/README.amiga: Remove note about "#if 0'ed" code.
* extra/AmigaOS.c: Remove "#if 0'ed" code.
* include/private/gcconfig.h: Likewise.
* os_dep.c: Likewise.

9 years agoDo not include sigcontext.h and asm/sigcontext.h
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+.

9 years agoGC_stack_range_for code refactoring for Darwin/arm64
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).

9 years agoAdd incremental GC support for Darwin/arm64
Ivan Maidanski [Tue, 17 Mar 2015 22:06:02 +0000 (01:06 +0300)]
Add incremental GC support for Darwin/arm64

* os_dep.c (DARWIN_EXC_STATE, DARWIN_EXC_STATE_COUNT,
DARWIN_EXC_STATE_T, DARWIN_EXC_STATE_DAR): Define for AARCH64 target.

9 years agoInitial support for iOS ARM64 (Aarch64)
Niklas Therning [Fri, 12 Dec 2014 14:58:45 +0000 (15:58 +0100)]
Initial support for iOS ARM64 (Aarch64)

* darwin_stop_world.c (GC_stack_range_for): Handle AARCH64 case.
* include/private/gc_priv.h (GC_THREAD_STATE_T, GC_MACH_THREAD_STATE,
GC_MACH_THREAD_STATE_COUNT): Define for AARCH64.
* include/private/gcconfig.h (OS_TYPE, DYNAMIC_LOADING, DATASTART,
DATAEND, STACKBOTTOM, USE_MMAP, USE_MMAP_ANON, MPROTECT_VDB,
GETPAGESIZE, NO_PTHREAD_TRYLOCK, NO_DYLD_BIND_FULLY_IMAGE): Likewise.
* include/private/gcconfig.h (AARCH64, mach_type_known,
DARWIN_DONT_PARSE_STACK): Define for Darwin/AArch64.

9 years agoMerge branch 'master' into ios-unified-ts-fix
Ivan Maidanski [Sat, 28 Feb 2015 20:01:14 +0000 (23:01 +0300)]
Merge branch 'master' into ios-unified-ts-fix

Conflicts:
include/private/gc_priv.h

9 years agoRevert "Move asm machine-dependent files to 'src' folder" (partly)
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).

* .gitignore: Remove "src" from comment.
* Makefile.am (EXTRA_libgc_la_SOURCES): Remove "src/" prefix.
* Makefile.direct (SRCS, mach_dep.o): Likewise.
* src/ia64_save_regs_in_stack.s: Move to base folder.
* src/sparc_mach_dep.S: Likewise.
* src/sparc_netbsd_mach_dep.s: Likewise.
* src/sparc_sunos4_mach_dep.s: Likewise.

9 years agoAdd AArch64-32 target support
Andrew Pinski [Fri, 13 Feb 2015 17:44:37 +0000 (20:44 +0300)]
Add AArch64-32 target support
(Implement boehm-gc for AARCH64:ILP32)

* include/private/gcconfig.h (CPP_WORDSZ, ALIGNMENT): Correct for
AARCH64:ILP32.

9 years agoGC_stack_range_for code refactoring (Darwin/arm)
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).

9 years agoFix OSX issue with snprintf wrapper macro
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.

9 years agoFix OSX issue with pthread_attr_setstacksize failure
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)

9 years agoGC_stack_range_for iOS 32/64-bit code refactoring (Darwin/arm)
Ivan Maidanski [Mon, 17 Nov 2014 20:02:16 +0000 (23:02 +0300)]
GC_stack_range_for iOS 32/64-bit code refactoring (Darwin/arm)

* darwin_stop_world.c (kCFCoreFoundationVersionNumber_iOS_8_0): Move
definition out of GC_stack_range_for.
* darwin_stop_world.c (GC_stack_range_for): Refine comment and abort
message; eliminate code duplication regarding thread_get_state call.

9 years agoAvoid explicit use of machine-specific x_THREAD_STATE macros (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).

9 years agoFix mistyped ARM_THREAD_STATE macro (Darwin/arm)
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).

9 years agoMerge remote-tracking branch 'robovm/thread_get_state_stack_corruption_on_ios7_64bit_...
Ivan Maidanski [Tue, 4 Nov 2014 08:14:24 +0000 (11:14 +0300)]
Merge remote-tracking branch 'robovm/thread_get_state_stack_corruption_on_ios7_64bit_and_ios8'

Conflicts:
darwin_stop_world.c

9 years agoFix FirstDLOpenedLinkMap for case libgc not 1st dynamically linked (NetBSD)
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).

9 years agoFix missing cord_pos.h, ec.h among installed headers (Automake)
Ivan Maidanski [Tue, 21 Oct 2014 21:36:17 +0000 (01:36 +0400)]
Fix missing cord_pos.h, ec.h among installed headers (Automake)

* cord/cord.am (pkginclude_HEADERS): Add cord_pos.h, ec.h entries.

9 years agoFix missing msvc_dbg.h in dist_noinst_HEADERS (Automake)
Ivan Maidanski [Tue, 21 Oct 2014 06:31:11 +0000 (10:31 +0400)]
Fix missing msvc_dbg.h in dist_noinst_HEADERS (Automake)

* include/include.am (dist_noinst_HEADERS): Add msvc_dbg.h entry.

9 years agoFix missing error handling of pthread_attr_init/getstacksize
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).

9 years agoFix __alloc_size__ availability detection (Clang)
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).

9 years agoFix missing error handling of pthreads_mutex_init and cond_wait
Ivan Maidanski [Sat, 27 Sep 2014 15:30:06 +0000 (19:30 +0400)]
Fix missing error handling of pthreads_mutex_init and cond_wait

* include/private/darwin_semaphore.h (sem_init): Destroy sem->mutex if
sem->cond initialization failed.
* include/private/darwin_semaphore.h (sem_post): Ignore
pthread_mutex_unlock result in case of pthread_cond_signal.
* include/private/darwin_semaphore.h (sem_wait): Unlock mutex and
return error (-1) if pthread_cond_wait failed.
* include/private/darwin_semaphore.h (sem_init): If pshared then
return -1 (with the appropriate errno code set) instead of ABORT.
* include/private/darwin_semaphore.h (sem_init, sem_post, sem_wait):
Treat non-zero value returned by pthread functions as error (instead
of only negative values).
* include/private/darwin_semaphore.h (sem_init, sem_post, sem_wait):
Reformat code.
* misc.c (GC_init): Abort (with the appropriate message) if
pthread_mutex[attr]_init failed (SN_TARGET_PS3 case only).
* specific.c (GC_key_create_inner): If pthread_mutex_init failed then
return its error code.

9 years agoWorkaround 'unknown attribute __alloc_size__' warning for Clang 3.5 (trunk)
Ivan Maidanski [Wed, 24 Sep 2014 18:47:59 +0000 (22:47 +0400)]
Workaround 'unknown attribute __alloc_size__' warning for Clang 3.5 (trunk)

* include/gc_config_macros.h (GC_ATTR_ALLOC_SIZE): Define to empty if
clang 3.5.0 (workaround "unknown attribute '__alloc_size__' ignored"
warning in clang3.5 (trunk)).

9 years agoFix darwin_stop_world.c broken by 'thread_get_state fix' for other targets
Ivan Maidanski [Tue, 23 Sep 2014 20:04:39 +0000 (00:04 +0400)]
Fix darwin_stop_world.c broken by 'thread_get_state fix' for other targets

* darwin_stop_world.c: Include Darwin-specific headers (sys/sysctl.h,
mach/machine.h) only if GC_DARWIN_THREADS.

9 years agoAlso enable the TSX workaround for i386 (Linux)
Jan Alexander Steffens (heftig) [Thu, 11 Sep 2014 21:06:46 +0000 (23:06 +0200)]
Also enable the TSX workaround for i386 (Linux)

* include/private/gcconfig.h (GLIBC_2_19_TSX_BUG): Define for
LINUX/I386 (if __GLIBC__).

9 years agoUpdate AUTHORS file
Ivan Maidanski [Tue, 23 Sep 2014 19:42:17 +0000 (23:42 +0400)]
Update AUTHORS file

9 years agoRelax mark_mutex attribute needed to disable elision (Linux/x64)
Jan Alexander Steffens (heftig) [Thu, 11 Sep 2014 21:01:16 +0000 (23:01 +0200)]
Relax mark_mutex attribute needed to disable elision (Linux/x64)

* pthread_support.c (setup_mark_lock): Pass PTHREAD_MUTEX_NORMAL
(instead of PTHREAD_MUTEX_ERRORCHECK) to pthread_mutexattr_settype
(actually, any valid settype call disables lock elision in glibc 2.19).

9 years agoFix setup_mark_lock missing prototype
Ivan Maidanski [Tue, 23 Sep 2014 19:20:08 +0000 (23:20 +0400)]
Fix setup_mark_lock missing prototype
(and do not call it if no parallel marker)

* include/private/pthread_support.h (GC_setup_mark_lock): Remove
prototype.
* misc.c (GC_init): Remove GC_setup_mark_lock call (move it to
GC_thr_init).
* pthread_support.c (setup_mark_lock): Rename from GC_setup_mark_lock;
add prototype (only if PARALLEL_MARK).
* pthread_support.c (GC_thr_init): Call setup_mark_lock() unless
available_markers_m1 is 0.

9 years agoUse ARM_UNIFIED_THREAD_STATE in the call to thread_get_state() on iOS7 64-bit
Niklas Therning [Mon, 22 Sep 2014 12:56:18 +0000 (14:56 +0200)]
Use ARM_UNIFIED_THREAD_STATE in the call to thread_get_state() on iOS7 64-bit
and up and iOS8 32-bit and up.

9 years agoMerge pull request #52 from robovm/thread_get_state_stack_corruption_on_ios_64bit
Ivan Maidanski [Sat, 20 Sep 2014 18:12:09 +0000 (22:12 +0400)]
Merge pull request #52 from robovm/thread_get_state_stack_corruption_on_ios_64bit

Use ARM_THREAD_STATE32 as flavor in call to thread_get_state (Darwin/AArch64)

9 years agoUse the ARM_THREAD_STATE32 flavor in the call to thread_get_state() when
Niklas Therning [Thu, 18 Sep 2014 19:17:40 +0000 (21:17 +0200)]
Use the ARM_THREAD_STATE32 flavor in the call to thread_get_state() when
running on 64-bit iOS 7+. If we don't iOS will assume we pass it an
arm_unified_thread_state_t while we actually pass it an arm_thread_state_t
which is a lot smaller. Without this fix thread_get_state() will corrupt the
stack and the app will crash.

9 years agoModified darwin_stop_world.c to use an arm_unified_thread_state_t struct to
Niklas Therning [Wed, 17 Sep 2014 16:09:55 +0000 (18:09 +0200)]
Modified darwin_stop_world.c to use an arm_unified_thread_state_t struct to
store a thread's state when compiling against the iOS 7/8 SDK. Without this
patch GC_stack_range_for() crashes when running a 32-bit app on iOS 64-bit.
The old code passed an arm_thread_state_t and ARM_THREAD_STATE to
thread_get_state(). ARM_THREAD_STATE is the same as ARM_UNIFIED_THREAD_STATE
on iOS 7/8 and thread_get_state() actually expects an
arm_unified_thread_state_t. On iOS 32-bit it looks like thread_get_state()
only touches the first bytes corresponding to the size of arm_thread_state_t
so no crash there. On iOS 64-bit however it seems thread_get_state() writes to
the full arm_unified_thread_state_t which meant it would overflow the stack
allocated struct passed to it and mess up other values on the stack leading to
a crash later on.

9 years agoFix and code refactoring of lock elision workaround (Linux/x64)
Ivan Maidanski [Sat, 19 Jul 2014 08:52:54 +0000 (12:52 +0400)]
Fix and code refactoring of lock elision workaround (Linux/x64)

* configure.ac (HAVE_LIBC_VERSION_H, HAVE_GNU_GET_LIBC_VERSION): Remove
(revert change in previous commit).
* include/private/gcconfig.h (GLIBC_2_19_TSX_BUG): New macro defined
for Linux/x86_64 (if Glibc used) to workaround a bug in Glibc lock
elision implementation.
* pthread_support.c: Move include of gnu/libc-version.h to gcconfig.h
(used to check whether lock elision workaround needed).
* misc.c (GC_init): Reformat code.
* pthread_support.c (mark_mutex): Initialize (to
PTHREAD_MUTEX_INITIALIZER) even lock elision workaround is needed
(revert change in previous commit).
* pthread_support.c (parse_version): New static function (defined only
if GLIBC_2_19_TSX_BUG).
* pthread_support.c (GC_setup_mark_lock): Use parse_version to check
target Glibc version properly; do not reinitialize mutex unless
workaround needed; call ABORT (with the appropriate message) in case
of a failure in pthread_mutexattr_init/settype, pthread_mutex_init.

9 years agoWorkaround Linux NTPL lock elision bug.
Paul Bone [Wed, 25 Jun 2014 01:17:50 +0000 (11:17 +1000)]
Workaround Linux NTPL lock elision bug.

glibc 2.19 on Linux x86-64 platforms includes support for lock elision,
by using Intel's TSX support when it is available.  Without modifying an
application this converts suitable critical sections that use mutex into
transactional memory critical sections.  See http://lwn.net/Articles/534758/
If a problem occurs that means that transactional memory can't be used, such
as a system call or buffer overflow, the pthreads implementation will catch
this error and retry the critical section using a normal mutex.

I noticed that since upgrading glibc that programs using Boehm GC crash, one
of these crashes was an assertion that the owner field of a mutex was
invalid.  The assertion was generated by the pthreads implementation.
I believe that there is a bug in glibc that when a mutex cannot be used
safely for transactions that some series of events causes it's owner field
to be set incorrectly (or cleared when it shouldn't be).

I've found that I can work around this problem by having Boehm GC use an
error checking mutex, which I believe doesn't use lock elision and in my
testing doesn't crash.

XXX: This work-around mostly works except for linking the feature detection
in configure.ac to the conditional compilation in pthread_support.c as there
isn't an obvious way to make it work for automake and Makefile.direct.
Could I have some help updating the build system please?

include/private/pthread_support.h:
pthread_support.c:
    Define GC_setup_mark_lock()  This procedure creates the lock specifying a
    pthread_mutexattr_t structure.  This is used to disable lock elision on
    Linux with glibc 2.19 or greater.

configure.ac:
    If we're using Linux then check for the gnu extensions required to
    identify the version of glibc at runtime.

misc.c:
    Call GC_setup_mark_lock() when initialising the collector.

9 years agoFix getcontext usage on OpenRISC/or1k
Manuel A. Fernandez Montecelo [Sat, 23 Aug 2014 09:19:43 +0000 (13:19 +0400)]
Fix getcontext usage on OpenRISC/or1k

* include/private/gcconfig.h (NO_GETCONTEXT): Do not use getcontext(2)
on OpenRISC 1000 (or1k) as it is not implemented yet.

9 years agoUpdate AUTHORS file (update email for Peter Wang)
Ivan Maidanski [Sat, 23 Aug 2014 08:58:13 +0000 (12:58 +0400)]
Update AUTHORS file (update email for Peter Wang)

9 years agoSupport winpthreads
Peter Wang [Sat, 23 Aug 2014 08:48:37 +0000 (12:48 +0400)]
Support winpthreads

Winpthreads is a different pthread implementation for MinGW-w64.
This patch redefines GC_WIN32_PTHREADS to mean either pthreads-win32
or winpthreads.

* configure.ac (GC_WIN32_PTHREADS): Improve description to cover
"winpthreads" library.
* doc/README.macros (GC_WIN32_PTHREADS): Likewise.
* doc/README.win32: Likewise.
* include/gc_config_macros.h (GC_WIN32_THREADS): Mention "winpthreads"
library in comment.
* win32_threads.c (GC_pthread_join): Likewise.
* include/private/gc_locks.h (NUMERIC_THREAD_ID, THREAD_EQUAL,
NUMERIC_THREAD_ID_UNIQUE): Define to support winpthreads properly (if
GC_WIN32_PTHREADS).
* win32_threads.c (GC_PTHREAD_PTRVAL): Likewise.

9 years agoFix assertion on mark_lock_holder for non-unique NUMERIC_THREAD_ID
Ivan Maidanski [Fri, 22 Aug 2014 10:54:53 +0000 (14:54 +0400)]
Fix assertion on mark_lock_holder for non-unique NUMERIC_THREAD_ID

* pthread_support.c (GC_acquire_mark_lock): Avoid assertion that
GC_mark_lock_holder != NUMERIC_THREAD_ID(pthread_self()) unless
NUMERIC_THREAD_ID_UNIQUE.
* win32_threads.c (GC_acquire_mark_lock): Likewise.
* win32_threads.c (NUMERIC_THREAD_ID): Add comment.

9 years agoFix pthreads-win32 name in comments and documentation
Ivan Maidanski [Sun, 10 Aug 2014 07:47:09 +0000 (11:47 +0400)]
Fix pthreads-win32 name in comments and documentation

* configure.ac (GC_WIN32_PTHREADS): Fix pthreads-win32 name.
* doc/README.macros (GC_WIN32_PTHREADS): Likewise.
* doc/README.win32: Likewise.
* include/gc.h (GC_WIN32_THREADS): Likewise.
* include/gc_config_macros.h (GC_WIN32_PTHREADS): Likewise.
* include/private/gc_locks.h (NUMERIC_THREAD_ID): Likewise.
* win32_threads.c (GC_pthread_join): Likewise.
* doc/README.win32: Add information how to build for Win32 with
pthreads-win32 using configure.
* include/private/gc_locks.h (NUMERIC_THREAD_ID): Adjust comment
(capitalize 1st word of a sentence, add dot at sentence end).
* win32_threads.c (GC_pthread_join): Join adjacent GC_WIN32_PTHREADS
checks; refine comment about pthreads-win32 id.

10 years agoUpdate AUTHORS file
Ivan Maidanski [Sat, 2 Aug 2014 09:16:54 +0000 (13:16 +0400)]
Update AUTHORS file