Use version 6.8 of the Boehm-Weiser garbage collector (solves some memory leaks in OSX)

This commit is contained in:
jgarcia 2007-01-20 11:38:38 +00:00
parent 7d65881610
commit 5a57d634a0
14 changed files with 214 additions and 50 deletions

View file

@ -43,6 +43,8 @@ ECL 1.0:
C functions and create C callbacks without the C compiler being around).
(initial code by M. Goffioul)
- Using version 6.8 of the Boehm-Weiser garbage collector.
* Bugs fixed:
- STREAMP signals an error for Gray streams.

44
src/gc/configure vendored
View file

@ -1,7 +1,7 @@
#! /bin/sh
# From configure.in Revision: 1.2 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.59 for gc 6.7.
# Generated by GNU Autoconf 2.59 for gc 6.8.
#
# Report bugs to <Hans.Boehm@hp.com>.
#
@ -429,8 +429,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='gc'
PACKAGE_TARNAME='gc'
PACKAGE_VERSION='6.7'
PACKAGE_STRING='gc 6.7'
PACKAGE_VERSION='6.8'
PACKAGE_STRING='gc 6.8'
PACKAGE_BUGREPORT='Hans.Boehm@hp.com'
ac_unique_file="gcj_mlc.c"
@ -956,7 +956,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures gc 6.7 to adapt to many kinds of systems.
\`configure' configures gc 6.8 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1023,7 +1023,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of gc 6.7:";;
short | recursive ) echo "Configuration of gc 6.8:";;
esac
cat <<\_ACEOF
@ -1167,7 +1167,7 @@ fi
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
gc configure 6.7
gc configure 6.8
generated by GNU Autoconf 2.59
Copyright (C) 2003 Free Software Foundation, Inc.
@ -1181,7 +1181,7 @@ cat >&5 <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by gc $as_me 6.7, which was
It was created by gc $as_me 6.8, which was
generated by GNU Autoconf 2.59. Invocation command line was
$ $0 $@
@ -1953,7 +1953,7 @@ fi
# Define the identity of the package.
PACKAGE='gc'
VERSION='6.7'
VERSION='6.8'
cat >>confdefs.h <<_ACEOF
@ -4008,9 +4008,9 @@ _ACEOF
_ACEOF
;;
*-*-hpux*)
{ echo "$as_me:$LINENO: WARNING: \"Only HP/UX 11 threads are supported.\"" >&5
echo "$as_me: WARNING: \"Only HP/UX 11 threads are supported.\"" >&2;}
*-*-hpux11*)
{ echo "$as_me:$LINENO: WARNING: \"Only HP-UX 11 POSIX threads are supported.\"" >&5
echo "$as_me: WARNING: \"Only HP-UX 11 POSIX threads are supported.\"" >&2;}
cat >>confdefs.h <<\_ACEOF
#define GC_HPUX_THREADS 1
_ACEOF
@ -4030,6 +4030,16 @@ _ACEOF
_ACEOF
THREADDLLIBS="-lpthread -lrt"
# HPUX needs REENTRANT for the _r calls.
cat >>confdefs.h <<\_ACEOF
#define _REENTRANT 1
_ACEOF
;;
*-*-hpux10*)
{ echo "$as_me:$LINENO: WARNING: \"Only HP-UX 11 POSIX threads are supported.\"" >&5
echo "$as_me: WARNING: \"Only HP-UX 11 POSIX threads are supported.\"" >&2;}
;;
*-*-freebsd*)
{ echo "$as_me:$LINENO: WARNING: \"FreeBSD does not yet fully support threads with Boehm GC.\"" >&5
@ -6069,7 +6079,7 @@ test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
case $host in
*-*-irix6*)
# Find out which ABI we are using.
echo '#line 6072 "configure"' > conftest.$ac_ext
echo '#line 6082 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@ -6642,7 +6652,7 @@ chmod -w .
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
compiler_c_o=no
if { (eval echo configure:6645: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
if { (eval echo configure:6655: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
if test -s out/conftest.err; then
@ -8569,7 +8579,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 8572 "configure"
#line 8582 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -8667,7 +8677,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 8670 "configure"
#line 8680 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -10289,7 +10299,7 @@ _ASBOX
} >&5
cat >&5 <<_CSEOF
This file was extended by gc $as_me 6.7, which was
This file was extended by gc $as_me 6.8, which was
generated by GNU Autoconf 2.59. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -10347,7 +10357,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
gc config.status 6.7
gc config.status 6.8
configured by $0, generated by GNU Autoconf 2.59,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"

View file

@ -17,7 +17,7 @@ dnl Process this file with autoconf to produce configure.
# Initialization
# ==============
AC_INIT(gc,6.7,Hans.Boehm@hp.com)
AC_INIT(gc,6.8,Hans.Boehm@hp.com)
## version must conform to [0-9]+[.][0-9]+(alpha[0-9]+)?
AC_CONFIG_SRCDIR(gcj_mlc.c)
AC_CANONICAL_TARGET
@ -94,8 +94,8 @@ case "$THREADS" in
AC_DEFINE(GC_AIX_THREADS)
AC_DEFINE(_REENTRANT)
;;
*-*-hpux*)
AC_MSG_WARN("Only HP/UX 11 threads are supported.")
*-*-hpux11*)
AC_MSG_WARN("Only HP-UX 11 POSIX threads are supported.")
AC_DEFINE(GC_HPUX_THREADS)
AC_DEFINE(_POSIX_C_SOURCE,199506L)
if test "${enable_parallel_mark}" = yes; then
@ -103,6 +103,11 @@ case "$THREADS" in
fi
AC_DEFINE(THREAD_LOCAL_ALLOC)
THREADDLLIBS="-lpthread -lrt"
# HPUX needs REENTRANT for the _r calls.
AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads])
;;
*-*-hpux10*)
AC_MSG_WARN("Only HP-UX 11 POSIX threads are supported.")
;;
*-*-freebsd*)
AC_MSG_WARN("FreeBSD does not yet fully support threads with Boehm GC.")
@ -110,6 +115,17 @@ case "$THREADS" in
INCLUDES="$INCLUDES -pthread"
THREADDLLIBS=-pthread
;;
*-*-kfreebsd*-gnu)
AC_DEFINE(GC_FREEBSD_THREADS)
INCLUDES="$INCLUDES -pthread"
THREADDLLIBS=-pthread
AC_DEFINE(_REENTRANT)
if test "${enable_parallel_mark}" = yes; then
AC_DEFINE(PARALLEL_MARK)
fi
AC_DEFINE(THREAD_LOCAL_ALLOC)
AC_DEFINE(USE_COMPILER_TLS)
;;
*-*-netbsd*)
AC_MSG_WARN("Only on NetBSD 2.0 or later.")
AC_DEFINE(GC_NETBSD_THREADS)

View file

@ -169,6 +169,7 @@ void GC_push_all_stacks() {
void GC_push_all_stacks() {
int i;
task_t my_task;
kern_return_t r;
mach_port_t me;
ptr_t lo, hi;
@ -178,7 +179,8 @@ void GC_push_all_stacks() {
me = mach_thread_self();
if (!GC_thr_initialized) GC_thr_init();
r = task_threads(current_task(), &act_list, &listcount);
my_task = current_task();
r = task_threads(my_task, &act_list, &listcount);
if(r != KERN_SUCCESS) ABORT("task_threads failed");
for(i = 0; i < listcount; i++) {
thread_act_t thread = act_list[i];
@ -268,8 +270,10 @@ void GC_push_all_stacks() {
);
# endif
GC_push_all_stack(lo, hi);
mach_port_deallocate(my_task, thread);
} /* for(p=GC_threads[i]...) */
vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t) * listcount);
vm_deallocate(my_task, (vm_address_t)act_list, sizeof(thread_t) * listcount);
mach_port_deallocate(my_task, me);
}
#endif /* !DARWIN_DONT_PARSE_STACK */
@ -363,6 +367,7 @@ int GC_suspend_thread_list(thread_act_array_t act_list, int count,
}
if (!found) GC_mach_threads_count++;
}
mach_port_deallocate(current_task(), my_thread);
return changed;
}
@ -372,6 +377,7 @@ void GC_stop_world()
{
int i, changes;
GC_thread p;
task_t my_task = current_task();
mach_port_t my_thread = mach_thread_self();
kern_return_t kern_result;
thread_act_array_t act_list, prev_list;
@ -407,13 +413,21 @@ void GC_stop_world()
prevcount = 0;
do {
int result;
kern_result = task_threads(current_task(), &act_list, &listcount);
kern_result = task_threads(my_task, &act_list, &listcount);
result = GC_suspend_thread_list(act_list, listcount,
prev_list, prevcount);
changes = result;
prev_list = act_list;
prevcount = listcount;
vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t) * listcount);
if(kern_result == KERN_SUCCESS) {
int i;
for(i = 0; i < listcount; i++)
mach_port_deallocate(my_task, act_list[i]);
vm_deallocate(my_task, (vm_address_t)act_list, sizeof(thread_t) * listcount);
}
} while (changes);
@ -430,12 +444,15 @@ void GC_stop_world()
#if DEBUG_THREADS
GC_printf1("World stopped from 0x%lx\n", my_thread);
#endif
mach_port_deallocate(my_task, my_thread);
}
/* Caller holds allocation lock, and has held it continuously since */
/* the world stopped. */
void GC_start_world()
{
task_t my_task = current_task();
mach_port_t my_thread = mach_thread_self();
int i, j;
GC_thread p;
@ -456,7 +473,7 @@ void GC_start_world()
}
# endif
kern_result = task_threads(current_task(), &act_list, &listcount);
kern_result = task_threads(my_task, &act_list, &listcount);
for(i = 0; i < listcount; i++) {
thread_act_t thread = act_list[i];
if (thread != my_thread &&
@ -484,8 +501,12 @@ void GC_start_world()
}
}
}
mach_port_deallocate(my_task, thread);
}
vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t) * listcount);
vm_deallocate(my_task, (vm_address_t)act_list, sizeof(thread_t) * listcount);
mach_port_deallocate(my_task, my_thread);
# if DEBUG_THREADS
GC_printf0("World started\n");
# endif

View file

@ -28,7 +28,7 @@ are GPL'ed, but with an exception that should cover all uses in the
collector. (If you are concerned about such things, I recommend you look
at the notice in config.guess or ltmain.sh.)
This is version 6.7 of a conservative garbage collector for C and C++.
This is version 6.8 of a conservative garbage collector for C and C++.
You might find a more recent version of this at

View file

@ -2284,6 +2284,22 @@ Since 6.6:
- Fix Makefile.am, so it handles exe extensions under Cygwin correctly
for gctest.
Since 6.7:
- Added some support for Dragonfly BSD. (Thanks to Joerg Sonnenberger and
Thomas Klausner.)
- Improvements to the HP/UX section of configure.in.
(Thanks to Andreas Tobler.)
- GC_unix_get_mem could neglect to release the malloc lock on Irix, under
extremely unlikely circumstances. Thanks to Jean-Baptiste Nivois for
some careful code reading.
- Added support for kFreeBSD + glibc (Thanks to Petr Salinger)
- Fix more MacOS threads memory leaks (Thanks to Allan Hsu)
- Added initial Solaris/X86-64 support (Thanks to Rainer Orth)
- Applied a long-lost MINGW patch from Gerard Allan for malloc redirection
with threads. This one probably makes no sense for 7.0, and was not applied
there.
- The Solaris/SPARC definition of GC_INIT() in gc.h wasn't C++-compilable.
To do:
- The USE_MUNMAP code should really use a separate data structure
indexed by physical page to keep track of time since last use of

View file

@ -26,7 +26,7 @@
* None of this is safe with dlclose and incremental collection.
* But then not much of anything is safe in the presence of dlclose.
*/
#if defined(__linux__) && !defined(_GNU_SOURCE)
#if (defined(__linux__) || defined(__GLIBC__)) && !defined(_GNU_SOURCE)
/* Can't test LINUX, since this must be define before other includes */
# define _GNU_SOURCE
#endif
@ -381,7 +381,7 @@ GC_bool GC_register_main_static_data()
/* For glibc 2.2.4+. Unfortunately, it doesn't work for older */
/* versions. Thanks to Jakub Jelinek for most of the code. */
# if defined(LINUX) /* Are others OK here, too? */ \
# if (defined(LINUX) || defined (__GLIBC__)) /* Are others OK here, too? */ \
&& (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
|| (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))

View file

@ -469,7 +469,7 @@ GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb));
# define GC_RETURN_ADDR (GC_word)__return_address
#endif
#ifdef __linux__
#if defined(__linux__) || defined(__GLIBC__)
# include <features.h>
# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \
&& !defined(__ia64__)
@ -498,7 +498,7 @@ GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb));
/* This may also be desirable if it is possible but expensive to */
/* retrieve the call chain. */
#if (defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__) \
|| defined(__FreeBSD__)) & !defined(GC_CAN_SAVE_CALL_STACKS)
|| defined(__FreeBSD__) || defined(__DragonFly__)) & !defined(GC_CAN_SAVE_CALL_STACKS)
# define GC_ADD_CALLER
# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
/* gcc knows how to retrieve return address, but we don't know */
@ -750,7 +750,7 @@ GC_API int GC_invoke_finalizers GC_PROTO((void));
/* be finalized. Return the number of finalizers */
/* that were run. Normally this is also called */
/* implicitly during some allocations. If */
/* GC-finalize_on_demand is nonzero, it must be called */
/* GC_finalize_on_demand is nonzero, it must be called */
/* explicitly. */
/* GC_set_warn_proc can be used to redirect or filter warning messages. */
@ -945,16 +945,14 @@ extern void GC_thr_init GC_PROTO((void));/* Needed for Solaris/X86 */
* from the statically loaded program section.
* This circumvents a Solaris 2.X (X<=4) linker bug.
*/
extern int _end[], _etext[];
# ifdef __cplusplus
# define GC_INIT() { extern int _end[], _etext[]; \
extern "C" void GC_noop1(GC_word); \
GC_noop1((GC_word)_end); \
GC_noop1((GC_word)_etext); }
extern "C" void GC_noop1(GC_word);
# else
# define GC_INIT() { extern int _end[], _etext[]; \
extern void GC_noop(); \
GC_noop(_end, _etext); }
void GC_noop1();
# endif /* !__cplusplus */
# define GC_INIT() { GC_noop1((GC_word)_end); \
GC_noop1((GC_word)_etext); }
#else
# if defined(__CYGWIN32__) || defined (_AIX)
/*

View file

@ -92,7 +92,7 @@
# define GC_DARWIN_THREADS
# define GC_PTHREADS
# endif
# if !defined(GC_PTHREADS) && defined(__FreeBSD__)
# if !defined(GC_PTHREADS) && (defined(__FreeBSD__) || defined(__DragonFly__))
# define GC_FREEBSD_THREADS
# define GC_PTHREADS
# endif

View file

@ -55,7 +55,8 @@
# endif
/* And one for FreeBSD: */
# if defined(__FreeBSD__) && !defined(FREEBSD)
# if (defined(__FreeBSD__) || defined(__DragonFly__) || \
defined(__FreeBSD_kernel__)) && !defined(FREEBSD)
# define FREEBSD
# endif
@ -153,6 +154,11 @@
# define SUNOS5
# define mach_type_known
# endif
# if defined(sun) && defined(__amd64)
# define X86_64
# define SOLARIS
# define mach_type_known
# endif
# if (defined(__OS2__) || defined(__EMX__)) && defined(__32BIT__)
# define I386
# define OS2
@ -174,7 +180,8 @@
# define mach_type_known
# endif
# if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \
&& !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__FreeBSD__)
&& !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__FreeBSD__) \
&& !defined(__DragonFly__)
# define SPARC
# define DRSNX
# define mach_type_known
@ -1249,8 +1256,15 @@
# ifndef GC_FREEBSD_THREADS
# define MPROTECT_VDB
# endif
# define SIG_SUSPEND SIGUSR1
# define SIG_THR_RESTART SIGUSR2
# ifdef __GLIBC__
# define SIG_SUSPEND (32+6)
# define SIG_THR_RESTART (32+5)
extern int _end[];
# define DATAEND (_end)
# else
# define SIG_SUSPEND SIGUSR1
# define SIG_THR_RESTART SIGUSR2
# endif
# define FREEBSD_STACKBOTTOM
# ifdef __ELF__
# define DYNAMIC_LOADING
@ -1993,6 +2007,28 @@
# define PREFETCH_FOR_WRITE(x) __builtin_prefetch((x), 1)
# endif
# endif
# ifdef FREEBSD
# define OS_TYPE "FREEBSD"
# ifndef GC_FREEBSD_THREADS
# define MPROTECT_VDB
# endif
# ifdef __GLIBC__
# define SIG_SUSPEND (32+6)
# define SIG_THR_RESTART (32+5)
extern int _end[];
# define DATAEND (_end)
# else
# define SIG_SUSPEND SIGUSR1
# define SIG_THR_RESTART SIGUSR2
# endif
# define FREEBSD_STACKBOTTOM
# ifdef __ELF__
# define DYNAMIC_LOADING
# endif
extern char etext[];
extern char * GC_FreeBSDGetDataStart();
# define DATASTART GC_FreeBSDGetDataStart(0x1000, &etext)
# endif
# ifdef NETBSD
# define OS_TYPE "NETBSD"
# ifdef __ELF__
@ -2002,6 +2038,47 @@
extern char etext[];
# define SEARCH_FOR_DATA_START
# endif
# ifdef SOLARIS
# define OS_TYPE "SOLARIS"
# define ELF_CLASS ELFCLASS64
extern int _etext[], _end[];
extern ptr_t GC_SysVGetDataStart(size_t, ptr_t);
# define DATASTART GC_SysVGetDataStart(0x1000, (ptr_t)_etext)
# define DATAEND (_end)
/* # define STACKBOTTOM ((ptr_t)(_start)) worked through 2.7, */
/* but reportedly breaks under 2.8. It appears that the stack */
/* base is a property of the executable, so this should not break */
/* old executables. */
/* HEURISTIC2 probably works, but this appears to be preferable. */
/* Apparently USRSTACK is defined to be USERLIMIT, but in some */
/* installations that's undefined. We work around this with a */
/* gross hack: */
# include <sys/vmparam.h>
# ifdef USERLIMIT
/* This should work everywhere, but doesn't. */
# define STACKBOTTOM USRSTACK
# else
# define HEURISTIC2
# endif
/* At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */
/* It appears to be fixed in 2.8 and 2.9. */
# ifdef SOLARIS25_PROC_VDB_BUG_FIXED
# define PROC_VDB
# endif
# define DYNAMIC_LOADING
# if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
# define USE_MMAP
/* Otherwise we now use calloc. Mmap may result in the */
/* heap interleaved with thread stacks, which can result in */
/* excessive blacklisting. Sbrk is unusable since it */
/* doesn't interact correctly with the system malloc. */
# endif
# ifdef USE_MMAP
# define HEAP_START (ptr_t)0x40000000
# else
# define HEAP_START DATAEND
# endif
# endif
# endif
#if defined(LINUX) && defined(USE_MMAP)
@ -2064,7 +2141,8 @@
# define SUNOS5SIGS
# endif
# if defined(FREEBSD) && (__FreeBSD__ >= 4)
# if defined(FREEBSD) && \
(defined(__DragonFly__) || __FreeBSD__ >= 4 || (__FreeBSD_kernel__ >= 4))
# define SUNOS5SIGS
# endif
@ -2132,7 +2210,7 @@
# define CACHE_LINE_SIZE 32 /* Wild guess */
# endif
# ifdef LINUX
# if defined(LINUX) || defined(__GLIBC__)
# define REGISTER_LIBRARIES_EARLY
/* We sometimes use dl_iterate_phdr, which may acquire an internal */
/* lock. This isn't safe after the world has stopped. So we must */
@ -2216,7 +2294,7 @@
#if defined(SPARC)
# define CAN_SAVE_CALL_ARGS
#endif
#if (defined(I386) || defined(X86_64)) && defined(LINUX)
#if (defined(I386) || defined(X86_64)) && (defined(LINUX) || defined(__GLIBC__))
/* SAVE_CALL_CHAIN is supported if the code is compiled to save */
/* frame pointers by default, i.e. no -fomit-frame-pointer flag. */
# define CAN_SAVE_CALL_ARGS

View file

@ -355,6 +355,12 @@ DCL_LOCK_STATE;
size_t lb;
# endif
{
# if defined(GC_WIN32_THREADS) && defined(__GNUC__)
/* According to Gerard Allen, this helps with MINGW. */
/* When using threads need to initalised before use, but GCC uses a malloc
in __w32_sharedptr_initialize (w32-shared-ptr.c) */
if (!GC_is_initialized) GC_init();
# endif
/* It might help to manually inline the GC_malloc call here. */
/* But any decent compiler should reduce the extra procedure call */
/* to at most a jump instruction in this case. */

View file

@ -1626,13 +1626,20 @@ word bytes;
ptr_t cur_brk = (ptr_t)sbrk(0);
SBRK_ARG_T lsbs = (word)cur_brk & (GC_page_size-1);
if ((SBRK_ARG_T)bytes < 0) return(0); /* too big */
if ((SBRK_ARG_T)bytes < 0) {
result = 0; /* too big */
goto out;
}
if (lsbs != 0) {
if((ptr_t)sbrk(GC_page_size - lsbs) == (ptr_t)(-1)) return(0);
if((ptr_t)sbrk(GC_page_size - lsbs) == (ptr_t)(-1)) {
result = 0;
goto out;
}
}
result = (ptr_t)sbrk((SBRK_ARG_T)bytes);
if (result == (ptr_t)(-1)) result = 0;
}
out:
# ifdef IRIX5
__UNLOCK_MALLOC();
# endif

View file

@ -598,6 +598,11 @@ void GC_delete_thread(pthread_t id)
} else {
prev -> next = p -> next;
}
#ifdef GC_DARWIN_THREADS
mach_port_deallocate(mach_task_self(), p->stop_info.mach_thread);
#endif
GC_INTERNAL_FREE(p);
}
@ -620,6 +625,11 @@ void GC_delete_gc_thread(pthread_t id, GC_thread gc_id)
} else {
prev -> next = p -> next;
}
#ifdef GC_DARWIN_THREADS
mach_port_deallocate(mach_task_self(), p->stop_info.mach_thread);
#endif
GC_INTERNAL_FREE(p);
}

View file

@ -2,7 +2,7 @@
/* Eventually this one may become unnecessary. For now we need */
/* it to keep the old-style build process working. */
#define GC_TMP_VERSION_MAJOR 6
#define GC_TMP_VERSION_MINOR 7
#define GC_TMP_VERSION_MINOR 8
#define GC_TMP_ALPHA_VERSION GC_NOT_ALPHA
#ifndef GC_NOT_ALPHA