summaryrefslogtreecommitdiff
path: root/include/gc.h
Commit message (Collapse)AuthorAgeFilesLines
* Avoid potential race when accessing size_map tableHans Boehm2018-02-261-1/+3
| | | | | | | | | | | | | | | | | | There is again a data race between GC_extend_size_map and GC_size_map[] readers, though it is again not likely to fail in practice. It is feasible to just move all of the GC_size_map accesses under the lock, and this does not look to incur a substantial penalty. * gcj_mlc.c (GC_gcj_malloc, GC_gcj_malloc_ignore_off_page): Move lg=GC_size_map[lb] to be right after LOCK() instead of preceding it. * malloc.c (GC_malloc_kind_global, GC_generic_malloc_uncollectable): Likewise. * typd_mlc.c (GC_malloc_explicitly_typed_ignore_off_page): Likewise. * include/gc.h (GC_get_size_map_at): Update comment to note that the client should use synchronization when calling the function. * include/private/gc_priv.h (_GC_arrays._size_map): Add comment about synchronization.
* New API function (get_size_map_at) to get content of size_map tableIvan Maidanski2018-02-141-0/+6
| | | | | | | | * include/gc.h (GC_get_size_map_at): Declare public function. * misc.c [!GC_GET_HEAP_USAGE_NOT_NEEDED] (GC_get_size_map_at): Implement function * tests/test.c [!GC_GET_HEAP_USAGE_NOT_NEEDED] (check_heap_stats): Add dummy testing of GC_get_size_map_at.
* Put variable/function declarations into extern 'C' in headersJay Krell2018-02-081-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Issue #201 (bdwgc). Extern "C" should be only around declarations, not includes. In particular, do not include 3rd-party headers (as well as our own files as they could include others). * include/gc.h [GC_PTHREADS]: Do not wrap include gc_pthread_redirects.h into extern "C" block. * include/gc_disclaim.h: Wrap variable and function declarations (but not included headers). * include/gc_inline.h: Likewise. * include/gc_pthread_redirects.h [!GC_PTHREAD_REDIRECTS_ONLY]: Likewise. * include/private/darwin_semaphore.h: Likewise. * include/private/darwin_stop_world.h: Likewise. * include/private/dbg_mlc.h: Likewise. * include/private/gc_atomic_ops.h [GC_BUILTIN_ATOMIC]: Likewise. * include/private/gc_hdrs.h: Likewise. * include/private/gc_locks.h [THREADS]: Likewise. * include/private/gc_pmark.h: Likewise. * include/private/gc_priv.h: Likewise. * include/private/gcconfig.h: Likewise. * include/private/pthread_stop_world.h: Likewise. * include/private/pthread_support.h [GC_PTHREADS && !GC_WIN32_THREADS]: Likewise. * include/private/specific.h: Likewise. * include/private/thread_local_alloc.h [THREAD_LOCAL_ALLOC]: Likewise.
* Avoid SIGSEGV during GC_INIT on some Android devicesJonathan Chambers2018-02-011-1/+5
| | | | | | | | | | (part of commit 9379c66 from Unity-Technologies/bdwgc) Issue #173 (bdwgc). * include/gc.h [(HOST_ANDROID || __ANDROID__) && !GC_NOT_DLL] (GC_INIT_CONF_ROOTS): Define to empty unless IGNORE_DYNAMIC_LOADING; add comment.
* Use HOST_ANDROID define instead of PLATFORM_ANDROIDZoltan Varga2018-01-241-1/+1
| | | | | | | | | | | | | | | | (a cherry-pick of commit 5d819c8 from 'mono_libgc') * doc/README.macros (PLATFORM_ANDROID): Rename to HOST_ANDROID. * dyn_load.c: Rename PLATFORM_ANDROID to HOST_ANDROID. * include/gc.h: Likewise. * include/gc_config_macros.h: Likewise. * include/private/gcconfig.h: Likewise. * include/private/thread_local_alloc.h: Likewise. * os_dep.c: Likewise. * pthread_support.c: Likewise. * tests/initsecondarythread.c: Likewise. * tests/test.c: Likewise. * tools/threadlibs.c: Likewise.
* Add note of set_free_space_divisor, set_warn_proc ABI change after gc-7.1Ivan Maidanski2018-01-171-1/+4
| | | | | | | | | | | | Issue #197 (bdwgc). GC_set_free_space_divisor() and GC_set_warn_proc() used to return some value. But starting from version 7.1alpha2, these API functions do not return any value. * include/gc.h (GC_set_free_space_divisor, GC_set_warn_proc): Add comment that the setter used to returned the old value in gc-7.1 (and previous versions).
* New field (expl_freed_bytes_since_gc) in public prof_stats_sIvan Maidanski2018-01-121-0/+3
| | | | | | | * include/gc.h (GC_prof_stats_s): Add expl_freed_bytes_since_gc field (to the end of the structure). * misc.c [!GC_GET_HEAP_USAGE_NOT_NEEDED] (fill_prof_stats): Store GC_bytes_freed value to pstats->expl_freed_bytes_since_gc.
* New API function (get_expl_freed_bytes_since_gc)Ivan Maidanski2018-01-121-0/+4
| | | | | | | | | | Note: this function could be used in test_cpp to check that the proper operator delete is called. * include/gc.h (GC_get_expl_freed_bytes_since_gc): New function prototype. * mallocx.c (GC_get_expl_freed_bytes_since_gc): New function definition (which returns GC_bytes_freed).
* Add basic calculation of the total full-collection timePaul Bone2017-11-101-0/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Issue #139 (bdwgc). New API functions: GC_start_performance_measurement, GC_get_full_gc_total_time. This patch is based on code originally written by Zoltan Somogyi on 2008-03-18. * alloc.c [!NO_CLOCK] (full_gc_total_time, measure_performance): New static variable definition; add comment. * alloc.c [!NO_CLOCK] (GC_start_performance_measurement, GC_get_full_gc_total_time): New API function definition. * alloc.c [!NO_CLOCK] (GC_try_to_collect_inner): Declare start_time_valid local variable; set start_time_valid to true if GET_TIME(start_time) is called; call GET_TIME(start_time) also if measure_performance; declare time_diff local variable (used to store the result of MS_TIME_DIFF()); GET_TIME(current_time) is called only if start_time_valid; update full_gc_total_time if measure_performance. * include/gc.h (GC_start_performance_measurement, GC_get_full_gc_total_time): New API function declaration. * tests/test.c (INIT_PERF_MEASUREMENT): New macro. * tests/test.c (GC_COND_INIT): Call INIT_PERF_MEASUREMENT. * tests/test.c [!NO_CLOCK] (check_heap_stats): Call GC_get_full_gc_total_time() and print the total time of full collections.
* Refine should_invoke_finalizers documentationIvan Maidanski2017-10-181-0/+1
| | | | | * include/gc.h (GC_should_invoke_finalizers): Add comment that it is not synchronized.
* New API function (GC_is_init_called) to check if BDWGC is initializedIvan Maidanski2017-10-161-0/+4
| | | | | | | | Issue #186 (bdwgc). * include/gc.h (GC_is_init_called): New API function declaration. * misc.c (GC_is_init_called): New API function definition. * tests/test.c (check_heap_stats): Add a test that GC is initialized.
* Refine collect_a_little documentation (better explain when 0 is returned)Ivan Maidanski2017-08-041-1/+2
| | | | | | Issue #64 (bdwgc). * include/gc.h (GC_collect_a_little): Refine comment.
* New API function (GC_is_incremental_mode)Ivan Maidanski2017-07-211-1/+5
| | | | | | | | | | | * alloc.c (GC_is_incremental_mode): New public function definition. * include/gc.h (GC_full_freq): Update comment. * include/gc.h (GC_is_incremental_mode): New public function declaration. * tests/test.c [!GC_WIN32_THREADS && !GC_PTHREADS] (main): Print "Switched to incremental mode" and friend messages only if GC_is_incremental_mode(). * tests/test.c [!GC_PTHREADS] (main): Likewise.
* Public API (GC_deinit) to allow Win32 critical sections deletionTautvydas Zilys2017-07-201-0/+5
| | | | | | | | | | | | | | | | | | Public GC_deinit allows the clients to avoid a leak of two critical sections on GC shutdown. * include/gc.h (GC_deinit): New public function declaration. * include/private/gc_priv.h [MSWIN32 || MSWINCE] (GC_deinit): Remove. * misc.c (GC_deinit): Make it public; define it unconditionally; call DeleteCriticalSection(GC_allocate_ml) if GC_is_initialized; set GC_is_initialized to false. DeleteCriticalSection(GC_allocate_ml) * tests/test.c [!GC_WIN32_THREADS && !GC_PTHREADS && CPPCHECK] (main): Add UNTESTED(GC_deinit). * win32_threads.c [GC_WINMAIN_REDIRECT && MSWINCE] (WinMain): Do not call DeleteCriticalSection(GC_allocate_ml). * win32_threads.c [!GC_NO_THREADS_DISCOVERY && !GC_PTHREADS] (GC_DllMain): Likewise.
* Fix SIGSEGV in GC_is_marked when gc_cleanup is used in leak-finding modeIvan Maidanski2017-07-141-3/+7
| | | | | | | | | | | | | | | Issue #162 (bdwgc). Now finalizers and disappearing links registration is a no-op in case of the leak-finding mode. * finalize.c (GC_register_disappearing_link_inner): Do nothing (return GC_UNIMPLEMENTED) if GC_find_leak. * finalize.c (GC_register_finalizer_inner): Do nothing if GC_find_leak. * include/gc.h (GC_find_leak): More verbose comment. * include/gc.h (GC_debug_register_finalizer, GC_general_register_disappearing_link): Document the case of GC_find_leak.
* Fix various typos in comments and printed messagesKlemens Zwischenbrugger2017-02-211-1/+1
| | | | | | | | | | | | | | | | This patch contains some spelling fixes (just in comments and C strings passed to printf) as found by bot (https://github.com/ka7/misspell_fixer). * SMakefile.amiga: Fix typo in comment ("don't"). * WCC_MAKEFILE (SYSTEM): Fix typo in comment ("uncomment"). * configure.ac [!GCC] (gc_cflags): Fix typo in comment ("actually"). * configure.ac (NO_CLOCK): Fix typo in comment ("targeting"). * doc/README.amiga: Fix typos in documentation ("there's", "compliant", "documentation"). * extra/AmigaOS.c [GC_AMIGA_PRINTSTATS] (GC_amiga_free_all_mem): Fix typos in printed messages ("succeeded", "succeeding"). * include/gc.h (GC_get_heap_size): Fix typo in comment ("below"). * tools/setjmp_t.c (main): Fix typo in printed message ("won't").
* New API function (GC_dump_named) to produce named dumpsPaul Bone2017-01-141-1/+5
| | | | | | | | | | | | | | | gc_dump() now prints a label (name) for the dump, by default the name is created using the current garbage collection number (GC_get_gc_no). An arbitrary name could be provided using GC_dump_named() instead. The naming makes it easier to work with multiple dumps in a single log. * include/gc.h (GC_dump_named): New public API function declaration. * include/gc.h (GC_dump): Update comment (the current collection number is printed at the beginning of the dump). * misc.c [!NO_DEBUGGING] (GC_dump): Just call GC_dump_named(NULL). * misc.c [!NO_DEBUGGING] (GC_dump_named): Move code from GC_dump; start dump with the "GC Dump" followed by either the name specified or the current collection number (if name is null).
* Export GC_dump_finalization/regions()Ivan Maidanski2016-10-291-0/+9
| | | | | | | | | | Note: these 2 functions are not used by GC itself. * allchblk.c [!NO_DEBUGGING] (GC_dump_regions): Turn into a public definition (add GC_API+GC_CALL). * finalize.c [!NO_DEBUGGING] (GC_dump_finalization): Likewise. * include/gc.h (GC_dump_regions, GC_dump_finalization): New public API prototype.
* Workaround 'value of macro unknown' cppcheck info messagesIvan Maidanski2016-10-241-9/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The messages are eliminated for the macros: __int64, _SIGRTMIN, ARM_THREAD_STATE32, ARM_UNIFIED_THREAD_STATE, FIXUP_POINTER, GC_COLLECT_AT_MALLOC, GC_FREE_SPACE_DIVISOR, GC_FULL_FREQ, GC_INITIAL_HEAP_SIZE, GC_MAX_RETRIES, GC_MAXIMUM_HEAP_SIZE, GC_MIN_MARKERS, GC_SIG_SUSPEND, GC_SIG_THR_RESTART, GC_TIME_LIMIT, HEURISTIC2_LIMIT, MAP_ANONYMOUS, RTLD_DI_LINKMAP, SAVE_CALL_COUNT, SIZE_MAX. * alloc.c (GC_full_freq, GC_free_space_divisor, GC_time_limit): Define to default immediate value if CPPCHECK. * darwin_stop_world.c [ARM32 && ARM_THREAD_STATE32] (GC_ARM_UNIFIED_THREAD_STATE): New macro (defined to ARM_UNIFIED_THREAD_STATE unless CPPCHECK). * darwin_stop_world.c [ARM32 && ARM_THREAD_STATE32] (GC_stack_range_for): Use GC_ARM_UNIFIED_THREAD_STATE; do not use value of ARM_THREAD_STATE32 if CPPCHECK. * dyn_load.c [!USE_PROC_FOR_LIBRARIES] (GC_RTLD_DI_LINKMAP): New macro (defined to RTLD_DI_LINKMAP unless CPPCHECK). * dyn_load.c [!USE_PROC_FOR_LIBRARIES] (GC_FirstDLOpenedLinkMap): Use GC_RTLD_DI_LINKMAP. * include/gc.h (GC_word, GC_signed_word): Do not define to __int64 if CPPCHECK. * include/gc.h (GC_INIT_CONF_MAX_RETRIES, GC_INIT_CONF_FREE_SPACE_DIVISOR, GC_INIT_CONF_FULL_FREQ, GC_INIT_CONF_TIME_LIMIT, GC_INIT_CONF_SUSPEND_SIGNAL, GC_INIT_CONF_THR_RESTART_SIGNAL, GC_MAXIMUM_HEAP_SIZE, GC_INITIAL_HEAP_SIZE): Define to empty if CPPCHECK. * include/private/gc_priv.h [SIZE_MAX] (GC_SIZE_MAX): Do not define to SIZE_MAX if CPPCHECK. * include/private/gc_priv.h [DARWIN && ARM32 && ARM_UNIFIED_THREAD_STATE] (GC_MACH_THREAD_STATE): Do not define to ARM_UNIFIED_THREAD_STATE if CPPCHECK. * include/private/gc_priv.h [GC_PTHREADS && _SIGRTMIN] (SIG_SUSPEND): Do not define to _SIGRTMIN if CPPCHECK. * pthread_stop_world.c [!SIG_THR_RESTART && _SIGRTMIN] (SIG_THR_RESTART): Likewise. * include/private/gcconfig.h [SAVE_CALL_CHAIN && SAVE_CALL_COUNT] (NFRAMES): Define to immediate value (do not use value of SAVE_CALL_COUNT) if CPPCHECK. * include/private/gcconfig.h [!FIXUP_POINTER && POINTER_MASK] (FIXUP_POINTER): Define to a sample expression (not using values of POINTER_MASK and POINTER_SHIFT) if CPPCHECK. * malloc.c [GC_COLLECT_AT_MALLOC] (GC_dbg_collect_at_malloc_min_lb): Define to sample value (not using value of GC_COLLECT_AT_MALLOC) if CPPCHECK. * misc.c [GC_INITIAL_HEAP_SIZE] (GC_init): Define to default immediate value if CPPCHECK. * os_dep.c [!BEOS && !OS2 && !SWIN32 && !GC_OPENBSD_THREADS && !STACKBOTTOM && HEURISTIC2_LIMIT] (GC_get_main_stack_base): Do not use value of HEURISTIC2_LIMIT if CPPCHECK. * os_dep.c [USE_MMAP_ANON && MAP_ANONYMOUS] (OPT_MAP_ANON): Do not use value of MAP_ANONYMOUS if CPPCHECK. * pthread_stop_world.c [GC_ENABLE_SUSPEND_THREAD && !GC_TIME_LIMIT] (GC_TIME_LIMIT): Do not define. * pthread_stop_world.c [GC_ENABLE_SUSPEND_THREAD] (GC_brief_async_signal_safe_sleep): Do not use value of GC_TIME_LIMIT if CPPCHECK. * pthread_support.c [PARALLEL_MARK && GC_MIN_MARKERS] (GC_thr_init): Do not use value of GC_MIN_MARKERS if CPPCHECK. * win32_threads.c [PARALLEL_MARK && GC_MIN_MARKERS] (GC_thr_init): Likewise. * tests/test.c [GC_DEBUG && SAVE_CALL_CHAIN && SAVE_CALL_COUNT] (check_heap_stats): Use NFRAMES instead of SAVE_CALL_COUNT (i.e. do not use value of SAVE_CALL_COUNT).
* Workaround 'value of WINAPI unknown' cppcheck info messagesIvan Maidanski2016-10-221-5/+12
| | | | | | | | | * include/gc.h [GC_WIN32_THREADS && WINAPI && !CPPCHECK] (GC_WINDOWS_H_INCLUDED): New macro. * include/gc.h [GC_WIN32_THREADS] (GC_WINDOWS_H_INCLUDED): Define also if windows.h included. * include/gc.h [GC_WIN32_THREADS]: Replace "#ifdef WINAPI" with "#ifdef GC_WINDOWS_H_INCLUDED".
* Replace (fix) 'objs' acronym in comments with 'objects wordIvan Maidanski2016-07-011-1/+1
| | | | | | | | | | | * include/gc.h (GC_PROTECTS_POINTER_HEAP): Replace "objs" word to "objects" in comment. * include/private/gc_priv.h (GC_arrays._aobjfreelist, GC_arrays._uobjfreelist, GC_arrays._auobjfreelist, GC_aobjfreelist): Likewise. * mark.c (INITIAL_MARK_STACK_SIZE): Likewise. * include/private/gc_priv.h (GC_arrays._uobjfreelist): Add missing dot to delimit the end of a sentence in comment.
* Fix GC_REALLOC to call GC_FREE if new size is zero and pointer is non-NULLIvan Maidanski2016-04-051-1/+14
| | | | | | | | | | | * dbg_mlc.c (GC_debug_realloc): Call GC_debug_free (and return NULL) if lb is zero and p is non-NULL. * extra/AmigaOS.c (GC_amiga_realloc): Do not retry and do not call WARN if new_size_in_bytes is zero. * include/gc.h (GC_realloc): Refine comment (better document the cases of NULL and/or zero arguments). * mallocx.c (GC_realloc): Call GC_free (skip it if IGNORE_FREE) and return NULL if lb is zero and p is non-NULL.
* Fix Cygwin64 buildYuki Okumura2016-02-031-5/+15
| | | | | | | | | | On x86_64, Cygwin symbols do not have leading underscore anymore, so an additional underscore is needed on linker-generated symbols access from C. * include/gc.h (GC_DATASTART, GC_DATAEND): Prefix _data_start__, _bss_start__, _data_end__ and _bss_end__ with an extra underscore if __x86_64__ (only if __CYGWIN__); reformat code.
* Document GC_register_my_thread returned valueIvan Maidanski2015-11-111-0/+1
| | | | | * include/gc.h (GC_register_my_thread): Refine comment (about returned value).
* Workaround invalid '_end' symbol on Android clang 3.5+Ivan Maidanski2015-10-231-13/+19
| | | | | | | | | | | * include/gc.h (GC_INIT_CONF_ROOTS): Handle Android clang (3.5-3.6) case when "_end" symbol has incorrect address but "__end__" is defined (by bfd linker only); declare "__end__" symbol as weak. * include/private/gcconfig.h (DATAEND): Redefine for Android/clang; define __end__ as weak symbol. * os_dep.c (_end): Remove declaration (declared in gcconfig.h). * os_dep.c (GC_init_linux_data_start): Define new local variable (data_end); set it to DATAEND; use it instead of _end.
* Code refactoring of toggle-ref supportIvan Maidanski2015-08-281-4/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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.
* Fix out-of-memory handling in GC_toggleref_addIvan Maidanski2015-08-261-1/+1
| | | | | | | | | | | * 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).
* Add toggle-ref supportRodrigo Kumpera2015-08-261-0/+5
| | | | | | | | | | | | | | | | (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.
* Make heap walker accept callbackIvan Maidanski2015-08-051-3/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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.
* Add support for enumerating the reachable objects in the heapPeter Wang2015-07-311-0/+3
| | | | | | | | | | | | | | (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.
* Code refactoring of 'alt-stack registration support'Ivan Maidanski2015-07-271-5/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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.
* Add alt-stack registration supportZoltan Varga2015-07-241-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | (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).
* Code refactoring of 'finalization extension API'Ivan Maidanski2015-07-191-2/+8
| | | | | | | | | | | | | | | | | | * 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.
* Implement the finalization extension APIRodrigo Kumpera2015-07-171-0/+3
| | | | | | | | | (Apply commit c429e9f from 'mono_libgc' branch.) Conflicts: finalize.c include/gc.h
* Code refactoring, add test and document GC_get_memory_useIvan Maidanski2015-07-101-1/+3
| | | | | | | | | | | | | * 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).
* Add API function to calculate total memory in use by all GC blocksEli Barzilay2015-07-091-0/+2
| | | | | | | (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.
* Refine GC_free_space_divisor comment regarding its initial valueIvan Maidanski2015-07-061-1/+1
| | | | | | * 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).
* Add profiling callback events to indicate start/end of reclaim phaseIvan Maidanski2015-06-231-0/+2
| | | | | | * 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.
* Standalone profiling callback for threads suspend/resumeIvan Maidanski2015-06-231-4/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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).
* Rename GCEventKind to GC_EventType (profiling event type)Ivan Maidanski2015-06-201-2/+2
| | | | | * include/gc.h (GCEventKind, GC_on_collection_event_proc): Rename GCEventKind to GC_EventType.
* Rename and reorder profiling callback events (to match Mono GC API)Ivan Maidanski2015-06-201-9/+8
| | | | | | | | | | | * 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.
* Merge branch 'profiling-callbacks'Ivan Maidanski2015-05-171-0/+22
|\
| * Code refactoring of "event callbacks" functionalityIvan Maidanski2015-05-171-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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.
| * Implement event callbacks to be used to profile the collectorLucas Meijer2014-07-011-0/+22
| |
* | Enable gc.h inclusion by client without implicit include windows.h (Win32)Ivan Maidanski2015-05-111-16/+43
| | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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.
* | Do not pass VC-specific 'pragma message' in gc.h to other compilers (Win64)Ivan Maidanski2015-05-111-5/+5
| | | | | | | | | | | | | | | | | | | | * 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
* | debug helper for preproc symbol mix upJohannes Totz2015-05-111-0/+5
| | | | | | | | | | | | | | | | i got bitten by it... for some reason _WIN64 is not defined all the time. glitch in vc9? Conflicts: include/gc.h
* | Fix pthreads-win32 name in comments and documentationIvan Maidanski2014-08-101-1/+1
|/ | | | | | | | | | | | | | | | * 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.
* Fix (enable) Cygwin-64 buildBernd Edlinger2014-05-231-1/+1
| | | | | | | | | | * include/gc.h (GC_DATASTART, GC_DATAEND): Define for Cygwin-64. * include/private/gcconfig.h (X86_64): Likewise. * include/private/gcconfig.h (OS_TYPE, DATASTART, DATAEND, STACK_GRAN, NEED_FIND_LIMIT, USE_MMAP_ANON): Define for Cygwin-64 (code copied from Cygwin-32 block). * os_dep.c (GC_get_stack_base): Get the stack base for Cygwin-64 (implementation based on NtCurrentTeb call).
* Fix 'e.g.' typos in comments and documentationIvan Maidanski2014-02-011-1/+1
| | | | | | | | | | | * doc/README.cmake: Fix typo (e.g.). * doc/README.solaris2: Likewise. * doc/README.solaris2: Likewise. * doc/README.win32: Likewise. * include/gc.h (GC_register_my_thread): Fix typo in a comment (e.g.). * include/leak_detector.h: Likewise. * misc.c (GC_VSNPRINTF): Likewise. * pthread_stop_world.c (GC_unblock_gc_signals): Likewise.