X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=libgc%2Fobj_map.c;h=49f6add1553dcf2ea94d829a3b54a6498202783f;hb=30cddad5fb4c3d290906a6e6c33ecd8b07d8b48c;hp=d002d65b4dda05092dc23a6b74bf1f1e451f0063;hpb=a097b5471761180c4aae2dab224ed9caeeae3e86;p=mono.git diff --git a/libgc/obj_map.c b/libgc/obj_map.c index d002d65b4dd..49f6add1553 100644 --- a/libgc/obj_map.c +++ b/libgc/obj_map.c @@ -22,6 +22,7 @@ # include "private/gc_priv.h" map_entry_type * GC_invalid_map = 0; +static word max_valid_offset = 0; /* Invalidate the object map associated with a block. Free blocks */ /* are identified by invalid maps. */ @@ -76,6 +77,8 @@ word offset; if (!GC_valid_offsets[offset]) { GC_valid_offsets[offset] = TRUE; GC_modws_valid_offsets[offset % sizeof(word)] = TRUE; + if (offset > max_valid_offset) + max_valid_offset = offset; if (!GC_all_interior_pointers) { for (i = 0; i <= MAXOBJSZ; i++) { if (GC_obj_map[i] != 0) { @@ -117,11 +120,9 @@ word sz; # ifdef PRINTSTATS GC_printf1("Adding block map for size %lu\n", (unsigned long)sz); # endif - for (displ = 0; displ < HBLKSIZE; displ++) { - MAP_ENTRY(new_map,displ) = OBJ_INVALID; - } + INIT_MAP(new_map); if (sz == 0) { - for(displ = 0; displ <= HBLKSIZE; displ++) { + for(displ = 0; displ <= max_valid_offset; displ++) { if (OFFSET_VALID(displ)) { map_entry = BYTES_TO_WORDS(displ); if (map_entry > MAX_OFFSET) map_entry = OFFSET_TOO_BIG; @@ -132,7 +133,7 @@ word sz; for (obj_start = 0; obj_start + WORDS_TO_BYTES(sz) <= HBLKSIZE; obj_start += WORDS_TO_BYTES(sz)) { - for (displ = 0; displ < WORDS_TO_BYTES(sz); displ++) { + for (displ = 0; displ <= max_valid_offset; displ++) { if (OFFSET_VALID(displ)) { map_entry = BYTES_TO_WORDS(displ); if (map_entry > MAX_OFFSET) map_entry = OFFSET_TOO_BIG;