Commit 85f29b3b by Tom Tromey

This commit was generated by cvs2svn to compensate for changes in r30327,

which included commits to RCS files with non-trunk default branches.

From-SVN: r30328
parent fd6a6309
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
* This interface is fairly big, largely for performance reasons. * This interface is fairly big, largely for performance reasons.
* The most basic constants and functions: * The most basic constants and functions:
* *
* CORD - the type fo a cord; * CORD - the type of a cord;
* CORD_EMPTY - empty cord; * CORD_EMPTY - empty cord;
* CORD_len(cord) - length of a cord; * CORD_len(cord) - length of a cord;
* CORD_cat(cord1,cord2) - concatenation of two cords; * CORD_cat(cord1,cord2) - concatenation of two cords;
......
...@@ -582,7 +582,7 @@ CORD CORD_from_file_lazy_inner(FILE * f, size_t len) ...@@ -582,7 +582,7 @@ CORD CORD_from_file_lazy_inner(FILE * f, size_t len)
state -> lf_cache[i] = 0; state -> lf_cache[i] = 0;
} }
state -> lf_current = 0; state -> lf_current = 0;
GC_register_finalizer(state, CORD_lf_close_proc, 0, 0, 0); GC_REGISTER_FINALIZER(state, CORD_lf_close_proc, 0, 0, 0);
return(CORD_from_fn(CORD_lf_func, state, len)); return(CORD_from_fn(CORD_lf_func, state, len));
} }
......
...@@ -58,9 +58,11 @@ ...@@ -58,9 +58,11 @@
# if defined(__STDC__) || defined(__cplusplus) # if defined(__STDC__) || defined(__cplusplus)
# define GC_PROTO(args) args # define GC_PROTO(args) args
typedef void * GC_PTR; typedef void * GC_PTR;
# define GC_CONST const
# else # else
# define GC_PROTO(args) () # define GC_PROTO(args) ()
typedef char * GC_PTR; typedef char * GC_PTR;
# define GC_CONST
# endif # endif
# ifdef __cplusplus # ifdef __cplusplus
...@@ -96,11 +98,31 @@ GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested)); ...@@ -96,11 +98,31 @@ GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested));
/* pointer to a previously allocated heap */ /* pointer to a previously allocated heap */
/* object. */ /* object. */
GC_API int GC_find_leak;
/* Do not actually garbage collect, but simply */
/* report inaccessible memory that was not */
/* deallocated with GC_free. Initial value */
/* is determined by FIND_LEAK macro. */
GC_API int GC_quiet; /* Disable statistics output. Only matters if */ GC_API int GC_quiet; /* Disable statistics output. Only matters if */
/* collector has been compiled with statistics */ /* collector has been compiled with statistics */
/* enabled. This involves a performance cost, */ /* enabled. This involves a performance cost, */
/* and is thus not the default. */ /* and is thus not the default. */
GC_API int GC_finalize_on_demand;
/* If nonzero, finalizers will only be run in */
/* response to an eplit GC_invoke_finalizers */
/* call. The default is determined by whether */
/* the FINALIZE_ON_DEMAND macro is defined */
/* when the collector is built. */
GC_API int GC_java_finalization;
/* Mark objects reachable from finalizable */
/* objects in a separate postpass. This makes */
/* it a bit safer to use non-topologically- */
/* ordered finalization. Default value is */
/* determined by JAVA_FINALIZATION macro. */
GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */ GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */
/* because it's not safe. */ /* because it's not safe. */
...@@ -111,6 +133,12 @@ GC_API int GC_dont_expand; ...@@ -111,6 +133,12 @@ GC_API int GC_dont_expand;
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. */
/* Full collections are also triggered if */
/* the collector detects a substantial */
/* increase in the number of in-use heap */
/* blocks. Values in the tens are now */
/* perfectly reasonable, unlike for */
/* earlier GC versions. */
GC_API GC_word GC_non_gc_bytes; GC_API GC_word GC_non_gc_bytes;
/* Bytes not considered candidates for collection. */ /* Bytes not considered candidates for collection. */
...@@ -277,6 +305,9 @@ GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func)); ...@@ -277,6 +305,9 @@ GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func));
/* Includes some pages that were allocated but never written. */ /* Includes some pages that were allocated but never written. */
GC_API size_t GC_get_heap_size GC_PROTO((void)); GC_API size_t GC_get_heap_size GC_PROTO((void));
/* Return a lower bound on the number of free bytes in the heap. */
GC_API size_t GC_get_free_bytes GC_PROTO((void));
/* Return the number of bytes allocated since the last collection. */ /* Return the number of bytes allocated since the last collection. */
GC_API size_t GC_get_bytes_since_gc GC_PROTO((void)); GC_API size_t GC_get_bytes_since_gc GC_PROTO((void));
...@@ -321,10 +352,11 @@ GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb)); ...@@ -321,10 +352,11 @@ GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb));
#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, char * descr_string, int descr_int # define GC_EXTRA_PARAMS GC_word ra, GC_CONST char * descr_string,
int descr_int
#else #else
# define GC_EXTRAS __FILE__, __LINE__ # define GC_EXTRAS __FILE__, __LINE__
# define GC_EXTRA_PARAMS char * descr_string, int descr_int # define GC_EXTRA_PARAMS GC_CONST char * descr_string, int descr_int
#endif #endif
/* Debugging (annotated) allocation. GC_gcollect will check */ /* Debugging (annotated) allocation. GC_gcollect will check */
...@@ -510,7 +542,7 @@ GC_API int GC_invoke_finalizers GC_PROTO((void)); ...@@ -510,7 +542,7 @@ GC_API int GC_invoke_finalizers GC_PROTO((void));
/* be finalized. Return the number of finalizers */ /* be finalized. Return the number of finalizers */
/* that were run. Normally this is also called */ /* that were run. Normally this is also called */
/* implicitly during some allocations. If */ /* implicitly during some allocations. If */
/* FINALIZE_ON_DEMAND is defined, it must be called */ /* GC-finalize_on_demand is nonzero, it must be called */
/* explicitly. */ /* explicitly. */
/* GC_set_warn_proc can be used to redirect or filter warning messages. */ /* GC_set_warn_proc can be used to redirect or filter warning messages. */
...@@ -668,7 +700,7 @@ GC_API void (*GC_is_visible_print_proc) ...@@ -668,7 +700,7 @@ GC_API void (*GC_is_visible_print_proc)
# endif /* SOLARIS_THREADS */ # endif /* SOLARIS_THREADS */
#if defined(IRIX_THREADS) || defined(LINUX_THREADS) #if 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>
...@@ -687,11 +719,12 @@ GC_API void (*GC_is_visible_print_proc) ...@@ -687,11 +719,12 @@ GC_API void (*GC_is_visible_print_proc)
# 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) || \
defined(IRIX_JDK_THREADS) defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS)
/* Any flavor of threads except SRC_M3. */ /* Any flavor of threads except SRC_M3. */
/* This returns a list of objects, linked through their first */ /* This returns a list of objects, linked through their first */
/* word. Its use can greatly reduce lock contention problems, since */ /* word. Its use can greatly reduce lock contention problems, since */
/* the allocation lock can be acquired and released many fewer times. */ /* the allocation lock can be acquired and released many fewer times. */
/* lb must be large enough to hold the pointer field. */
GC_PTR GC_malloc_many(size_t lb); GC_PTR GC_malloc_many(size_t lb);
#define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */ #define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */
/* in returned list. */ /* in returned list. */
......
...@@ -43,11 +43,21 @@ ...@@ -43,11 +43,21 @@
# define OPENBSD # define OPENBSD
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(__OpenBSD__) && defined(__sparc__)
# define SPARC
# define OPENBSD
# define mach_type_known
# endif
# if defined(__NetBSD__) && defined(m68k) # if defined(__NetBSD__) && defined(m68k)
# define M68K # define M68K
# define NETBSD # define NETBSD
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(__NetBSD__) && defined(arm32)
# define ARM32
# define NETBSD
# define mach_type_known
# endif
# if defined(vax) # if defined(vax)
# define VAX # define VAX
# ifdef ultrix # ifdef ultrix
...@@ -100,7 +110,8 @@ ...@@ -100,7 +110,8 @@
# endif # endif
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) # if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \
&& !defined(__OpenBSD__)
# define SPARC # define SPARC
# define DRSNX # define DRSNX
# define mach_type_known # define mach_type_known
...@@ -124,15 +135,22 @@ ...@@ -124,15 +135,22 @@
# define SYSV # define SYSV
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) \ # if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0) \
|| defined(hppa) || defined(__hppa__) || defined(hppa) || defined(__hppa__)
# define HP_PA # define HP_PA
# ifndef LINUX
# define HPUX
# endif
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(LINUX) && defined(i386) # if defined(LINUX) && (defined(i386) || defined(__i386__))
# define I386 # define I386
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
# define IA64
# define mach_type_known
# endif
# if defined(LINUX) && defined(powerpc) # if defined(LINUX) && defined(powerpc)
# define POWERPC # define POWERPC
# define mach_type_known # define mach_type_known
...@@ -141,9 +159,8 @@ ...@@ -141,9 +159,8 @@
# define M68K # define M68K
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(linux) && defined(sparc) # if defined(LINUX) && defined(sparc)
# define SPARC # define SPARC
# define LINUX
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(__alpha) || defined(__alpha__) # if defined(__alpha) || defined(__alpha__)
...@@ -153,9 +170,11 @@ ...@@ -153,9 +170,11 @@
# endif # endif
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(_AMIGA) # if defined(_AMIGA) && !defined(AMIGA)
# define M68K
# define AMIGA # define AMIGA
# endif
# ifdef AMIGA
# define M68K
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc) # if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc)
...@@ -168,6 +187,11 @@ ...@@ -168,6 +187,11 @@
# define MACOS # define MACOS
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(macosx)
# define MACOSX
# define POWERPC
# define mach_type_known
# endif
# if defined(NeXT) && defined(mc68000) # if defined(NeXT) && defined(mc68000)
# define M68K # define M68K
# define NEXT # define NEXT
...@@ -241,6 +265,10 @@ ...@@ -241,6 +265,10 @@
# define UTS4 # define UTS4
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(__pj__)
# define PJ
# define mach_type_known
# endif
/* Ivan Demakov */ /* Ivan Demakov */
# if defined(__WATCOMC__) && defined(__386__) # if defined(__WATCOMC__) && defined(__386__)
# define I386 # define I386
...@@ -486,8 +514,8 @@ ...@@ -486,8 +514,8 @@
# ifdef POWERPC # ifdef POWERPC
# define MACH_TYPE "POWERPC" # define MACH_TYPE "POWERPC"
# define ALIGNMENT 2
# ifdef MACOS # ifdef MACOS
# define ALIGNMENT 2 /* Still necessary? Could it be 4? */
# ifndef __LOWMEM__ # ifndef __LOWMEM__
# include <LowMem.h> # include <LowMem.h>
# endif # endif
...@@ -497,14 +525,29 @@ ...@@ -497,14 +525,29 @@
# define DATAEND /* not needed */ # define DATAEND /* not needed */
# endif # endif
# ifdef LINUX # ifdef LINUX
# define ALIGNMENT 4 /* Guess. Can someone verify? */
/* This was 2, but that didn't sound right. */
# define OS_TYPE "LINUX" # define OS_TYPE "LINUX"
# define HEURISTIC1 # define HEURISTIC1
# undef STACK_GRAN # undef STACK_GRAN
# define STACK_GRAN 0x10000000 # define STACK_GRAN 0x10000000
/* Stack usually starts at 0x80000000 */
# define DATASTART GC_data_start # define DATASTART GC_data_start
/* Others have reported better success with */
/* extern int __data_start; */
/*# define DATASTART (&__data_start) */
/* and disabling the GC_data_start */
/* initialization code. */
extern int _end; extern int _end;
# define DATAEND (&_end) # define DATAEND (&_end)
# endif # endif
# ifdef MACOSX
# define ALIGNMENT 4
# define OS_TYPE "MACOSX"
# define DATASTART ((ptr_t) get_etext())
# define STACKBOTTOM ((ptr_t) 0xc0000000)
# define DATAEND /* not needed */
# endif
# endif # endif
# ifdef VAX # ifdef VAX
...@@ -603,6 +646,11 @@ ...@@ -603,6 +646,11 @@
# define SVR4 # define SVR4
# define STACKBOTTOM ((ptr_t) 0xf0000000) # define STACKBOTTOM ((ptr_t) 0xf0000000)
# endif # endif
# ifdef OPENBSD
# define OS_TYPE "OPENBSD"
# define STACKBOTTOM ((ptr_t) 0xf8000000)
# define DATASTART ((ptr_t)(&etext))
# endif
# endif # endif
# ifdef I386 # ifdef I386
...@@ -657,10 +705,13 @@ ...@@ -657,10 +705,13 @@
# endif # endif
# ifdef LINUX # ifdef LINUX
# define OS_TYPE "LINUX" # define OS_TYPE "LINUX"
# define STACKBOTTOM ((ptr_t)0xc0000000) # define HEURISTIC1
/* Appears to be 0xe0000000 for at least one 2.1.91 kernel. */ # undef STACK_GRAN
/* Probably needs to be more flexible, but I don't yet */ # define STACK_GRAN 0x10000000
/* fully understand how flexible. */ /* STACKBOTTOM is usually 0xc0000000, but this changes with */
/* different kernel configurations. In particular, systems */
/* with 2GB physical memory will usually move the user */
/* address space limit, and hence initial SP to 0x80000000. */
# if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC) # if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC)
# define MPROTECT_VDB # define MPROTECT_VDB
# else # else
...@@ -862,9 +913,17 @@ ...@@ -862,9 +913,17 @@
# endif # endif
# ifdef HP_PA # ifdef HP_PA
/* OS is assumed to be HP/UX */
# define MACH_TYPE "HP_PA" # define MACH_TYPE "HP_PA"
# define ALIGNMENT 4 # define OS_TYPE "HPUX"
# define ALIGN_DOUBLE # ifdef __LP64__
# define CPP_WORDSZ 64
# define ALIGNMENT 8
# else
# define CPP_WORDSZ 32
# define ALIGNMENT 4
# define ALIGN_DOUBLE
# endif
extern int __data_start; extern int __data_start;
# define DATASTART ((ptr_t)(&__data_start)) # define DATASTART ((ptr_t)(&__data_start))
# if 0 # if 0
...@@ -881,6 +940,9 @@ ...@@ -881,6 +940,9 @@
# endif # endif
# define STACK_GROWS_UP # define STACK_GROWS_UP
# define DYNAMIC_LOADING # define DYNAMIC_LOADING
# ifndef HPUX_THREADS
# define MPROTECT_VDB
# endif
# include <unistd.h> # include <unistd.h>
# define GETPAGESIZE() sysconf(_SC_PAGE_SIZE) # define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
/* They misspelled the Posix macro? */ /* They misspelled the Posix macro? */
...@@ -909,9 +971,13 @@ ...@@ -909,9 +971,13 @@
# define CPP_WORDSZ 64 # define CPP_WORDSZ 64
# define STACKBOTTOM ((ptr_t) 0x120000000) # define STACKBOTTOM ((ptr_t) 0x120000000)
# ifdef __ELF__ # ifdef __ELF__
# if 0
/* __data_start apparently disappeared in some recent releases. */
extern int __data_start; extern int __data_start;
# define DATASTART &__data_start # define DATASTART &__data_start
# define DYNAMIC_LOADING # endif
# define DATASTART GC_data_start
# define DYNAMIC_LOADING
# else # else
# define DATASTART ((ptr_t) 0x140000000) # define DATASTART ((ptr_t) 0x140000000)
# endif # endif
...@@ -923,6 +989,31 @@ ...@@ -923,6 +989,31 @@
# endif # endif
# endif # endif
# ifdef IA64
# define MACH_TYPE "IA64"
# define ALIGN_DOUBLE
/* Requires 16 byte alignment for malloc */
# define ALIGNMENT 8
# ifdef HPUX
--> needs work
# endif
# ifdef LINUX
# define OS_TYPE "LINUX"
# define CPP_WORDSZ 64
/* This should really be done through /proc, but that */
/* requires we run on an IA64 kernel. */
# define STACKBOTTOM ((ptr_t) 0xa000000000000000l)
/* We also need the base address of the register stack */
/* backing store. There is probably a better way to */
/* get that, too ... */
# define BACKING_STORE_BASE ((ptr_t) 0x9fffffff80000000l)
# define DATASTART GC_data_start
# define DYNAMIC_LOADING
extern int _end;
# define DATAEND (&_end)
# endif
# endif
# ifdef M88K # ifdef M88K
# define MACH_TYPE "M88K" # define MACH_TYPE "M88K"
# define ALIGNMENT 4 # define ALIGNMENT 4
...@@ -953,6 +1044,26 @@ ...@@ -953,6 +1044,26 @@
# define HEURISTIC2 # define HEURISTIC2
# endif # endif
# if defined(PJ)
# define ALIGNMENT 4
extern int _etext;
# define DATASTART ((ptr_t)(&_etext))
# define HEURISTIC1
# endif
# ifdef ARM32
# define CPP_WORDSZ 32
# define MACH_TYPE "ARM32"
# define ALIGNMENT 4
# ifdef NETBSD
# define OS_TYPE "NETBSD"
# define HEURISTIC2
extern char etext;
# define DATASTART ((ptr_t)(&etext))
# define USE_GENERIC_PUSH_REGS
# endif
#endif
# ifndef STACK_GROWS_UP # ifndef STACK_GROWS_UP
# define STACK_GROWS_DOWN # define STACK_GROWS_DOWN
# endif # endif
...@@ -995,6 +1106,10 @@ ...@@ -995,6 +1106,10 @@
# define SUNOS5SIGS # define SUNOS5SIGS
# endif # endif
# if defined(HPUX)
# define SUNOS5SIGS
# endif
# if CPP_WORDSZ != 32 && CPP_WORDSZ != 64 # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64
-> bad word size -> bad word size
# endif # endif
...@@ -1021,6 +1136,10 @@ ...@@ -1021,6 +1136,10 @@
# undef MPROTECT_VDB # undef MPROTECT_VDB
# endif # endif
# ifdef USE_MUNMAP
# undef MPROTECT_VDB /* Can't deal with address space holes. */
# endif
# if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB) # if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB)
# define DEFAULT_VDB # define DEFAULT_VDB
# endif # endif
...@@ -1040,10 +1159,13 @@ ...@@ -1040,10 +1159,13 @@
# if defined(SOLARIS_THREADS) && !defined(SUNOS5) # if defined(SOLARIS_THREADS) && !defined(SUNOS5)
--> inconsistent configuration --> inconsistent configuration
# endif # endif
# if defined(HPUX_THREADS) && !defined(HPUX)
--> inconsistent configuration
# endif
# if defined(PCR) || defined(SRC_M3) || \ # if defined(PCR) || defined(SRC_M3) || \
defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \
defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ defined(IRIX_THREADS) || defined(LINUX_THREADS) || \
defined(IRIX_JDK_THREADS) defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS)
# define THREADS # define THREADS
# endif # endif
......
...@@ -58,9 +58,11 @@ ...@@ -58,9 +58,11 @@
# if defined(__STDC__) || defined(__cplusplus) # if defined(__STDC__) || defined(__cplusplus)
# define GC_PROTO(args) args # define GC_PROTO(args) args
typedef void * GC_PTR; typedef void * GC_PTR;
# define GC_CONST const
# else # else
# define GC_PROTO(args) () # define GC_PROTO(args) ()
typedef char * GC_PTR; typedef char * GC_PTR;
# define GC_CONST
# endif # endif
# ifdef __cplusplus # ifdef __cplusplus
...@@ -96,11 +98,31 @@ GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested)); ...@@ -96,11 +98,31 @@ GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested));
/* pointer to a previously allocated heap */ /* pointer to a previously allocated heap */
/* object. */ /* object. */
GC_API int GC_find_leak;
/* Do not actually garbage collect, but simply */
/* report inaccessible memory that was not */
/* deallocated with GC_free. Initial value */
/* is determined by FIND_LEAK macro. */
GC_API int GC_quiet; /* Disable statistics output. Only matters if */ GC_API int GC_quiet; /* Disable statistics output. Only matters if */
/* collector has been compiled with statistics */ /* collector has been compiled with statistics */
/* enabled. This involves a performance cost, */ /* enabled. This involves a performance cost, */
/* and is thus not the default. */ /* and is thus not the default. */
GC_API int GC_finalize_on_demand;
/* If nonzero, finalizers will only be run in */
/* response to an eplit GC_invoke_finalizers */
/* call. The default is determined by whether */
/* the FINALIZE_ON_DEMAND macro is defined */
/* when the collector is built. */
GC_API int GC_java_finalization;
/* Mark objects reachable from finalizable */
/* objects in a separate postpass. This makes */
/* it a bit safer to use non-topologically- */
/* ordered finalization. Default value is */
/* determined by JAVA_FINALIZATION macro. */
GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */ GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */
/* because it's not safe. */ /* because it's not safe. */
...@@ -111,6 +133,12 @@ GC_API int GC_dont_expand; ...@@ -111,6 +133,12 @@ GC_API int GC_dont_expand;
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. */
/* Full collections are also triggered if */
/* the collector detects a substantial */
/* increase in the number of in-use heap */
/* blocks. Values in the tens are now */
/* perfectly reasonable, unlike for */
/* earlier GC versions. */
GC_API GC_word GC_non_gc_bytes; GC_API GC_word GC_non_gc_bytes;
/* Bytes not considered candidates for collection. */ /* Bytes not considered candidates for collection. */
...@@ -277,6 +305,9 @@ GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func)); ...@@ -277,6 +305,9 @@ GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func));
/* Includes some pages that were allocated but never written. */ /* Includes some pages that were allocated but never written. */
GC_API size_t GC_get_heap_size GC_PROTO((void)); GC_API size_t GC_get_heap_size GC_PROTO((void));
/* Return a lower bound on the number of free bytes in the heap. */
GC_API size_t GC_get_free_bytes GC_PROTO((void));
/* Return the number of bytes allocated since the last collection. */ /* Return the number of bytes allocated since the last collection. */
GC_API size_t GC_get_bytes_since_gc GC_PROTO((void)); GC_API size_t GC_get_bytes_since_gc GC_PROTO((void));
...@@ -321,10 +352,11 @@ GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb)); ...@@ -321,10 +352,11 @@ GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb));
#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, char * descr_string, int descr_int # define GC_EXTRA_PARAMS GC_word ra, GC_CONST char * descr_string,
int descr_int
#else #else
# define GC_EXTRAS __FILE__, __LINE__ # define GC_EXTRAS __FILE__, __LINE__
# define GC_EXTRA_PARAMS char * descr_string, int descr_int # define GC_EXTRA_PARAMS GC_CONST char * descr_string, int descr_int
#endif #endif
/* Debugging (annotated) allocation. GC_gcollect will check */ /* Debugging (annotated) allocation. GC_gcollect will check */
...@@ -510,7 +542,7 @@ GC_API int GC_invoke_finalizers GC_PROTO((void)); ...@@ -510,7 +542,7 @@ GC_API int GC_invoke_finalizers GC_PROTO((void));
/* be finalized. Return the number of finalizers */ /* be finalized. Return the number of finalizers */
/* that were run. Normally this is also called */ /* that were run. Normally this is also called */
/* implicitly during some allocations. If */ /* implicitly during some allocations. If */
/* FINALIZE_ON_DEMAND is defined, it must be called */ /* GC-finalize_on_demand is nonzero, it must be called */
/* explicitly. */ /* explicitly. */
/* GC_set_warn_proc can be used to redirect or filter warning messages. */ /* GC_set_warn_proc can be used to redirect or filter warning messages. */
...@@ -668,7 +700,7 @@ GC_API void (*GC_is_visible_print_proc) ...@@ -668,7 +700,7 @@ GC_API void (*GC_is_visible_print_proc)
# endif /* SOLARIS_THREADS */ # endif /* SOLARIS_THREADS */
#if defined(IRIX_THREADS) || defined(LINUX_THREADS) #if 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>
...@@ -687,11 +719,12 @@ GC_API void (*GC_is_visible_print_proc) ...@@ -687,11 +719,12 @@ GC_API void (*GC_is_visible_print_proc)
# 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) || \
defined(IRIX_JDK_THREADS) defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS)
/* Any flavor of threads except SRC_M3. */ /* Any flavor of threads except SRC_M3. */
/* This returns a list of objects, linked through their first */ /* This returns a list of objects, linked through their first */
/* word. Its use can greatly reduce lock contention problems, since */ /* word. Its use can greatly reduce lock contention problems, since */
/* the allocation lock can be acquired and released many fewer times. */ /* the allocation lock can be acquired and released many fewer times. */
/* lb must be large enough to hold the pointer field. */
GC_PTR GC_malloc_many(size_t lb); GC_PTR GC_malloc_many(size_t lb);
#define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */ #define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */
/* in returned list. */ /* in returned list. */
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
// //
// This is a C++ header file that is intended to replace the SGI STL // This is a C++ header file that is intended to replace the SGI STL
// alloc.h. // alloc.h. This assumes SGI STL version < 3.0.
// //
// This assumes the collector has been compiled with -DATOMIC_UNCOLLECTABLE // This assumes the collector has been compiled with -DATOMIC_UNCOLLECTABLE
// and -DALL_INTERIOR_POINTERS. We also recommend // and -DALL_INTERIOR_POINTERS. We also recommend
......
...@@ -318,12 +318,10 @@ class traceable_alloc_template { ...@@ -318,12 +318,10 @@ class traceable_alloc_template {
typedef traceable_alloc_template < 0 > traceable_alloc; typedef traceable_alloc_template < 0 > traceable_alloc;
#ifdef _SGI_SOURCE
// We want to specialize simple_alloc so that it does the right thing // We want to specialize simple_alloc so that it does the right thing
// for all pointerfree types. At the moment there is no portable way to // for all pointerfree types. At the moment there is no portable way to
// even approximate that. The following approximation should work for // even approximate that. The following approximation should work for
// SGI compilers, and perhaps some others. // SGI compilers, and recent versions of g++.
# define __GC_SPECIALIZE(T,alloc) \ # define __GC_SPECIALIZE(T,alloc) \
class simple_alloc<T, alloc> { \ class simple_alloc<T, alloc> { \
...@@ -451,6 +449,4 @@ __STL_END_NAMESPACE ...@@ -451,6 +449,4 @@ __STL_END_NAMESPACE
#endif /* __STL_USE_STD_ALLOCATORS */ #endif /* __STL_USE_STD_ALLOCATORS */
#endif /* _SGI_SOURCE */
#endif /* GC_ALLOC_H */ #endif /* GC_ALLOC_H */
...@@ -49,14 +49,16 @@ typedef struct bi { ...@@ -49,14 +49,16 @@ typedef struct bi {
hdr * index[BOTTOM_SZ]; hdr * index[BOTTOM_SZ];
/* /*
* The bottom level index contains one of three kinds of values: * The bottom level index contains one of three kinds of values:
* 0 means we're not responsible for this block. * 0 means we're not responsible for this block,
* or this is a block other than the first one in a free block.
* 1 < (long)X <= MAX_JUMP means the block starts at least * 1 < (long)X <= MAX_JUMP means the block starts at least
* X * HBLKSIZE bytes before the current address. * X * HBLKSIZE bytes before the current address.
* A valid pointer points to a hdr structure. (The above can't be * A valid pointer points to a hdr structure. (The above can't be
* valid pointers due to the GET_MEM return convention.) * valid pointers due to the GET_MEM return convention.)
*/ */
struct bi * asc_link; /* All indices are linked in */ struct bi * asc_link; /* All indices are linked in */
/* ascending order. */ /* ascending order... */
struct bi * desc_link; /* ... and in descending order. */
word key; /* high order address bits. */ word key; /* high order address bits. */
# ifdef HASH_TL # ifdef HASH_TL
struct bi * hash_link; /* Hash chain link. */ struct bi * hash_link; /* Hash chain link. */
......
...@@ -43,6 +43,11 @@ ...@@ -43,6 +43,11 @@
# define OPENBSD # define OPENBSD
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(__OpenBSD__) && defined(__sparc__)
# define SPARC
# define OPENBSD
# define mach_type_known
# endif
# if defined(__NetBSD__) && defined(m68k) # if defined(__NetBSD__) && defined(m68k)
# define M68K # define M68K
# define NETBSD # define NETBSD
...@@ -100,7 +105,8 @@ ...@@ -100,7 +105,8 @@
# endif # endif
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) # if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \
&& !defined(__OpenBSD__)
# define SPARC # define SPARC
# define DRSNX # define DRSNX
# define mach_type_known # define mach_type_known
...@@ -129,7 +135,7 @@ ...@@ -129,7 +135,7 @@
# define HP_PA # define HP_PA
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(LINUX) && defined(i386) # if defined(LINUX) && (defined(i386) || defined(__i386__))
# define I386 # define I386
# define mach_type_known # define mach_type_known
# endif # endif
...@@ -141,9 +147,8 @@ ...@@ -141,9 +147,8 @@
# define M68K # define M68K
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(linux) && defined(sparc) # if defined(LINUX) && defined(sparc)
# define SPARC # define SPARC
# define LINUX
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(__alpha) || defined(__alpha__) # if defined(__alpha) || defined(__alpha__)
...@@ -153,9 +158,11 @@ ...@@ -153,9 +158,11 @@
# endif # endif
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(_AMIGA) # if defined(_AMIGA) && !defined(AMIGA)
# define M68K
# define AMIGA # define AMIGA
# endif
# ifdef AMIGA
# define M68K
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc) # if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc)
...@@ -168,6 +175,11 @@ ...@@ -168,6 +175,11 @@
# define MACOS # define MACOS
# define mach_type_known # define mach_type_known
# endif # endif
# if defined(macosx)
# define MACOSX
# define POWERPC
# define mach_type_known
# endif
# if defined(NeXT) && defined(mc68000) # if defined(NeXT) && defined(mc68000)
# define M68K # define M68K
# define NEXT # define NEXT
...@@ -486,8 +498,8 @@ ...@@ -486,8 +498,8 @@
# ifdef POWERPC # ifdef POWERPC
# define MACH_TYPE "POWERPC" # define MACH_TYPE "POWERPC"
# define ALIGNMENT 2
# ifdef MACOS # ifdef MACOS
# define ALIGNMENT 2 /* Still necessary? Could it be 4? */
# ifndef __LOWMEM__ # ifndef __LOWMEM__
# include <LowMem.h> # include <LowMem.h>
# endif # endif
...@@ -497,14 +509,24 @@ ...@@ -497,14 +509,24 @@
# define DATAEND /* not needed */ # define DATAEND /* not needed */
# endif # endif
# ifdef LINUX # ifdef LINUX
# define ALIGNMENT 4 /* Guess. Can someone verify? */
/* This was 2, but that didn't sound right. */
# define OS_TYPE "LINUX" # define OS_TYPE "LINUX"
# define HEURISTIC1 # define HEURISTIC1
# undef STACK_GRAN # undef STACK_GRAN
# define STACK_GRAN 0x10000000 # define STACK_GRAN 0x10000000
/* Stack usually starts at 0x80000000 */
# define DATASTART GC_data_start # define DATASTART GC_data_start
extern int _end; extern int _end;
# define DATAEND (&_end) # define DATAEND (&_end)
# endif # endif
# ifdef MACOSX
# define ALIGNMENT 4
# define OS_TYPE "MACOSX"
# define DATASTART ((ptr_t) get_etext())
# define STACKBOTTOM ((ptr_t) 0xc0000000)
# define DATAEND /* not needed */
# endif
# endif # endif
# ifdef VAX # ifdef VAX
...@@ -603,6 +625,11 @@ ...@@ -603,6 +625,11 @@
# define SVR4 # define SVR4
# define STACKBOTTOM ((ptr_t) 0xf0000000) # define STACKBOTTOM ((ptr_t) 0xf0000000)
# endif # endif
# ifdef OPENBSD
# define OS_TYPE "OPENBSD"
# define STACKBOTTOM ((ptr_t) 0xf8000000)
# define DATASTART ((ptr_t)(&etext))
# endif
# endif # endif
# ifdef I386 # ifdef I386
...@@ -657,10 +684,13 @@ ...@@ -657,10 +684,13 @@
# endif # endif
# ifdef LINUX # ifdef LINUX
# define OS_TYPE "LINUX" # define OS_TYPE "LINUX"
# define STACKBOTTOM ((ptr_t)0xc0000000) # define HEURISTIC1
/* Appears to be 0xe0000000 for at least one 2.1.91 kernel. */ # undef STACK_GRAN
/* Probably needs to be more flexible, but I don't yet */ # define STACK_GRAN 0x10000000
/* fully understand how flexible. */ /* STACKBOTTOM is usually 0xc0000000, but this changes with */
/* different kernel configurations. In particular, systems */
/* with 2GB physical memory will usually move the user */
/* address space limit, and hence initial SP to 0x80000000. */
# if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC) # if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC)
# define MPROTECT_VDB # define MPROTECT_VDB
# else # else
...@@ -909,9 +939,13 @@ ...@@ -909,9 +939,13 @@
# define CPP_WORDSZ 64 # define CPP_WORDSZ 64
# define STACKBOTTOM ((ptr_t) 0x120000000) # define STACKBOTTOM ((ptr_t) 0x120000000)
# ifdef __ELF__ # ifdef __ELF__
# if 0
/* __data_start apparently disappeared in some recent releases. */
extern int __data_start; extern int __data_start;
# define DATASTART &__data_start # define DATASTART &__data_start
# define DYNAMIC_LOADING # endif
# define DATASTART GC_data_start
# define DYNAMIC_LOADING
# else # else
# define DATASTART ((ptr_t) 0x140000000) # define DATASTART ((ptr_t) 0x140000000)
# endif # endif
...@@ -1021,6 +1055,10 @@ ...@@ -1021,6 +1055,10 @@
# undef MPROTECT_VDB # undef MPROTECT_VDB
# endif # endif
# ifdef USE_MUNMAP
# undef MPROTECT_VDB /* Can't deal with address space holes. */
# endif
# if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB) # if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB)
# define DEFAULT_VDB # define DEFAULT_VDB
# endif # endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment