version 1.2, 2000/04/10 08:31:31 |
version 1.3, 2000/12/01 09:26:11 |
|
|
/* |
/* |
* Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers |
* Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers |
* Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. |
* Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. |
* Copyright 1996 by Silicon Graphics. All rights reserved. |
* Copyright 1996-1999 by Silicon Graphics. All rights reserved. |
|
* Copyright 1999 by Hewlett-Packard Company. All rights reserved. |
* |
* |
* THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED |
* THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED |
* OR IMPLIED. ANY USE IS AT YOUR OWN RISK. |
* OR IMPLIED. ANY USE IS AT YOUR OWN RISK. |
|
|
#include "libgc_globals.h" |
#include "libgc_globals.h" |
#endif |
#endif |
|
|
|
#if defined(__MINGW32__) && defined(WIN32_THREADS) |
|
# ifdef GC_BUILD |
|
# define GC_API __declspec(dllexport) |
|
# else |
|
# define GC_API __declspec(dllimport) |
|
# endif |
|
#endif |
|
|
#if defined(_MSC_VER) && defined(_DLL) |
#if defined(_MSC_VER) && defined(_DLL) |
# ifdef GC_BUILD |
# ifdef GC_BUILD |
# define GC_API __declspec(dllexport) |
# define GC_API __declspec(dllexport) |
Line 130 GC_API int GC_dont_expand; |
|
Line 139 GC_API int GC_dont_expand; |
|
/* Dont expand heap unless explicitly requested */ |
/* Dont expand heap unless explicitly requested */ |
/* or forced to. */ |
/* or forced to. */ |
|
|
|
GC_API int GC_use_entire_heap; |
|
/* Causes the nonincremental collector to use the */ |
|
/* entire heap before collecting. This was the only */ |
|
/* option for GC versions < 5.0. This sometimes */ |
|
/* results in more large block fragmentation, since */ |
|
/* very larg blocks will tend to get broken up */ |
|
/* during each GC cycle. It is likely to result in a */ |
|
/* larger working set, but lower collection */ |
|
/* frequencies, and hence fewer instructions executed */ |
|
/* in the collector. */ |
|
|
GC_API int GC_full_freq; /* Number of partial collections between */ |
GC_API int GC_full_freq; /* Number of partial collections between */ |
/* full collections. Matters only if */ |
/* full collections. Matters only if */ |
/* GC_incremental is set. */ |
/* GC_incremental is set. */ |
Line 352 GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROT |
|
Line 372 GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROT |
|
|
|
#ifdef GC_ADD_CALLER |
#ifdef GC_ADD_CALLER |
# define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__ |
# define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__ |
# define GC_EXTRA_PARAMS GC_word ra, GC_CONST char * descr_string, |
# define GC_EXTRA_PARAMS GC_word ra, GC_CONST char * s, int i |
int descr_int |
|
#else |
#else |
# define GC_EXTRAS __FILE__, __LINE__ |
# define GC_EXTRAS __FILE__, __LINE__ |
# define GC_EXTRA_PARAMS GC_CONST char * descr_string, int descr_int |
# define GC_EXTRA_PARAMS GC_CONST char * s, int i |
#endif |
#endif |
|
|
/* Debugging (annotated) allocation. GC_gcollect will check */ |
/* Debugging (annotated) allocation. GC_gcollect will check */ |
Line 387 GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_ |
|
Line 406 GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_ |
|
GC_debug_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) \ |
# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \ |
GC_debug_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_MALLOC_STUBBORN(sz) GC_debug_malloc_stubborn(sz, GC_EXTRAS); |
# define GC_MALLOC_STUBBORN(sz) GC_debug_malloc_stubborn(sz, GC_EXTRAS); |
# define GC_CHANGE_STUBBORN(p) GC_debug_change_stubborn(p) |
# define GC_CHANGE_STUBBORN(p) GC_debug_change_stubborn(p) |
# define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p) |
# define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p) |
Line 403 GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_ |
|
Line 424 GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_ |
|
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) \ |
# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \ |
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_MALLOC_STUBBORN(sz) GC_malloc_stubborn(sz) |
# define GC_MALLOC_STUBBORN(sz) GC_malloc_stubborn(sz) |
# define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p) |
# define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p) |
# define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p) |
# define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p) |
Line 481 GC_API void GC_debug_register_finalizer_ignore_self |
|
Line 504 GC_API void GC_debug_register_finalizer_ignore_self |
|
GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, |
GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, |
GC_finalization_proc *ofn, GC_PTR *ocd)); |
GC_finalization_proc *ofn, GC_PTR *ocd)); |
|
|
|
/* Another version of the above. It ignores all cycles. */ |
|
/* It should probably only be used by Java implementations. */ |
|
GC_API void GC_register_finalizer_no_order |
|
GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, |
|
GC_finalization_proc *ofn, GC_PTR *ocd)); |
|
GC_API void GC_debug_register_finalizer_no_order |
|
GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, |
|
GC_finalization_proc *ofn, GC_PTR *ocd)); |
|
|
|
|
/* The following routine may be used to break cycles between */ |
/* The following routine may be used to break cycles between */ |
/* finalizable objects, thus causing cyclic finalizable */ |
/* finalizable objects, thus causing cyclic finalizable */ |
/* objects to be finalized in the correct order. Standard */ |
/* objects to be finalized in the correct order. Standard */ |
Line 537 GC_API int GC_unregister_disappearing_link GC_PROTO((G |
|
Line 570 GC_API int GC_unregister_disappearing_link GC_PROTO((G |
|
GC_API GC_PTR GC_make_closure GC_PROTO((GC_finalization_proc fn, GC_PTR data)); |
GC_API GC_PTR GC_make_closure GC_PROTO((GC_finalization_proc fn, GC_PTR data)); |
GC_API void GC_debug_invoke_finalizer GC_PROTO((GC_PTR obj, GC_PTR data)); |
GC_API void GC_debug_invoke_finalizer GC_PROTO((GC_PTR obj, GC_PTR data)); |
|
|
|
/* Returns !=0 if GC_invoke_finalizers has something to do. */ |
|
GC_API int GC_should_invoke_finalizers GC_PROTO((void)); |
|
|
GC_API int GC_invoke_finalizers GC_PROTO((void)); |
GC_API int GC_invoke_finalizers GC_PROTO((void)); |
/* Run finalizers for all objects that are ready to */ |
/* Run finalizers for all objects that are ready to */ |
/* be finalized. Return the number of finalizers */ |
/* be finalized. Return the number of finalizers */ |
Line 700 GC_API void (*GC_is_visible_print_proc) |
|
Line 736 GC_API void (*GC_is_visible_print_proc) |
|
# endif /* SOLARIS_THREADS */ |
# endif /* SOLARIS_THREADS */ |
|
|
|
|
#if defined(IRIX_THREADS) || defined(LINUX_THREADS) || defined(HPUX_THREADS) |
#if !defined(USE_LD_WRAP) && \ |
|
(defined(IRIX_THREADS) || defined(LINUX_THREADS) || defined(HPUX_THREADS)) |
/* We treat these similarly. */ |
/* We treat these similarly. */ |
# include <pthread.h> |
# include <pthread.h> |
# include <signal.h> |
# include <signal.h> |
Line 714 GC_API void (*GC_is_visible_print_proc) |
|
Line 751 GC_API void (*GC_is_visible_print_proc) |
|
# define pthread_create GC_pthread_create |
# define pthread_create GC_pthread_create |
# define pthread_sigmask GC_pthread_sigmask |
# define pthread_sigmask GC_pthread_sigmask |
# define pthread_join GC_pthread_join |
# define pthread_join GC_pthread_join |
|
# define dlopen GC_dlopen |
|
|
#endif /* IRIX_THREADS || LINUX_THREADS */ |
#endif /* xxxxx_THREADS */ |
|
|
# if defined(PCR) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ |
# if defined(PCR) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ |
defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ |
defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ |