[add page cache for recently freed pages
John Meacham <john@repetae.net>**20100407195209
 Ignore-this: 8396a53e402cc893098df7be98e39edd
] hunk ./src/data/rts/jhc_jgc.c 174
-                        if(__predict_true(IS_PTR(e->ptrs[i]))) {
+                        if(IS_PTR(e->ptrs[i])) {
hunk ./src/data/rts/slub.c 19
+        SLIST_HEAD(,s_cache) caches;
hunk ./src/data/rts/slub.c 21
+        SLIST_HEAD(,s_page) free_pages;
hunk ./src/data/rts/slub.c 23
-        SLIST_HEAD(,s_cache) caches;
hunk ./src/data/rts/slub.c 81
-                if((unsigned)arena->num_used * 10 >= page_threshold * 9) {
+                if(__predict_false((unsigned)arena->num_used * 10 >= page_threshold * 9)) {
hunk ./src/data/rts/slub.c 85
-        int next_free = arena->next_free;
-        int found = bitset_find_free(&next_free, BITARRAY_SIZE(ARENASIZE), arena->used);
-        arena->next_free = next_free;
-        if(found == -1)
-                return NULL;
-        int r;
-        J1S(r, gc_inheap, (uintptr_t)arena->base/PAGESIZE + found);
-        struct s_page *pg = (struct s_page *)(arena->base + PAGESIZE*found);
+        struct s_page *pg;
+        if(__predict_true(SLIST_FIRST(&arena->free_pages))) {
+                pg = SLIST_FIRST(&arena->free_pages);
+                SLIST_REMOVE_HEAD(&arena->free_pages,link);
+        } else {
+                int next_free = arena->next_free;
+                int found = bitset_find_free(&next_free, BITARRAY_SIZE(ARENASIZE), arena->used);
+                arena->next_free = next_free;
+                if(found == -1)
+                        return NULL;
+                int r;
+                J1S(r, gc_inheap, (uintptr_t)arena->base/PAGESIZE + found);
+                pg = (struct s_page *)(arena->base + PAGESIZE*found);
+        }
hunk ./src/data/rts/slub.c 100
-//        printf("Allocing: %p %u\n", pg, arena->num_used);
+        //        printf("Allocing: %p %u\n", pg, arena->num_used);
hunk ./src/data/rts/slub.c 129
-                        if(pg->num_free == 0) {
+                        if(__predict_false(pg->num_free == 0)) {
hunk ./src/data/rts/slub.c 131
-                        } else if(pg->num_free == sc->num_entries) {
+                        } else if(__predict_true(pg->num_free == sc->num_entries)) {
hunk ./src/data/rts/slub.c 133
-                                BIT_UNSET(arena->used,((uintptr_t)pg - (uintptr_t)arena->base) / PAGESIZE);
+                                SLIST_INSERT_HEAD(&arena->free_pages,pg,link);
+//                                BIT_UNSET(arena->used,((uintptr_t)pg - (uintptr_t)arena->base) / PAGESIZE);
hunk ./src/data/rts/slub.c 271
-        if(BIT_IS_UNSET(pg->used,offset/pg->pi.size)) {
+        if(__predict_true(BIT_IS_UNSET(pg->used,offset/pg->pi.size))) {
hunk ./src/data/rts/slub.c 300
+        SLIST_INIT(&arena->free_pages);