[performance tweaks and fix ups of jgc code
John Meacham <john@repetae.net>**20100407035653
 Ignore-this: d59a51c929129ddd377ee4561678371d
] hunk ./src/data/rts/jhc_rts_alloc.c 75
-static inline void jhc_malloc_init(void) { GC_INIT(); }
-static inline void jhc_alloc_print_stats(void) { GC_dump(); }
+static void jhc_malloc_init(void) { GC_INIT(); }
+static void jhc_malloc_fini(void) {  }
+static void jhc_alloc_print_stats(void) { GC_dump(); }
hunk ./src/data/rts/slub.c 81
-                if((unsigned)arena->num_used * 10 >= page_threshold * 9) {
+                if((unsigned)arena->num_used * 10 >= page_threshold * 8) {
hunk ./src/data/rts/slub.c 104
-//                printf("Sc: %p %p %p\n", sc, pg, fpg);
hunk ./src/data/rts/slub.c 111
-//                        printf("Considering: %p\n", pg);
hunk ./src/data/rts/slub.c 114
+                        } else if(pg->num_free == sc->num_entries) {
+                                arena->num_used--;
+                                BIT_UNSET(arena->used,((uintptr_t)pg - (uintptr_t)arena->base) / PAGESIZE);
hunk ./src/data/rts/slub.c 118
-                                if(pg->num_free == sc->num_entries) {
-                                        arena->num_used--;
-                                        BIT_UNSET(arena->used,((uintptr_t)pg - (uintptr_t)arena->base) / PAGESIZE);
-                                } else {
-                                        TAILQ_INSERT_HEAD(&sc->pages,pg,tailq);
-                                }
+                                TAILQ_INSERT_HEAD(&sc->pages,pg,tailq);
hunk ./src/data/rts/slub.c 121
-//                        printf("moving on %p %p\n", pg, npg, fpg);
hunk ./src/data/rts/slub.c 130
+inline static void
+clear_page_used_bits(struct s_cache *sc, struct s_page *pg)
+{
+        pg->num_free = sc->num_entries;
+        memset(pg->used,0,BITARRAY_SIZE_IN_BYTES(sc->num_entries));
+//      unsigned max = BITARRAY_SIZE(sc->num_entries);
+//      for(unsigned i = 0;i < max; i++)
+//              pg->used[i] = 0;
+        int excess = sc->num_entries % BITS_PER_UNIT;
+        if(excess)
+                pg->used[BITARRAY_SIZE(sc->num_entries) - 1] = ~((1UL << excess) - 1);
+}
+
hunk ./src/data/rts/slub.c 147
+        int found = 0;
hunk ./src/data/rts/slub.c 149
-//        pg = TAILQ_FIRST(&sc->pages);
-        TAILQ_FOREACH(pg,&sc->pages,tailq)
-                if(pg->num_free > 0)
-                        break;
+        pg = TAILQ_FIRST(&sc->pages);
hunk ./src/data/rts/slub.c 153
-                pg->num_free = sc->num_entries;
hunk ./src/data/rts/slub.c 156
-                memset(pg->used,0,BITARRAY_SIZE_IN_BYTES(sc->num_entries));
-//                unsigned max = BITARRAY_SIZE(sc->num_entries);
-//               for(unsigned i = 0;i < max; i++)
-//                       pg->used[i] = 0;
-                for(int i = BITARRAY_SIZE(sc->num_entries)*BITS_PER_UNIT - 1; i >= sc->num_entries; i--)
-                        BIT_SET(pg->used,i);
hunk ./src/data/rts/slub.c 157
+                clear_page_used_bits(sc,pg);
+                pg->used[0] = 1; //set the first bit
+        } else {
+                int next_free = pg->next_free;
+                found = bitset_find_free(&next_free,BITARRAY_SIZE(sc->num_entries),pg->used);
+                pg->next_free = next_free;
+                assert(found != -1);
hunk ./src/data/rts/slub.c 166
-        int next_free = pg->next_free;
-        int found = bitset_find_free(&next_free,BITARRAY_SIZE(sc->num_entries),pg->used);
-        pg->next_free = next_free;
-        assert(found != -1);
hunk ./src/data/rts/slub.c 168
-        //        printf("s_alloc: val: %p s_page: %p size: %i color: %i found: %i num_free: %i\n", val, pg, pg->size, pg->color, found, pg->num_free);
hunk ./src/data/rts/slub.c 171
-                //TAILQ_INSERT_TAIL(&sc->pages,pg,tailq);
hunk ./src/data/rts/slub.c 174
+        //printf("s_alloc: val: %p s_page: %p size: %i color: %i found: %i num_free: %i\n", val, pg, pg->size, pg->color, found, pg->num_free);
hunk ./src/data/rts/slub.c 210
+
hunk ./src/data/rts/slub.c 220
-                        for(;pg;pg = TAILQ_NEXT(pg,tailq)) {
-                                pg->num_free = sc->num_entries;
-                                memset(pg->used,0,BITARRAY_SIZE_IN_BYTES(sc->num_entries));
-                                for(int i = BITARRAY_SIZE(sc->num_entries)*BITS_PER_UNIT - 1; i >= sc->num_entries; i--)
-                                        BIT_SET(pg->used,i);
-                        }
+                        for(;pg;pg = TAILQ_NEXT(pg,tailq))
+                                clear_page_used_bits(sc,pg);
hunk ./src/data/rts/slub.c 251
-        if(__predict_true(rsc && *rsc)) {
-      //          printf("s_cached: %p\n", rsc);
+        if(__predict_true(rsc && *rsc))
hunk ./src/data/rts/slub.c 253
-        }
-       // printf("s_new: %p\n", rsc);