* gc.c (scm_mallocated): Just make this signed.
authorJim Blandy <jimb@red-bean.com>
Wed, 16 Jun 1999 10:18:27 +0000 (10:18 +0000)
committerJim Blandy <jimb@red-bean.com>
Wed, 16 Jun 1999 10:18:27 +0000 (10:18 +0000)
(scm_igc): Check for underflow by seeing if this is negative.
Much cleaner.
* gc.h (scm_mallocated): Fix declaration.
(Thanks to Greg Harvey.)

libguile/gc.c
libguile/gc.h

index 7590782..4e5ec81 100644 (file)
@@ -175,7 +175,7 @@ SCM scm_weak_vectors;
 /* GC Statistics Keeping
  */
 unsigned long scm_cells_allocated = 0;
-unsigned long scm_mallocated = 0;
+long scm_mallocated = 0;
 unsigned long scm_gc_cells_collected;
 unsigned long scm_gc_malloc_collected;
 unsigned long scm_gc_ports_collected;
@@ -454,17 +454,13 @@ scm_igc (what)
       return;
     }
 
-  if (scm_mallocated > ((unsigned long) 0 - (1 << 24)))
-    {
-      /* It is extremely unlikely that you have allocated all but 16 Mb
-        (one sixteenth of 2^32) of your address space.  It is much more
-        likely that you have forgotten to report the sizes of objects
-        you have allocated via scm_done_malloc, or some such.  When the
-        GC freed them, it subtracted their size from scm_mallocated,
-        which underflowed.  Since it's unsigned, this looks like a
-        really big number, so we start GC'ing all the time.  */
-      abort ();
-    }
+  if (scm_mallocated < 0)
+    /* The byte count of allocated objects has underflowed.  This is
+       probably because you forgot to report the sizes of objects you
+       have allocated, by calling scm_done_malloc or some such.  When
+       the GC freed them, it subtracted their size from
+       scm_mallocated, which underflowed.  */
+    abort ();
 
   if (scm_gc_heap_lock)
     /* We've invoked the collector while a GC is already in progress.
index be20a57..d3c08ce 100644 (file)
@@ -2,7 +2,7 @@
 
 #ifndef GCH
 #define GCH
-/*     Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc.
+/*     Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -72,7 +72,7 @@ extern unsigned long scm_gc_cells_collected;
 extern unsigned long scm_gc_malloc_collected;
 extern unsigned long scm_gc_ports_collected;
 extern unsigned long scm_cells_allocated;
-extern unsigned long scm_mallocated;
+extern long scm_mallocated;
 extern unsigned long scm_mtrigger;
 
 #ifdef DEBUG_FREELIST