From ff322eae73fd1f50becb44ba21f7675457b636ef Mon Sep 17 00:00:00 2001 From: Martin Stjernholm <mast@lysator.liu.se> Date: Sat, 10 Jun 2000 21:20:40 +0200 Subject: [PATCH] Fixed some bogus debug checks. Rev: src/gc.c:1.87 Rev: src/gc.h:1.44 --- src/gc.c | 56 ++++++++++++++++++++++++++------------------------------ src/gc.h | 3 ++- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/gc.c b/src/gc.c index daad51cc71..aa3ede1ed3 100644 --- a/src/gc.c +++ b/src/gc.c @@ -29,7 +29,7 @@ struct callback *gc_evaluator_callback=0; #include "block_alloc.h" -RCSID("$Id: gc.c,v 1.86 2000/06/10 18:09:17 mast Exp $"); +RCSID("$Id: gc.c,v 1.87 2000/06/10 19:20:40 mast Exp $"); /* Run garbage collect approximately every time * 20 percent of all arrays, objects and programs is @@ -782,6 +782,9 @@ static INLINE struct marker *gc_check_debug(void *a) if(m->saved_refs != -1 && m->saved_refs != *(INT32 *)a) gc_fatal(a, 1, "Refs changed in gc.\n"); m->saved_refs = *(INT32 *)a; + if (m->refs + m->xrefs >= *(INT32 *) a) + /* m->refs will be incremented by the caller. */ + gc_fatal(a, 1, "Thing is getting more internal refs than refs.\n"); checked++; return m; @@ -809,6 +812,16 @@ INT32 real_gc_check_weak(void *a) m = get_marker(a); #endif m->weak_refs++; +#ifdef PIKE_DEBUG + if (m->weak_refs > m->refs + 1) + gc_fatal(a, 1, "Thing has gotten more weak refs than internal refs.\n"); + if (m->weak_refs == m->saved_refs) { + if (m->flags & GC_IS_ONLY_WEAK) + gc_fatal(a, 0, "Already counted this as weakly freed.\n"); + weak_freed++; + m->flags |= GC_IS_ONLY_WEAK; + } +#endif return add_ref(m); } @@ -916,14 +929,6 @@ void gc_free_extra_ref(void *a) gc_extra_refs--; } -static INLINE void ref_count_check(void *a, struct marker *m) -{ - if(m->refs + m->xrefs > *(INT32 *)a || - (Pike_in_gc == GC_PASS_CHECK && - m->saved_refs != -1 && m->saved_refs != *(INT32 *)a)) - gc_fatal(a, 1, "Ref counts are wrong.\n"); -} - int debug_gc_is_referenced(void *a) { struct marker *m; @@ -943,7 +948,6 @@ int debug_gc_is_referenced(void *a) if (m->flags & GC_IS_REFERENCED) gc_fatal(a, 0, "gc_is_referenced() called twice for thing.\n"); m->flags |= GC_IS_REFERENCED; - ref_count_check(a, m); return m->refs < *(INT32 *)a; } @@ -976,50 +980,42 @@ int gc_external_mark3(void *a, void *in, char *where) m=get_marker(a); m->xrefs++; m->flags|=GC_XREFERENCED; - ref_count_check(a, m); + if(m->refs + m->xrefs > *(INT32 *)a || + (Pike_in_gc == GC_PASS_CHECK && + m->saved_refs != -1 && m->saved_refs != *(INT32 *)a)) + gc_fatal(a, 1, "Ref counts are wrong.\n"); return 0; } -#endif /* PIKE_DEBUG */ - int gc_do_weak_free(void *a) { struct marker *m; -#ifdef PIKE_DEBUG + if (!a) fatal("Got null pointer.\n"); if (Pike_in_gc != GC_PASS_MARK && Pike_in_gc != GC_PASS_CYCLE) fatal("gc_do_weak_free() called in invalid gc pass.\n"); if (gc_debug) { if (!(m = find_marker(a))) gc_fatal(a, 0, "gc_do_weak_free() got unknown object.\n"); } - else -#endif - m = get_marker(a); - + else m = get_marker(a); debug_malloc_touch(a); -#ifdef PIKE_DEBUG + if (m->weak_refs > m->saved_refs) + gc_fatal(a, 0, "More weak references than references.\n"); if (m->weak_refs > m->refs) gc_fatal(a, 0, "More weak references than internal references.\n"); - if (m->weak_refs > *(INT32 *) a) - gc_fatal(a, 0, "More weak references than references.\n"); - ref_count_check(a, m); -#endif if (m->weak_refs >= *(INT32 *) a) { -#ifdef PIKE_DEBUG - if (!(m->flags & GC_IS_ONLY_WEAK)) weak_freed++; - m->flags |= GC_IS_ONLY_WEAK; - /* Caller should free it after we return. */ - if (m->saved_refs != -1) m->saved_refs--; - m->refs--, m->weak_refs--; -#endif + if (!(m->flags & GC_IS_ONLY_WEAK)) + gc_fatal(a, 0, "Got only weak refs but flag isn't set by real_gc_check_weak().\n"); return 1; } else return 0; } +#endif /* PIKE_DEBUG */ + int gc_mark(void *a) { struct marker *m; diff --git a/src/gc.h b/src/gc.h index 9ad2b4ca4c..9f257e750b 100644 --- a/src/gc.h +++ b/src/gc.h @@ -1,5 +1,5 @@ /* - * $Id: gc.h,v 1.43 2000/06/10 18:09:18 mast Exp $ + * $Id: gc.h,v 1.44 2000/06/10 19:20:40 mast Exp $ */ #ifndef GC_H #define GC_H @@ -179,6 +179,7 @@ void f__gc_status(INT32 args); #define gc_is_referenced(X) debug_gc_is_referenced(debug_malloc_pass(X)) #else #define gc_is_referenced(X) (get_marker(X)->refs < *(INT32 *)(X)) +#define gc_do_weak_free(X) (get_marker(X)->weak_refs >= *(INT32 *) (X)) #endif #define gc_do_weak_free_svalue(S) \ -- GitLab