diff options
Diffstat (limited to 'boehm-gc/malloc.c')
-rw-r--r-- | boehm-gc/malloc.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/boehm-gc/malloc.c b/boehm-gc/malloc.c index 5ac2142..f5c8f06 100644 --- a/boehm-gc/malloc.c +++ b/boehm-gc/malloc.c @@ -182,6 +182,7 @@ register int k; ptr_t result; DCL_LOCK_STATE; + if (GC_have_errors) GC_print_all_errors(); GC_INVOKE_FINALIZERS(); if (SMALL_OBJ(lb)) { DISABLE_SIGNALS(); @@ -294,6 +295,11 @@ DCL_LOCK_STATE; return(GENERAL_MALLOC((word)lb, NORMAL)); } /* See above comment on signals. */ + GC_ASSERT(0 == obj_link(op) + || (word)obj_link(op) + <= (word)GC_greatest_plausible_heap_addr + && (word)obj_link(op) + >= (word)GC_least_plausible_heap_addr); *opp = obj_link(op); obj_link(op) = 0; GC_words_allocd += lw; @@ -338,6 +344,7 @@ DCL_LOCK_STATE; return((GC_PTR)REDIRECT_MALLOC(n*lb)); } +#ifndef strdup # include <string.h> # ifdef __STDC__ char *strdup(const char *s) @@ -346,11 +353,16 @@ DCL_LOCK_STATE; char *s; # endif { - size_t len = strlen + 1; + size_t len = strlen(s) + 1; char * result = ((char *)REDIRECT_MALLOC(len+1)); BCOPY(s, result, len+1); return result; } +#endif /* !defined(strdup) */ + /* If strdup is macro defined, we assume that it actually calls malloc, */ + /* and thus the right thing will happen even without overriding it. */ + /* This seems to be true on most Linux systems. */ + # endif /* REDIRECT_MALLOC */ /* Explicitly deallocate an object p. */ @@ -373,6 +385,7 @@ DCL_LOCK_STATE; /* Required by ANSI. It's not my fault ... */ h = HBLKPTR(p); hhdr = HDR(h); + GC_ASSERT(GC_base(p) == p); # if defined(REDIRECT_MALLOC) && \ (defined(GC_SOLARIS_THREADS) || defined(GC_LINUX_THREADS) \ || defined(__MINGW32__)) /* Should this be MSWIN32 in general? */ @@ -454,7 +467,10 @@ void GC_free_inner(GC_PTR p) } #endif /* THREADS */ -# ifdef REDIRECT_MALLOC +# if defined(REDIRECT_MALLOC) && !defined(REDIRECT_FREE) +# define REDIRECT_FREE GC_free +# endif +# ifdef REDIRECT_FREE # ifdef __STDC__ void free(GC_PTR p) # else @@ -463,7 +479,7 @@ void GC_free_inner(GC_PTR p) # endif { # ifndef IGNORE_FREE - GC_free(p); + REDIRECT_FREE(p); # endif } # endif /* REDIRECT_MALLOC */ |