2010-02-22 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Mon, 22 Feb 2010 01:19:53 +0000 (01:19 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 22 Feb 2010 01:19:53 +0000 (01:19 -0000)
* obj_map.c (GC_add_map_entry): Speed this up for the common case where
GC_register_displacement () was never called.

svn path=/trunk/mono/; revision=152155

libgc/ChangeLog
libgc/include/private/gc_priv.h
libgc/obj_map.c

index f5d69bb3e47e81035a1add06f7e7c92f15da441a..0dcfc7e5a794ebaaff7a0c7ce01b34d2ae1223f8 100644 (file)
@@ -1,3 +1,8 @@
+2010-02-22  Zoltan Varga  <vargaz@gmail.com>
+
+       * obj_map.c (GC_add_map_entry): Speed this up for the common case where
+       GC_register_displacement () was never called.
+
 2010-01-29  Geoff Norton  <gnorton@novell.com>
 
        * include/private/gcconfig.h: Don't define NO_PTHREAD_TRYLOCK on darwin-x86
index 8fa89b6580beee31f5674feec069ab5664ea311e..2efb4732f79f725e60a7ab8db9593580df344f32 100644 (file)
@@ -940,6 +940,7 @@ struct _GC_arrays {
 #   define MAP_SIZE MAP_ENTRIES
 #   define CPP_MAX_OFFSET (OFFSET_TOO_BIG - 1) 
 #   define MAX_OFFSET ((word)CPP_MAX_OFFSET)
+#   define INIT_MAP(map) memset((map), OBJ_INVALID, MAP_SIZE)
     /* The following are used only if GC_all_interior_ptrs != 0 */
 #      define VALID_OFFSET_SZ \
          (CPP_MAX_OFFSET > WORDS_TO_BYTES(CPP_MAXOBJSZ)? \
index d002d65b4dda05092dc23a6b74bf1f1e451f0063..39993451cc7107651810adccfa5f73747edab341 100644 (file)
@@ -22,6 +22,7 @@
 # include "private/gc_priv.h"
 
 map_entry_type * GC_invalid_map = 0;
+static 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;