]> granicus.if.org Git - gc/commitdiff
2008-02-20 Hans Boehm <Hans.Boehm@hp.com>
authorhboehm <hboehm>
Wed, 20 Feb 2008 22:02:46 +0000 (22:02 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 26 Jul 2011 17:06:42 +0000 (21:06 +0400)
* allchblk.c (add_to_fl): disable assertions with USE_MUNMAP,
and refine assertions to handle huge unmergable blocks.
(GC_allochblk_nth): Add comment.

ChangeLog
allchblk.c

index b1f14158dfa2556cf7bb4bb5adabba5ecad6decd..979b05ae7133b17b2f21d1c95249185775b3f85d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-20  Hans Boehm <Hans.Boehm@hp.com>
+
+       * allchblk.c (add_to_fl): disable assertions with USE_MUNMAP,
+       and refine assertions to handle huge unmergable blocks.
+       (GC_allochblk_nth): Add comment.
+
 2008-02-20  Hans Boehm <Hans.Boehm@hp.com>
 
        * include/private/gcconfig.h: Add misssing FREEBSD macro
index ed6a60b198e29d5a91acde3b6db6bc82ff605763..8d326e53f4f47ee85dab8cb9f581b954b3db3fa1 100644 (file)
@@ -363,13 +363,16 @@ void GC_add_to_fl(struct hblk *h, hdr *hhdr)
     int index = GC_hblk_fl_from_blocks(divHBLKSZ(hhdr -> hb_sz));
     struct hblk *second = GC_hblkfreelist[index];
     hdr * second_hdr;
-#   ifdef GC_ASSERTIONS
+#   if defined(GC_ASSERTIONS) && !defined(USE_MUNMAP)
       struct hblk *next = (struct hblk *)((word)h + hhdr -> hb_sz);
       hdr * nexthdr = HDR(next);
       struct hblk *prev = GC_free_block_ending_at(h);
       hdr * prevhdr = HDR(prev);
-      GC_ASSERT(nexthdr == 0 || !HBLK_IS_FREE(nexthdr) || !IS_MAPPED(nexthdr));
-      GC_ASSERT(prev == 0 || !HBLK_IS_FREE(prevhdr) || !IS_MAPPED(prevhdr));
+      GC_ASSERT(nexthdr == 0 || !HBLK_IS_FREE(nexthdr)
+                || (signed_word)GC_heapsize < 0);
+               /* In the last case, blocks may be too large to merge. */
+      GC_ASSERT(prev == 0 || !HBLK_IS_FREE(prevhdr)
+               || (signed_word)GC_heapsize < 0);
 #   endif
     GC_ASSERT(((hhdr -> hb_sz) & (HBLKSIZE-1)) == 0);
     GC_hblkfreelist[index] = h;
@@ -765,6 +768,7 @@ GC_allochblk_nth(size_t sz, int kind, unsigned flags, int n, GC_bool may_split)
                  if (!IS_MAPPED(hhdr)) {
                    GC_remap((ptr_t)hbp, hhdr -> hb_sz);
                    hhdr -> hb_flags &= ~WAS_UNMAPPED;
+                   /* Note: This may leave adjacent, mapped free blocks. */
                  }
 #              endif
                /* hbp may be on the wrong freelist; the parameter n    */