]> granicus.if.org Git - gc/commitdiff
Remove hb_large_block field (use 1 extra bit of hb_flags instead)
authorIvan Maidanski <ivmai@mail.ru>
Sat, 21 Dec 2013 17:16:56 +0000 (21:16 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sat, 21 Dec 2013 17:16:56 +0000 (21:16 +0400)
* allchblk.c (setup_header): Use (hb_flags & LARGE_BLOCK) != 0
instead of hb_large_block.
* private/gc_pmark.h (PUSH_CONTENTS_HDR): Likewise.
* mallocx.c (GC_realloc): Likewise.
* include/private/gc_priv.h (struct hblkhdr): Remove hb_large_block;
define LARGE_BLOCK to access corresponding bit in hb_flags (only if
MARK_BIT_PER_GRANULE).

allchblk.c
include/private/gc_pmark.h
include/private/gc_priv.h
mallocx.c

index 98085b6dd4e6304237f5dc3dad10a93cccc7ecff..8ae1f671aadd4e121fad1ea8404250cc793ea3ab 100644 (file)
@@ -226,10 +226,12 @@ static GC_bool setup_header(hdr * hhdr, struct hblk *block, size_t byte_sz,
                             int kind, unsigned flags)
 {
     word descr;
-#   ifndef MARK_BIT_PER_OBJ
+#   ifdef MARK_BIT_PER_GRANULE
       size_t granules;
-#   endif
 
+      if (byte_sz > MAXOBJBYTES)
+        flags |= LARGE_BLOCK;
+#   endif
 #   ifdef ENABLE_DISCLAIM
       if (GC_obj_kinds[kind].ok_disclaim_proc)
         flags |= HAS_DISCLAIM;
@@ -267,19 +269,17 @@ static GC_bool setup_header(hdr * hhdr, struct hblk *block, size_t byte_sz,
         hhdr -> hb_inv_sz = inv_sz;
       }
 #   else /* MARK_BIT_PER_GRANULE */
-      hhdr -> hb_large_block = (unsigned char)(byte_sz > MAXOBJBYTES);
       granules = BYTES_TO_GRANULES(byte_sz);
       if (EXPECT(!GC_add_map_entry(granules), FALSE)) {
         /* Make it look like a valid block. */
         hhdr -> hb_sz = HBLKSIZE;
         hhdr -> hb_descr = 0;
-        hhdr -> hb_large_block = TRUE;
+        hhdr -> hb_flags |= LARGE_BLOCK;
         hhdr -> hb_map = 0;
         return FALSE;
-      } else {
-        size_t index = (hhdr -> hb_large_block? 0 : granules);
-        hhdr -> hb_map = GC_obj_map[index];
       }
+      hhdr -> hb_map = GC_obj_map[(hhdr -> hb_flags & LARGE_BLOCK) != 0 ?
+                                    0 : granules];
 #   endif /* MARK_BIT_PER_GRANULE */
 
     /* Clear mark bits */
index 9c3aee548615f5665f5ed859d13772de4b1a772d..76fcd1f51f71201d9fc388045bc14dea94755747 100644 (file)
@@ -240,7 +240,7 @@ GC_INNER mse * GC_signal_mark_stack_overflow(mse *msp);
     ptr_t base = current; \
     /* The following always fails for large block references. */ \
     if (EXPECT((gran_offset | byte_offset) != 0, FALSE))  { \
-        if (hhdr -> hb_large_block) { \
+        if ((hhdr -> hb_flags & LARGE_BLOCK) != 0) { \
           /* gran_offset is bogus.      */ \
           size_t obj_displ; \
           base = (ptr_t)(hhdr -> hb_block); \
index 54309a962e5bacc7debfae05729cd34737d2fe60..87b66b2ac72d9bf421592d53f014140d2503ef6c 100644 (file)
@@ -902,6 +902,9 @@ struct hblkhdr {
                                 /* Mark from all objects, marked or     */
                                 /* not.  Used to mark objects needed by */
                                 /* reclaim notifier.                    */
+#       endif
+#       ifdef MARK_BIT_PER_GRANULE
+#         define LARGE_BLOCK 0x10
 #       endif
     unsigned short hb_last_reclaimed;
                                 /* Value of GC_gc_no when block was     */
@@ -924,7 +927,6 @@ struct hblkhdr {
                                 /* LARGE_INV_SZ.                        */
 #     define LARGE_INV_SZ (1 << 16)
 #   else
-      unsigned char hb_large_block;
       short * hb_map;           /* Essentially a table of remainders    */
                                 /* mod BYTES_TO_GRANULES(hb_sz), except */
                                 /* for large blocks.  See GC_obj_map.   */
index eb96124c3181895d3ea4e3a698528e9e86fc0a22..a2d9c70e59970988b6b2a2f2d6f055211e715e07 100644 (file)
--- a/mallocx.c
+++ b/mallocx.c
@@ -100,8 +100,8 @@ GC_API void * GC_CALL GC_realloc(void * p, size_t lb)
 #         ifdef MARK_BIT_PER_OBJ
             GC_ASSERT(hhdr -> hb_inv_sz == LARGE_INV_SZ);
 #         else
-            GC_ASSERT(hhdr -> hb_large_block &&
-                      hhdr -> hb_map[ANY_INDEX] == 1);
+            GC_ASSERT((hhdr -> hb_flags & LARGE_BLOCK) != 0
+                        && hhdr -> hb_map[ANY_INDEX] == 1);
 #         endif
           if (IS_UNCOLLECTABLE(obj_kind)) GC_non_gc_bytes += (sz - orig_sz);
           /* Extra area is already cleared by GC_alloc_large_and_clear. */