/* * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. * Copyright 1996-1999 by Silicon Graphics. All rights reserved. * Copyright 1999 by Hewlett-Packard Company. All rights reserved. * Copyright (C) 2007 Free Software Foundation, Inc * Copyright (c) 2000-2011 by Hewlett-Packard Development Company. * Copyright (c) 2009-2020 Ivan Maidanski * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ #ifndef GC_H #define GC_H #if (defined(WIN64)&&!defined(_WIN64))&&defined(_MSC_VER) #pragma message("Warning:Expecting _WIN64 for x64 targets!Notice the leading underscore!") #endif #if defined(GC_H) #define GC_TMP_VERSION_MAJOR 8 #define GC_TMP_VERSION_MINOR 1 #define GC_TMP_VERSION_MICRO 0 #ifdef GC_VERSION_MAJOR #if GC_TMP_VERSION_MAJOR!=GC_VERSION_MAJOR||GC_TMP_VERSION_MINOR!=GC_VERSION_MINOR||GC_TMP_VERSION_MICRO!=GC_VERSION_MICRO #error Inconsistent version info. Check README.md,include/gc_version.h and configure.ac. #endif #else #define GC_VERSION_MAJOR GC_TMP_VERSION_MAJOR #define GC_VERSION_MINOR GC_TMP_VERSION_MINOR #define GC_VERSION_MICRO GC_TMP_VERSION_MICRO #endif #endif #if defined(GC_H) #if defined(__GNUC__)&&defined(__GNUC_MINOR__) #define GC_GNUC_PREREQ(major,minor)((__GNUC__<<16)+__GNUC_MINOR__>=((major)<<16)+(minor)) #else #define GC_GNUC_PREREQ(major,minor)0 #endif #if defined(SOLARIS_THREADS)||defined(_SOLARIS_THREADS)||defined(_SOLARIS_PTHREADS)||defined(GC_SOLARIS_PTHREADS) #ifndef GC_SOLARIS_THREADS #define GC_SOLARIS_THREADS #endif #endif #if defined(IRIX_THREADS) #define GC_IRIX_THREADS #endif #if defined(DGUX_THREADS)&&!defined(GC_DGUX386_THREADS) #define GC_DGUX386_THREADS #endif #if defined(AIX_THREADS) #define GC_AIX_THREADS #endif #if defined(HPUX_THREADS) #define GC_HPUX_THREADS #endif #if defined(OSF1_THREADS) #define GC_OSF1_THREADS #endif #if defined(LINUX_THREADS) #define GC_LINUX_THREADS #endif #if defined(WIN32_THREADS) #define GC_WIN32_THREADS #endif #if defined(RTEMS_THREADS) #define GC_RTEMS_PTHREADS #endif #if defined(USE_LD_WRAP) #define GC_USE_LD_WRAP #endif #if defined(GC_WIN32_PTHREADS)&&!defined(GC_WIN32_THREADS) #define GC_WIN32_THREADS #endif #if defined(GC_AIX_THREADS)||defined(GC_DARWIN_THREADS)||defined(GC_DGUX386_THREADS)||defined(GC_FREEBSD_THREADS)||defined(GC_HPUX_THREADS)||defined(GC_IRIX_THREADS)||defined(GC_LINUX_THREADS)||defined(GC_NETBSD_THREADS)||defined(GC_OPENBSD_THREADS)||defined(GC_OSF1_THREADS)||defined(GC_SOLARIS_THREADS)||defined(GC_WIN32_THREADS)||defined(GC_RTEMS_PTHREADS) #ifndef GC_THREADS #define GC_THREADS #endif #elif defined(GC_THREADS) #if defined(__linux__) #define GC_LINUX_THREADS #elif defined(__OpenBSD__) #define GC_OPENBSD_THREADS #elif defined(_PA_RISC1_1)||defined(_PA_RISC2_0)||defined(hppa)||defined(__HPPA)||(defined(__ia64)&&defined(_HPUX_SOURCE)) #define GC_HPUX_THREADS #elif defined(__HAIKU__) #define GC_HAIKU_THREADS #elif defined(__DragonFly__)||defined(__FreeBSD_kernel__)||(defined(__FreeBSD__)&&!defined(SN_TARGET_ORBIS)) #define GC_FREEBSD_THREADS #elif defined(__NetBSD__) #define GC_NETBSD_THREADS #elif defined(__alpha)||defined(__alpha__) #define GC_OSF1_THREADS #elif (defined(mips)||defined(__mips)||defined(_mips))&&!(defined(nec_ews)||defined(_nec_ews)||defined(ultrix)||defined(__ultrix)) #define GC_IRIX_THREADS #elif defined(__sparc)||((defined(sun)||defined(__sun))&&(defined(i386)||defined(__i386__)||defined(__amd64)||defined(__amd64__))) #define GC_SOLARIS_THREADS #elif defined(__APPLE__)&&defined(__MACH__) #define GC_DARWIN_THREADS #endif #if defined(DGUX)&&(defined(i386)||defined(__i386__)) #define GC_DGUX386_THREADS #endif #if defined(_AIX) #define GC_AIX_THREADS #endif #if (defined(_WIN32)||defined(_MSC_VER)||defined(__BORLANDC__)||defined(__CYGWIN32__)||defined(__CYGWIN__)||defined(__CEGCC__)||defined(_WIN32_WCE)||defined(__MINGW32__))&&!defined(GC_WIN32_THREADS) #define GC_WIN32_THREADS #endif #if defined(__rtems__)&&(defined(i386)||defined(__i386__)) #define GC_RTEMS_PTHREADS #endif #endif #undef GC_PTHREADS #if (!defined(GC_WIN32_THREADS)||defined(GC_WIN32_PTHREADS)||defined(__CYGWIN32__)||defined(__CYGWIN__))&&defined(GC_THREADS)&&!defined(NN_PLATFORM_CTR)&&!defined(NN_BUILD_TARGET_PLATFORM_NX) #define GC_PTHREADS #endif #if!defined(_PTHREADS)&&defined(GC_NETBSD_THREADS) #define _PTHREADS #endif #if defined(GC_DGUX386_THREADS)&&!defined(_POSIX4A_DRAFT10_SOURCE) #define _POSIX4A_DRAFT10_SOURCE 1 #endif #if!defined(_REENTRANT)&&defined(GC_PTHREADS)&&!defined(GC_WIN32_THREADS) #define _REENTRANT 1 #endif #define __GC #if!defined(_WIN32_WCE)||defined(__GNUC__) #include #if defined(__MINGW32__)&&!defined(_WIN32_WCE) #include #endif #else #include #ifndef _PTRDIFF_T_DEFINED #define _PTRDIFF_T_DEFINED typedef long ptrdiff_t; #endif #endif #if!defined(GC_NOT_DLL)&&!defined(GC_DLL)&&((defined(_DLL)&&!defined(__GNUC__))||(defined(DLL_EXPORT)&&defined(GC_BUILD))) #define GC_DLL #endif #if defined(GC_DLL)&&!defined(GC_API) #if defined(__CEGCC__) #if defined(GC_BUILD) #define GC_API __declspec(dllexport) #else #define GC_API __declspec(dllimport) #endif #elif defined(__MINGW32__) #if defined(__cplusplus)&&defined(GC_BUILD) #define GC_API extern __declspec(dllexport) #elif defined(GC_BUILD)||defined(__MINGW32_DELAY_LOAD__) #define GC_API __declspec(dllexport) #else #define GC_API extern __declspec(dllimport) #endif #elif defined(_MSC_VER)||defined(__DMC__)||defined(__BORLANDC__)||defined(__CYGWIN__) #ifdef GC_BUILD #define GC_API extern __declspec(dllexport) #else #define GC_API __declspec(dllimport) #endif #elif defined(__WATCOMC__) #ifdef GC_BUILD #define GC_API extern __declspec(dllexport) #else #define GC_API extern __declspec(dllimport) #endif #elif defined(__SYMBIAN32__) #ifdef GC_BUILD #define GC_API extern EXPORT_C #else #define GC_API extern IMPORT_C #endif #elif defined(__GNUC__) #if defined(GC_BUILD)&&!defined(GC_NO_VISIBILITY)&&(GC_GNUC_PREREQ(4,0)||defined(GC_VISIBILITY_HIDDEN_SET)) #define GC_API extern __attribute__((__visibility__("default"))) #endif #endif #endif #ifndef GC_API #define GC_API extern #endif #ifndef GC_CALL #define GC_CALL #endif #ifndef GC_CALLBACK #define GC_CALLBACK GC_CALL #endif #ifndef GC_ATTR_MALLOC #ifdef GC_OOM_FUNC_RETURNS_ALIAS #define GC_ATTR_MALLOC #elif GC_GNUC_PREREQ(3,1) #define GC_ATTR_MALLOC __attribute__((__malloc__)) #elif defined(_MSC_VER)&&(_MSC_VER>=1900)&&!defined(__EDG__) #define GC_ATTR_MALLOC __declspec(allocator)__declspec(noalias)__declspec(restrict) #elif defined(_MSC_VER)&&_MSC_VER>=1400 #define GC_ATTR_MALLOC __declspec(noalias)__declspec(restrict) #else #define GC_ATTR_MALLOC #endif #endif #ifndef GC_ATTR_ALLOC_SIZE #undef GC_ATTR_CALLOC_SIZE #ifdef __clang__ #if __has_attribute(__alloc_size__) #define GC_ATTR_ALLOC_SIZE(argnum)__attribute__((__alloc_size__(argnum))) #define GC_ATTR_CALLOC_SIZE(n,s)__attribute__((__alloc_size__(n,s))) #else #define GC_ATTR_ALLOC_SIZE(argnum) #endif #elif GC_GNUC_PREREQ(4,3)&&!defined(__ICC) #define GC_ATTR_ALLOC_SIZE(argnum)__attribute__((__alloc_size__(argnum))) #define GC_ATTR_CALLOC_SIZE(n,s)__attribute__((__alloc_size__(n,s))) #else #define GC_ATTR_ALLOC_SIZE(argnum) #endif #endif #ifndef GC_ATTR_CALLOC_SIZE #define GC_ATTR_CALLOC_SIZE(n,s) #endif #ifndef GC_ATTR_NONNULL #if GC_GNUC_PREREQ(4,0) #define GC_ATTR_NONNULL(argnum)__attribute__((__nonnull__(argnum))) #else #define GC_ATTR_NONNULL(argnum) #endif #endif #ifndef GC_ATTR_CONST #if GC_GNUC_PREREQ(4,0) #define GC_ATTR_CONST __attribute__((__const__)) #else #define GC_ATTR_CONST #endif #endif #ifndef GC_ATTR_DEPRECATED #ifdef GC_BUILD #undef GC_ATTR_DEPRECATED #define GC_ATTR_DEPRECATED #elif GC_GNUC_PREREQ(4,0) #define GC_ATTR_DEPRECATED __attribute__((__deprecated__)) #elif defined(_MSC_VER)&&_MSC_VER>=1200 #define GC_ATTR_DEPRECATED __declspec(deprecated) #else #define GC_ATTR_DEPRECATED #endif #endif #if defined(__sgi)&&!defined(__GNUC__)&&_COMPILER_VERSION>=720 #define GC_ADD_CALLER #define GC_RETURN_ADDR (GC_word)__return_address #endif #if defined(__linux__)||defined(__GLIBC__) #if!defined(__native_client__) #include #endif #if (__GLIBC__==2&&__GLIBC_MINOR__>=1||__GLIBC__ > 2)&&!defined(__ia64__)&&!defined(GC_MISSING_EXECINFO_H)&&!defined(GC_HAVE_BUILTIN_BACKTRACE) #define GC_HAVE_BUILTIN_BACKTRACE #endif #if defined(__i386__)||defined(__amd64__)||defined(__x86_64__) #define GC_CAN_SAVE_CALL_STACKS #endif #endif #if defined(_MSC_VER)&&_MSC_VER>=1200&&!defined(_AMD64_)&&!defined(_M_X64)&&!defined(_WIN32_WCE)&&!defined(GC_HAVE_NO_BUILTIN_BACKTRACE)&&!defined(GC_HAVE_BUILTIN_BACKTRACE) #define GC_HAVE_BUILTIN_BACKTRACE #endif #if defined(GC_HAVE_BUILTIN_BACKTRACE)&&!defined(GC_CAN_SAVE_CALL_STACKS) #define GC_CAN_SAVE_CALL_STACKS #endif #if defined(__sparc__) #define GC_CAN_SAVE_CALL_STACKS #endif #if (defined(__linux__)||defined(__DragonFly__)||defined(__FreeBSD__)||defined(__FreeBSD_kernel__)||defined(__HAIKU__)||defined(__NetBSD__)||defined(__OpenBSD__)||defined(HOST_ANDROID)||defined(__ANDROID__))&&!defined(GC_CAN_SAVE_CALL_STACKS) #define GC_ADD_CALLER #if GC_GNUC_PREREQ(2,95) #define GC_RETURN_ADDR (GC_word)__builtin_return_address(0) #if GC_GNUC_PREREQ(4,0)&&(defined(__i386__)||defined(__amd64__)||defined(__x86_64__)) #define GC_HAVE_RETURN_ADDR_PARENT #define GC_RETURN_ADDR_PARENT (GC_word)__builtin_extract_return_addr(__builtin_return_address(1)) #endif #else #define GC_RETURN_ADDR 0 #endif #endif #ifdef GC_PTHREADS #if (defined(GC_DARWIN_THREADS)||defined(GC_WIN32_PTHREADS)||defined(__native_client__)||defined(GC_RTEMS_PTHREADS))&&!defined(GC_NO_DLOPEN) #define GC_NO_DLOPEN #endif #if (defined(GC_DARWIN_THREADS)||defined(GC_WIN32_PTHREADS)||defined(GC_OPENBSD_THREADS)||defined(__native_client__))&&!defined(GC_NO_PTHREAD_SIGMASK) #define GC_NO_PTHREAD_SIGMASK #endif #if defined(__native_client__) #ifndef GC_PTHREAD_CREATE_CONST #define GC_PTHREAD_CREATE_CONST #endif #ifndef GC_HAVE_PTHREAD_EXIT #define GC_HAVE_PTHREAD_EXIT #define GC_PTHREAD_EXIT_ATTRIBUTE #endif #endif #if!defined(GC_HAVE_PTHREAD_EXIT)&&!defined(HOST_ANDROID)&&!defined(__ANDROID__)&&(defined(GC_LINUX_THREADS)||defined(GC_SOLARIS_THREADS)) #define GC_HAVE_PTHREAD_EXIT #if GC_GNUC_PREREQ(2,7) #define GC_PTHREAD_EXIT_ATTRIBUTE __attribute__((__noreturn__)) #elif defined(__NORETURN) #define GC_PTHREAD_EXIT_ATTRIBUTE __NORETURN #else #define GC_PTHREAD_EXIT_ATTRIBUTE #endif #endif #if (!defined(GC_HAVE_PTHREAD_EXIT)||defined(__native_client__))&&!defined(GC_NO_PTHREAD_CANCEL) #define GC_NO_PTHREAD_CANCEL #endif #endif #ifdef __cplusplus #ifndef GC_ATTR_EXPLICIT #if __cplusplus>=201103L&&!defined(__clang__)||_MSVC_LANG>=201103L||defined(CPPCHECK) #define GC_ATTR_EXPLICIT explicit #else #define GC_ATTR_EXPLICIT #endif #endif #ifndef GC_NOEXCEPT #if defined(__DMC__)||(defined(__BORLANDC__)&&(defined(_RWSTD_NO_EXCEPTIONS)||defined(_RWSTD_NO_EX_SPEC)))||(defined(_MSC_VER)&&defined(_HAS_EXCEPTIONS)&&!_HAS_EXCEPTIONS)||(defined(__WATCOMC__)&&!defined(_CPPUNWIND)) #define GC_NOEXCEPT #ifndef GC_NEW_ABORTS_ON_OOM #define GC_NEW_ABORTS_ON_OOM #endif #elif __cplusplus>=201103L||_MSVC_LANG>=201103L #define GC_NOEXCEPT noexcept #else #define GC_NOEXCEPT throw() #endif #endif #endif #endif #ifdef __cplusplus extern "C" { #endif typedef void*GC_PTR; #ifdef _WIN64 #if defined(__int64)&&!defined(CPPCHECK) typedef unsigned __int64 GC_word; typedef __int64 GC_signed_word; #else typedef unsigned long long GC_word; typedef long long GC_signed_word; #endif #else typedef unsigned long GC_word; typedef long GC_signed_word; #endif GC_API unsigned GC_CALL GC_get_version(void); GC_API GC_ATTR_DEPRECATED GC_word GC_gc_no; GC_API GC_word GC_CALL GC_get_gc_no(void); #ifdef GC_THREADS GC_API GC_ATTR_DEPRECATED int GC_parallel; GC_API int GC_CALL GC_get_parallel(void); GC_API void GC_CALL GC_set_markers_count(unsigned); #endif typedef void*(GC_CALLBACK*GC_oom_func)(size_t); GC_API GC_ATTR_DEPRECATED GC_oom_func GC_oom_fn; GC_API void GC_CALL GC_set_oom_fn(GC_oom_func)GC_ATTR_NONNULL(1); GC_API GC_oom_func GC_CALL GC_get_oom_fn(void); typedef void (GC_CALLBACK*GC_on_heap_resize_proc)(GC_word); GC_API GC_ATTR_DEPRECATED GC_on_heap_resize_proc GC_on_heap_resize; GC_API void GC_CALL GC_set_on_heap_resize(GC_on_heap_resize_proc); GC_API GC_on_heap_resize_proc GC_CALL GC_get_on_heap_resize(void); typedef enum { GC_EVENT_START, GC_EVENT_MARK_START, GC_EVENT_MARK_END, GC_EVENT_RECLAIM_START, GC_EVENT_RECLAIM_END, GC_EVENT_END, GC_EVENT_PRE_STOP_WORLD, GC_EVENT_POST_STOP_WORLD, GC_EVENT_PRE_START_WORLD, GC_EVENT_POST_START_WORLD, GC_EVENT_THREAD_SUSPENDED, GC_EVENT_THREAD_UNSUSPENDED } GC_EventType; typedef void (GC_CALLBACK*GC_on_collection_event_proc)(GC_EventType); GC_API void GC_CALL GC_set_on_collection_event(GC_on_collection_event_proc); GC_API GC_on_collection_event_proc GC_CALL GC_get_on_collection_event(void); #if defined(GC_THREADS)||(defined(GC_BUILD)&&defined(NN_PLATFORM_CTR)) typedef void (GC_CALLBACK*GC_on_thread_event_proc)(GC_EventType, void*); GC_API void GC_CALL GC_set_on_thread_event(GC_on_thread_event_proc); GC_API GC_on_thread_event_proc GC_CALL GC_get_on_thread_event(void); #endif GC_API GC_ATTR_DEPRECATED int GC_find_leak; GC_API void GC_CALL GC_set_find_leak(int); GC_API int GC_CALL GC_get_find_leak(void); GC_API GC_ATTR_DEPRECATED int GC_all_interior_pointers; GC_API void GC_CALL GC_set_all_interior_pointers(int); GC_API int GC_CALL GC_get_all_interior_pointers(void); GC_API GC_ATTR_DEPRECATED int GC_finalize_on_demand; GC_API void GC_CALL GC_set_finalize_on_demand(int); GC_API int GC_CALL GC_get_finalize_on_demand(void); GC_API GC_ATTR_DEPRECATED int GC_java_finalization; GC_API void GC_CALL GC_set_java_finalization(int); GC_API int GC_CALL GC_get_java_finalization(void); typedef void (GC_CALLBACK*GC_finalizer_notifier_proc)(void); GC_API GC_ATTR_DEPRECATED GC_finalizer_notifier_proc GC_finalizer_notifier; GC_API void GC_CALL GC_set_finalizer_notifier(GC_finalizer_notifier_proc); GC_API GC_finalizer_notifier_proc GC_CALL GC_get_finalizer_notifier(void); GC_API #ifndef GC_DONT_GC GC_ATTR_DEPRECATED #endif int GC_dont_gc; GC_API GC_ATTR_DEPRECATED int GC_dont_expand; GC_API void GC_CALL GC_set_dont_expand(int); GC_API int GC_CALL GC_get_dont_expand(void); GC_API GC_ATTR_DEPRECATED int GC_use_entire_heap; GC_API GC_ATTR_DEPRECATED int GC_full_freq; GC_API void GC_CALL GC_set_full_freq(int); GC_API int GC_CALL GC_get_full_freq(void); GC_API GC_ATTR_DEPRECATED GC_word GC_non_gc_bytes; GC_API void GC_CALL GC_set_non_gc_bytes(GC_word); GC_API GC_word GC_CALL GC_get_non_gc_bytes(void); GC_API GC_ATTR_DEPRECATED int GC_no_dls; GC_API void GC_CALL GC_set_no_dls(int); GC_API int GC_CALL GC_get_no_dls(void); GC_API GC_ATTR_DEPRECATED GC_word GC_free_space_divisor; GC_API void GC_CALL GC_set_free_space_divisor(GC_word); GC_API GC_word GC_CALL GC_get_free_space_divisor(void); GC_API GC_ATTR_DEPRECATED GC_word GC_max_retries; GC_API void GC_CALL GC_set_max_retries(GC_word); GC_API GC_word GC_CALL GC_get_max_retries(void); GC_API GC_ATTR_DEPRECATED char*GC_stackbottom; GC_API GC_ATTR_DEPRECATED int GC_dont_precollect; GC_API void GC_CALL GC_set_dont_precollect(int); GC_API int GC_CALL GC_get_dont_precollect(void); GC_API GC_ATTR_DEPRECATED unsigned long GC_time_limit; #define GC_TIME_UNLIMITED 999999 GC_API void GC_CALL GC_set_time_limit(unsigned long); GC_API unsigned long GC_CALL GC_get_time_limit(void); struct GC_timeval_s { unsigned long tv_ms; unsigned long tv_nsec; }; GC_API void GC_CALL GC_set_time_limit_tv(struct GC_timeval_s); GC_API struct GC_timeval_s GC_CALL GC_get_time_limit_tv(void); GC_API void GC_CALL GC_set_allocd_bytes_per_finalizer(GC_word); GC_API GC_word GC_CALL GC_get_allocd_bytes_per_finalizer(void); GC_API void GC_CALL GC_start_performance_measurement(void); GC_API unsigned long GC_CALL GC_get_full_gc_total_time(void); GC_API void GC_CALL GC_set_pages_executable(int); GC_API int GC_CALL GC_get_pages_executable(void); GC_API void GC_CALL GC_set_min_bytes_allocd(size_t); GC_API size_t GC_CALL GC_get_min_bytes_allocd(void); GC_API void GC_CALL GC_set_rate(int); GC_API int GC_CALL GC_get_rate(void); GC_API void GC_CALL GC_set_max_prior_attempts(int); GC_API int GC_CALL GC_get_max_prior_attempts(void); GC_API void GC_CALL GC_set_handle_fork(int); GC_API void GC_CALL GC_atfork_prepare(void); GC_API void GC_CALL GC_atfork_parent(void); GC_API void GC_CALL GC_atfork_child(void); GC_API void GC_CALL GC_init(void); GC_API int GC_CALL GC_is_init_called(void); GC_API void GC_CALL GC_deinit(void); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_malloc(size_t); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_malloc_atomic(size_t); GC_API GC_ATTR_MALLOC char*GC_CALL GC_strdup(const char*); GC_API GC_ATTR_MALLOC char*GC_CALL GC_strndup(const char*,size_t)GC_ATTR_NONNULL(1); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_malloc_uncollectable(size_t); GC_API GC_ATTR_DEPRECATED void*GC_CALL GC_malloc_stubborn(size_t); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(2)void*GC_CALL GC_memalign(size_t,size_t); GC_API int GC_CALL GC_posix_memalign(void**,size_t, size_t)GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_free(void*); #define GC_MALLOC_STUBBORN(sz)GC_MALLOC(sz) #define GC_NEW_STUBBORN(t)GC_NEW(t) #define GC_CHANGE_STUBBORN(p)GC_change_stubborn(p) GC_API GC_ATTR_DEPRECATED void GC_CALL GC_change_stubborn(const void*); GC_API void GC_CALL GC_end_stubborn_change(const void*)GC_ATTR_NONNULL(1); GC_API void*GC_CALL GC_base(void*); GC_API int GC_CALL GC_is_heap_ptr(const void*); GC_API size_t GC_CALL GC_size(const void*)GC_ATTR_NONNULL(1); GC_API void*GC_CALL GC_realloc(void*, size_t) GC_ATTR_ALLOC_SIZE(2); GC_API int GC_CALL GC_expand_hp(size_t); GC_API void GC_CALL GC_set_max_heap_size(GC_word); GC_API void GC_CALL GC_exclude_static_roots(void*, void*); GC_API void GC_CALL GC_clear_exclusion_table(void); GC_API void GC_CALL GC_clear_roots(void); GC_API void GC_CALL GC_add_roots(void*, void*); GC_API void GC_CALL GC_remove_roots(void*, void*); GC_API void GC_CALL GC_register_displacement(size_t); GC_API void GC_CALL GC_debug_register_displacement(size_t); GC_API void GC_CALL GC_gcollect(void); GC_API void GC_CALL GC_gcollect_and_unmap(void); typedef int (GC_CALLBACK*GC_stop_func)(void); GC_API int GC_CALL GC_try_to_collect(GC_stop_func) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_set_stop_func(GC_stop_func) GC_ATTR_NONNULL(1); GC_API GC_stop_func GC_CALL GC_get_stop_func(void); GC_API size_t GC_CALL GC_get_heap_size(void); GC_API size_t GC_CALL GC_get_free_bytes(void); GC_API size_t GC_CALL GC_get_unmapped_bytes(void); GC_API size_t GC_CALL GC_get_bytes_since_gc(void); GC_API size_t GC_CALL GC_get_expl_freed_bytes_since_gc(void); GC_API size_t GC_CALL GC_get_total_bytes(void); GC_API void GC_CALL GC_get_heap_usage_safe(GC_word*, GC_word*, GC_word*, GC_word*, GC_word*); struct GC_prof_stats_s { GC_word heapsize_full; GC_word free_bytes_full; GC_word unmapped_bytes; GC_word bytes_allocd_since_gc; GC_word allocd_bytes_before_gc; GC_word non_gc_bytes; GC_word gc_no; GC_word markers_m1; GC_word bytes_reclaimed_since_gc; GC_word reclaimed_bytes_before_gc; GC_word expl_freed_bytes_since_gc; }; GC_API size_t GC_CALL GC_get_prof_stats(struct GC_prof_stats_s*, size_t); #ifdef GC_THREADS GC_API size_t GC_CALL GC_get_prof_stats_unsafe(struct GC_prof_stats_s*, size_t); #endif GC_API size_t GC_CALL GC_get_size_map_at(int i); GC_API size_t GC_CALL GC_get_memory_use(void); GC_API void GC_CALL GC_disable(void); GC_API int GC_CALL GC_is_disabled(void); GC_API void GC_CALL GC_enable(void); GC_API void GC_CALL GC_set_manual_vdb_allowed(int); GC_API int GC_CALL GC_get_manual_vdb_allowed(void); GC_API void GC_CALL GC_enable_incremental(void); GC_API int GC_CALL GC_is_incremental_mode(void); #define GC_PROTECTS_POINTER_HEAP 1 #define GC_PROTECTS_PTRFREE_HEAP 2 #define GC_PROTECTS_STATIC_DATA 4 #define GC_PROTECTS_STACK 8 #define GC_PROTECTS_NONE 0 GC_API int GC_CALL GC_incremental_protection_needs(void); GC_API int GC_CALL GC_collect_a_little(void); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_malloc_ignore_off_page(size_t); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_malloc_atomic_ignore_off_page(size_t); #ifdef GC_ADD_CALLER #define GC_EXTRAS GC_RETURN_ADDR,__FILE__,__LINE__ #define GC_EXTRA_PARAMS GC_word ra,const char*s,int i #else #define GC_EXTRAS __FILE__,__LINE__ #define GC_EXTRA_PARAMS const char*s,int i #endif GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_malloc_atomic_uncollectable(size_t); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_debug_malloc_atomic_uncollectable(size_t,GC_EXTRA_PARAMS); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_debug_malloc(size_t,GC_EXTRA_PARAMS); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_debug_malloc_atomic(size_t,GC_EXTRA_PARAMS); GC_API GC_ATTR_MALLOC char*GC_CALL GC_debug_strdup(const char*,GC_EXTRA_PARAMS); GC_API GC_ATTR_MALLOC char*GC_CALL GC_debug_strndup(const char*,size_t,GC_EXTRA_PARAMS) GC_ATTR_NONNULL(1); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_debug_malloc_uncollectable(size_t, GC_EXTRA_PARAMS); GC_API GC_ATTR_DEPRECATED void*GC_CALL GC_debug_malloc_stubborn(size_t,GC_EXTRA_PARAMS); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_debug_malloc_ignore_off_page(size_t, GC_EXTRA_PARAMS); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_debug_malloc_atomic_ignore_off_page(size_t, GC_EXTRA_PARAMS); GC_API void GC_CALL GC_debug_free(void*); GC_API void*GC_CALL GC_debug_realloc(void*, size_t,GC_EXTRA_PARAMS) GC_ATTR_ALLOC_SIZE(2); GC_API GC_ATTR_DEPRECATED void GC_CALL GC_debug_change_stubborn(const void*); GC_API void GC_CALL GC_debug_end_stubborn_change(const void*) GC_ATTR_NONNULL(1); GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1)void*GC_CALL GC_debug_malloc_replacement(size_t); GC_API GC_ATTR_ALLOC_SIZE(2)void*GC_CALL GC_debug_realloc_replacement(void*, size_t); #ifdef GC_DEBUG_REPLACEMENT #define GC_MALLOC(sz)GC_debug_malloc_replacement(sz) #define GC_REALLOC(old,sz)GC_debug_realloc_replacement(old,sz) #elif defined(GC_DEBUG) #define GC_MALLOC(sz)GC_debug_malloc(sz,GC_EXTRAS) #define GC_REALLOC(old,sz)GC_debug_realloc(old,sz,GC_EXTRAS) #else #define GC_MALLOC(sz)GC_malloc(sz) #define GC_REALLOC(old,sz)GC_realloc(old,sz) #endif #ifdef GC_DEBUG #define GC_MALLOC_ATOMIC(sz)GC_debug_malloc_atomic(sz,GC_EXTRAS) #define GC_STRDUP(s)GC_debug_strdup(s,GC_EXTRAS) #define GC_STRNDUP(s,sz)GC_debug_strndup(s,sz,GC_EXTRAS) #define GC_MALLOC_ATOMIC_UNCOLLECTABLE(sz)GC_debug_malloc_atomic_uncollectable(sz,GC_EXTRAS) #define GC_MALLOC_UNCOLLECTABLE(sz)GC_debug_malloc_uncollectable(sz,GC_EXTRAS) #define GC_MALLOC_IGNORE_OFF_PAGE(sz)GC_debug_malloc_ignore_off_page(sz,GC_EXTRAS) #define GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(sz)GC_debug_malloc_atomic_ignore_off_page(sz,GC_EXTRAS) #define GC_FREE(p)GC_debug_free(p) #define GC_REGISTER_FINALIZER(p,f,d,of,od)GC_debug_register_finalizer(p,f,d,of,od) #define GC_REGISTER_FINALIZER_IGNORE_SELF(p,f,d,of,od)GC_debug_register_finalizer_ignore_self(p,f,d,of,od) #define GC_REGISTER_FINALIZER_NO_ORDER(p,f,d,of,od)GC_debug_register_finalizer_no_order(p,f,d,of,od) #define GC_REGISTER_FINALIZER_UNREACHABLE(p,f,d,of,od)GC_debug_register_finalizer_unreachable(p,f,d,of,od) #define GC_END_STUBBORN_CHANGE(p)GC_debug_end_stubborn_change(p) #define GC_PTR_STORE_AND_DIRTY(p,q)GC_debug_ptr_store_and_dirty(p,q) #define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link,obj)GC_general_register_disappearing_link(link,GC_base(( void*)(obj))) #define GC_REGISTER_LONG_LINK(link,obj)GC_register_long_link(link,GC_base(( void*)(obj))) #define GC_REGISTER_DISPLACEMENT(n)GC_debug_register_displacement(n) #else #define GC_MALLOC_ATOMIC(sz)GC_malloc_atomic(sz) #define GC_STRDUP(s)GC_strdup(s) #define GC_STRNDUP(s,sz)GC_strndup(s,sz) #define GC_MALLOC_ATOMIC_UNCOLLECTABLE(sz)GC_malloc_atomic_uncollectable(sz) #define GC_MALLOC_UNCOLLECTABLE(sz)GC_malloc_uncollectable(sz) #define GC_MALLOC_IGNORE_OFF_PAGE(sz)GC_malloc_ignore_off_page(sz) #define GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(sz)GC_malloc_atomic_ignore_off_page(sz) #define GC_FREE(p)GC_free(p) #define GC_REGISTER_FINALIZER(p,f,d,of,od)GC_register_finalizer(p,f,d,of,od) #define GC_REGISTER_FINALIZER_IGNORE_SELF(p,f,d,of,od)GC_register_finalizer_ignore_self(p,f,d,of,od) #define GC_REGISTER_FINALIZER_NO_ORDER(p,f,d,of,od)GC_register_finalizer_no_order(p,f,d,of,od) #define GC_REGISTER_FINALIZER_UNREACHABLE(p,f,d,of,od)GC_register_finalizer_unreachable(p,f,d,of,od) #define GC_END_STUBBORN_CHANGE(p)GC_end_stubborn_change(p) #define GC_PTR_STORE_AND_DIRTY(p,q)GC_ptr_store_and_dirty(p,q) #define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link,obj)GC_general_register_disappearing_link(link,obj) #define GC_REGISTER_LONG_LINK(link,obj)GC_register_long_link(link,obj) #define GC_REGISTER_DISPLACEMENT(n)GC_register_displacement(n) #endif #define GC_NEW(t)((t*)GC_MALLOC(sizeof(t))) #define GC_NEW_ATOMIC(t)((t*)GC_MALLOC_ATOMIC(sizeof(t))) #define GC_NEW_UNCOLLECTABLE(t)((t*)GC_MALLOC_UNCOLLECTABLE(sizeof(t))) #ifdef GC_REQUIRE_WCSDUP GC_API GC_ATTR_MALLOC wchar_t*GC_CALL GC_wcsdup(const wchar_t*)GC_ATTR_NONNULL(1); GC_API GC_ATTR_MALLOC wchar_t*GC_CALL GC_debug_wcsdup(const wchar_t*,GC_EXTRA_PARAMS)GC_ATTR_NONNULL(1); #ifdef GC_DEBUG #define GC_WCSDUP(s)GC_debug_wcsdup(s,GC_EXTRAS) #else #define GC_WCSDUP(s)GC_wcsdup(s) #endif #endif typedef void (GC_CALLBACK*GC_finalization_proc)(void*, void*); GC_API void GC_CALL GC_register_finalizer(void*, GC_finalization_proc,void*, GC_finalization_proc*,void**) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_debug_register_finalizer(void*, GC_finalization_proc,void*, GC_finalization_proc*,void**) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_register_finalizer_ignore_self(void*, GC_finalization_proc,void*, GC_finalization_proc*,void**) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_debug_register_finalizer_ignore_self(void*, GC_finalization_proc,void*, GC_finalization_proc*,void**) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_register_finalizer_no_order(void*, GC_finalization_proc,void*, GC_finalization_proc*,void**) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_debug_register_finalizer_no_order(void*, GC_finalization_proc,void*, GC_finalization_proc*,void**) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_register_finalizer_unreachable(void*, GC_finalization_proc,void*, GC_finalization_proc*,void**) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_debug_register_finalizer_unreachable(void*, GC_finalization_proc,void*, GC_finalization_proc*,void**) GC_ATTR_NONNULL(1); #define GC_NO_MEMORY 2 GC_API int GC_CALL GC_register_disappearing_link(void**) GC_ATTR_NONNULL(1); GC_API int GC_CALL GC_general_register_disappearing_link(void**, const void*) GC_ATTR_NONNULL(1)GC_ATTR_NONNULL(2); GC_API int GC_CALL GC_move_disappearing_link(void**, void**) GC_ATTR_NONNULL(2); GC_API int GC_CALL GC_unregister_disappearing_link(void**); GC_API int GC_CALL GC_register_long_link(void**, const void*) GC_ATTR_NONNULL(1)GC_ATTR_NONNULL(2); GC_API int GC_CALL GC_move_long_link(void**, void**) GC_ATTR_NONNULL(2); GC_API int GC_CALL GC_unregister_long_link(void**); typedef enum { GC_TOGGLE_REF_DROP, GC_TOGGLE_REF_STRONG, GC_TOGGLE_REF_WEAK } GC_ToggleRefStatus; typedef GC_ToggleRefStatus (GC_CALLBACK*GC_toggleref_func)(void*); GC_API void GC_CALL GC_set_toggleref_func(GC_toggleref_func); GC_API GC_toggleref_func GC_CALL GC_get_toggleref_func(void); GC_API int GC_CALL GC_toggleref_add(void*,int) GC_ATTR_NONNULL(1); typedef void (GC_CALLBACK*GC_await_finalize_proc)(void*); GC_API void GC_CALL GC_set_await_finalize_proc(GC_await_finalize_proc); GC_API GC_await_finalize_proc GC_CALL GC_get_await_finalize_proc(void); GC_API int GC_CALL GC_should_invoke_finalizers(void); GC_API int GC_CALL GC_invoke_finalizers(void); #if defined(__GNUC__)&&!defined(__INTEL_COMPILER) #define GC_reachable_here(ptr)__asm__ __volatile__(" "::"X"(ptr):"memory") #else GC_API void GC_CALL GC_noop1(GC_word); #ifdef LINT2 #define GC_reachable_here(ptr)GC_noop1(~(GC_word)(ptr)^(~(GC_word)0)) #else #define GC_reachable_here(ptr)GC_noop1((GC_word)(ptr)) #endif #endif typedef void (GC_CALLBACK*GC_warn_proc)(char*, GC_word); GC_API void GC_CALL GC_set_warn_proc(GC_warn_proc)GC_ATTR_NONNULL(1); GC_API GC_warn_proc GC_CALL GC_get_warn_proc(void); GC_API void GC_CALLBACK GC_ignore_warn_proc(char*,GC_word); GC_API void GC_CALL GC_set_log_fd(int); typedef void (GC_CALLBACK*GC_abort_func)(const char*); GC_API void GC_CALL GC_set_abort_func(GC_abort_func)GC_ATTR_NONNULL(1); GC_API GC_abort_func GC_CALL GC_get_abort_func(void); GC_API void GC_CALL GC_abort_on_oom(void); typedef GC_word GC_hidden_pointer; #define GC_HIDE_POINTER(p)(~(GC_hidden_pointer)(p)) #define GC_REVEAL_POINTER(p)((void*)GC_HIDE_POINTER(p)) #if defined(I_HIDE_POINTERS)||defined(GC_I_HIDE_POINTERS) #define HIDE_POINTER(p)GC_HIDE_POINTER(p) #define REVEAL_POINTER(p)GC_REVEAL_POINTER(p) #endif #ifdef GC_THREADS GC_API void GC_CALL GC_alloc_lock(void); GC_API void GC_CALL GC_alloc_unlock(void); #else #define GC_alloc_lock()(void)0 #define GC_alloc_unlock()(void)0 #endif typedef void*(GC_CALLBACK*GC_fn_type)(void*); GC_API void*GC_CALL GC_call_with_alloc_lock(GC_fn_type, void*)GC_ATTR_NONNULL(1); struct GC_stack_base { void*mem_base; #if defined(__ia64)||defined(__ia64__)||defined(_M_IA64) void*reg_base; #endif }; typedef void*(GC_CALLBACK*GC_stack_base_func)( struct GC_stack_base*,void*); GC_API void*GC_CALL GC_call_with_stack_base(GC_stack_base_func, void*)GC_ATTR_NONNULL(1); #define GC_SUCCESS 0 #define GC_DUPLICATE 1 #define GC_NO_THREADS 2 #define GC_UNIMPLEMENTED 3 #define GC_NOT_FOUND 4 #if defined(GC_DARWIN_THREADS)||defined(GC_WIN32_THREADS) GC_API void GC_CALL GC_use_threads_discovery(void); #endif #ifdef GC_THREADS GC_API void GC_CALL GC_set_suspend_signal(int); GC_API void GC_CALL GC_set_thr_restart_signal(int); GC_API int GC_CALL GC_get_suspend_signal(void); GC_API int GC_CALL GC_get_thr_restart_signal(void); GC_API void GC_CALL GC_start_mark_threads(void); GC_API void GC_CALL GC_allow_register_threads(void); GC_API int GC_CALL GC_register_my_thread(const struct GC_stack_base*) GC_ATTR_NONNULL(1); GC_API int GC_CALL GC_thread_is_registered(void); GC_API void GC_CALL GC_register_altstack(void*, GC_word, void*, GC_word); GC_API int GC_CALL GC_unregister_my_thread(void); GC_API void GC_CALL GC_stop_world_external(void); GC_API void GC_CALL GC_start_world_external(void); #endif GC_API void*GC_CALL GC_do_blocking(GC_fn_type, void*)GC_ATTR_NONNULL(1); GC_API void*GC_CALL GC_call_with_gc_active(GC_fn_type, void*)GC_ATTR_NONNULL(1); GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base*) GC_ATTR_NONNULL(1); GC_API void*GC_CALL GC_get_my_stackbottom(struct GC_stack_base*) GC_ATTR_NONNULL(1); GC_API void GC_CALL GC_set_stackbottom(void*, const struct GC_stack_base*) GC_ATTR_NONNULL(2); GC_API void*GC_CALL GC_same_obj(void*,void*); GC_API void*GC_CALL GC_pre_incr(void**,ptrdiff_t) GC_ATTR_NONNULL(1); GC_API void*GC_CALL GC_post_incr(void**,ptrdiff_t) GC_ATTR_NONNULL(1); GC_API void*GC_CALL GC_is_visible(void*); GC_API void*GC_CALL GC_is_valid_displacement(void*); GC_API void GC_CALL GC_dump(void); GC_API void GC_CALL GC_dump_named(const char*); GC_API void GC_CALL GC_dump_regions(void); GC_API void GC_CALL GC_dump_finalization(void); #if defined(GC_DEBUG)&&defined(__GNUC__) #define GC_PTR_ADD3(x,n,type_of_result)((type_of_result)GC_same_obj((x)+(n),(x))) #define GC_PRE_INCR3(x,n,type_of_result)((type_of_result)GC_pre_incr((void**)(&(x)),(n)*sizeof(*x))) #define GC_POST_INCR3(x,n,type_of_result)((type_of_result)GC_post_incr((void**)(&(x)),(n)*sizeof(*x))) #define GC_PTR_ADD(x,n)GC_PTR_ADD3(x,n,__typeof__(x)) #define GC_PRE_INCR(x,n)GC_PRE_INCR3(x,n,__typeof__(x)) #define GC_POST_INCR(x)GC_POST_INCR3(x,1,__typeof__(x)) #define GC_POST_DECR(x)GC_POST_INCR3(x,-1,__typeof__(x)) #else #define GC_PTR_ADD(x,n)((x)+(n)) #define GC_PRE_INCR(x,n)((x)+=(n)) #define GC_POST_INCR(x)((x)++) #define GC_POST_DECR(x)((x)--) #endif #ifdef GC_DEBUG #define GC_PTR_STORE(p,q)(*(void**)GC_is_visible((void*)(p))=GC_is_valid_displacement((void*)(q))) #else #define GC_PTR_STORE(p,q)(*(void**)(p)=(void*)(q)) #endif GC_API void GC_CALL GC_ptr_store_and_dirty(void*, const void*); GC_API void GC_CALL GC_debug_ptr_store_and_dirty(void*, const void*); GC_API void (GC_CALLBACK*GC_same_obj_print_proc)(void*, void*); GC_API void (GC_CALLBACK*GC_is_valid_displacement_print_proc)(void*); GC_API void (GC_CALLBACK*GC_is_visible_print_proc)(void*); #ifdef GC_PTHREADS #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif #endif GC_API GC_ATTR_MALLOC void*GC_CALL GC_malloc_many(size_t); #define GC_NEXT(p)(*(void**)(p)) typedef int (GC_CALLBACK*GC_has_static_roots_func)( const char*, void*, size_t); GC_API void GC_CALL GC_register_has_static_roots_callback( GC_has_static_roots_func); #if!defined(CPPCHECK)&&!defined(GC_WINDOWS_H_INCLUDED)&&defined(WINAPI) #define GC_WINDOWS_H_INCLUDED #endif #if defined(GC_WIN32_THREADS)&&(!defined(GC_PTHREADS)||defined(GC_BUILD)||defined(GC_WINDOWS_H_INCLUDED)) #if (!defined(GC_NO_THREAD_DECLS)||defined(GC_BUILD))&&!defined(GC_DONT_INCL_WINDOWS_H) #ifdef __cplusplus } #endif #if!defined(_WIN32_WCE)&&!defined(__CEGCC__) #include #endif #if defined(GC_BUILD)||!defined(GC_DONT_INCLUDE_WINDOWS_H) #include #define GC_WINDOWS_H_INCLUDED #endif #ifdef __cplusplus extern "C" { #endif #ifdef GC_UNDERSCORE_STDCALL #define GC_CreateThread _GC_CreateThread #define GC_ExitThread _GC_ExitThread #endif #ifndef DECLSPEC_NORETURN #ifdef GC_WINDOWS_H_INCLUDED #define DECLSPEC_NORETURN #else #define DECLSPEC_NORETURN __declspec(noreturn) #endif #endif #if!defined(_UINTPTR_T)&&!defined(_UINTPTR_T_DEFINED)&&!defined(UINTPTR_MAX) typedef GC_word GC_uintptr_t; #else typedef uintptr_t GC_uintptr_t; #endif #ifdef _WIN64 #define GC_WIN32_SIZE_T GC_uintptr_t #elif defined(GC_WINDOWS_H_INCLUDED) #define GC_WIN32_SIZE_T DWORD #else #define GC_WIN32_SIZE_T unsigned long #endif #ifdef GC_INSIDE_DLL #ifdef GC_UNDERSCORE_STDCALL #define GC_DllMain _GC_DllMain #endif #ifdef GC_WINDOWS_H_INCLUDED GC_API BOOL WINAPI GC_DllMain(HINSTANCE, ULONG, LPVOID); #else GC_API int __stdcall GC_DllMain(void*,unsigned long,void*); #endif #endif #ifdef GC_WINDOWS_H_INCLUDED GC_API HANDLE WINAPI GC_CreateThread( LPSECURITY_ATTRIBUTES, GC_WIN32_SIZE_T, LPTHREAD_START_ROUTINE, LPVOID,DWORD, LPDWORD); GC_API DECLSPEC_NORETURN void WINAPI GC_ExitThread( DWORD); #else struct _SECURITY_ATTRIBUTES; GC_API void*__stdcall GC_CreateThread(struct _SECURITY_ATTRIBUTES*, GC_WIN32_SIZE_T, unsigned long (__stdcall*)(void*), void*,unsigned long,unsigned long*); GC_API DECLSPEC_NORETURN void __stdcall GC_ExitThread(unsigned long); #endif #if!defined(_WIN32_WCE)&&!defined(__CEGCC__) GC_API GC_uintptr_t GC_CALL GC_beginthreadex( void*,unsigned, unsigned (__stdcall*)(void*), void*,unsigned, unsigned*); GC_API void GC_CALL GC_endthreadex(unsigned); #endif #endif #ifdef GC_WINMAIN_REDIRECT #define WinMain GC_WinMain #endif #define GC_use_DllMain GC_use_threads_discovery #ifndef GC_NO_THREAD_REDIRECTS #define CreateThread GC_CreateThread #define ExitThread GC_ExitThread #undef _beginthreadex #define _beginthreadex GC_beginthreadex #undef _endthreadex #define _endthreadex GC_endthreadex #endif #endif GC_API void GC_CALL GC_set_force_unmap_on_gcollect(int); GC_API int GC_CALL GC_get_force_unmap_on_gcollect(void); #if defined(__CYGWIN32__)||defined(__CYGWIN__) #ifdef __x86_64__ extern int __data_start__[],__data_end__[]; extern int __bss_start__[],__bss_end__[]; #define GC_DATASTART ((GC_word)__data_start__ < (GC_word)__bss_start__?(void*)__data_start__:(void*)__bss_start__) #define GC_DATAEND ((GC_word)__data_end__ > (GC_word)__bss_end__?(void*)__data_end__:(void*)__bss_end__) #else extern int _data_start__[],_data_end__[],_bss_start__[],_bss_end__[]; #define GC_DATASTART ((GC_word)_data_start__ < (GC_word)_bss_start__?(void*)_data_start__:(void*)_bss_start__) #define GC_DATAEND ((GC_word)_data_end__ > (GC_word)_bss_end__?(void*)_data_end__:(void*)_bss_end__) #endif #define GC_INIT_CONF_ROOTS GC_add_roots(GC_DATASTART,GC_DATAEND);GC_gcollect() #elif defined(_AIX) extern int _data[],_end[]; #define GC_DATASTART ((void*)_data) #define GC_DATAEND ((void*)_end) #define GC_INIT_CONF_ROOTS GC_add_roots(GC_DATASTART,GC_DATAEND) #elif (defined(HOST_ANDROID)||defined(__ANDROID__))&&defined(IGNORE_DYNAMIC_LOADING) #pragma weak __dso_handle extern int __dso_handle[]; GC_API void*GC_CALL GC_find_limit(void*,int); #define GC_INIT_CONF_ROOTS (void)(__dso_handle!=0?(GC_add_roots(__dso_handle,GC_find_limit(__dso_handle,1)),0):0) #else #define GC_INIT_CONF_ROOTS #endif #ifdef GC_DONT_EXPAND #define GC_INIT_CONF_DONT_EXPAND GC_set_dont_expand(1) #else #define GC_INIT_CONF_DONT_EXPAND #endif #ifdef GC_FORCE_UNMAP_ON_GCOLLECT #define GC_INIT_CONF_FORCE_UNMAP_ON_GCOLLECT GC_set_force_unmap_on_gcollect(1) #else #define GC_INIT_CONF_FORCE_UNMAP_ON_GCOLLECT #endif #ifdef GC_DONT_GC #define GC_INIT_CONF_MAX_RETRIES (void)(GC_dont_gc=1) #elif defined(GC_MAX_RETRIES)&&!defined(CPPCHECK) #define GC_INIT_CONF_MAX_RETRIES GC_set_max_retries(GC_MAX_RETRIES) #else #define GC_INIT_CONF_MAX_RETRIES #endif #if defined(GC_ALLOCD_BYTES_PER_FINALIZER)&&!defined(CPPCHECK) #define GC_INIT_CONF_ALLOCD_BYTES_PER_FINALIZER GC_set_allocd_bytes_per_finalizer(GC_ALLOCD_BYTES_PER_FINALIZER) #else #define GC_INIT_CONF_ALLOCD_BYTES_PER_FINALIZER #endif #if defined(GC_FREE_SPACE_DIVISOR)&&!defined(CPPCHECK) #define GC_INIT_CONF_FREE_SPACE_DIVISOR GC_set_free_space_divisor(GC_FREE_SPACE_DIVISOR) #else #define GC_INIT_CONF_FREE_SPACE_DIVISOR #endif #if defined(GC_FULL_FREQ)&&!defined(CPPCHECK) #define GC_INIT_CONF_FULL_FREQ GC_set_full_freq(GC_FULL_FREQ) #else #define GC_INIT_CONF_FULL_FREQ #endif #if defined(GC_TIME_LIMIT)&&!defined(CPPCHECK) #define GC_INIT_CONF_TIME_LIMIT GC_set_time_limit(GC_TIME_LIMIT) #else #define GC_INIT_CONF_TIME_LIMIT #endif #if defined(GC_MARKERS)&&defined(GC_THREADS)&&!defined(CPPCHECK) #define GC_INIT_CONF_MARKERS GC_set_markers_count(GC_MARKERS) #else #define GC_INIT_CONF_MARKERS #endif #if defined(GC_SIG_SUSPEND)&&defined(GC_THREADS)&&!defined(CPPCHECK) #define GC_INIT_CONF_SUSPEND_SIGNAL GC_set_suspend_signal(GC_SIG_SUSPEND) #else #define GC_INIT_CONF_SUSPEND_SIGNAL #endif #if defined(GC_SIG_THR_RESTART)&&defined(GC_THREADS)&&!defined(CPPCHECK) #define GC_INIT_CONF_THR_RESTART_SIGNAL GC_set_thr_restart_signal(GC_SIG_THR_RESTART) #else #define GC_INIT_CONF_THR_RESTART_SIGNAL #endif #if defined(GC_MAXIMUM_HEAP_SIZE)&&!defined(CPPCHECK) #define GC_INIT_CONF_MAXIMUM_HEAP_SIZE GC_set_max_heap_size(GC_MAXIMUM_HEAP_SIZE) #else #define GC_INIT_CONF_MAXIMUM_HEAP_SIZE #endif #ifdef GC_IGNORE_WARN #define GC_INIT_CONF_IGNORE_WARN GC_set_warn_proc(GC_ignore_warn_proc) #else #define GC_INIT_CONF_IGNORE_WARN #endif #if defined(GC_INITIAL_HEAP_SIZE)&&!defined(CPPCHECK) #define GC_INIT_CONF_INITIAL_HEAP_SIZE { size_t heap_size=GC_get_heap_size();if (heap_size < (GC_INITIAL_HEAP_SIZE))(void)GC_expand_hp((GC_INITIAL_HEAP_SIZE)- heap_size);} #else #define GC_INIT_CONF_INITIAL_HEAP_SIZE #endif #define GC_INIT(){ GC_INIT_CONF_DONT_EXPAND;GC_INIT_CONF_FORCE_UNMAP_ON_GCOLLECT;GC_INIT_CONF_MAX_RETRIES;GC_INIT_CONF_ALLOCD_BYTES_PER_FINALIZER;GC_INIT_CONF_FREE_SPACE_DIVISOR;GC_INIT_CONF_FULL_FREQ;GC_INIT_CONF_TIME_LIMIT;GC_INIT_CONF_MARKERS;GC_INIT_CONF_SUSPEND_SIGNAL;GC_INIT_CONF_THR_RESTART_SIGNAL;GC_INIT_CONF_MAXIMUM_HEAP_SIZE;GC_init();GC_INIT_CONF_ROOTS;GC_INIT_CONF_IGNORE_WARN;GC_INIT_CONF_INITIAL_HEAP_SIZE;} GC_API void GC_CALL GC_win32_free_heap(void); #if defined(__SYMBIAN32__) void GC_init_global_static_roots(void); #endif #if defined(_AMIGA)&&!defined(GC_AMIGA_MAKINGLIB) void*GC_amiga_realloc(void*,size_t); #define GC_realloc(a,b)GC_amiga_realloc(a,b) void GC_amiga_set_toany(void (*)(void)); extern int GC_amiga_free_space_divisor_inc; extern void*(*GC_amiga_allocwrapper_do)(size_t,void*(GC_CALL*)(size_t)); #define GC_malloc(a)(*GC_amiga_allocwrapper_do)(a,GC_malloc) #define GC_malloc_atomic(a)(*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic) #define GC_malloc_uncollectable(a)(*GC_amiga_allocwrapper_do)(a,GC_malloc_uncollectable) #define GC_malloc_atomic_uncollectable(a)(*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic_uncollectable) #define GC_malloc_ignore_off_page(a)(*GC_amiga_allocwrapper_do)(a,GC_malloc_ignore_off_page) #define GC_malloc_atomic_ignore_off_page(a)(*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic_ignore_off_page) #endif #ifdef __cplusplus } #endif #endif