[keep seperate page lists for partial and fully used pages
John Meacham <john@repetae.net>**20100407022003
 Ignore-this: df343bcc7922e78fc0912b454ac5f325
] hunk ./src/data/rts/jhc_jgc.c 8
+// #define static 
+
hunk ./src/data/rts/jhc_jgc.c 25
-static Pvoid_t  gc_allocated   = NULL;  // black set of currently allocated memory
-static size_t   heap_threshold = 2048;  // threshold at which we want to run a gc rather than malloc more memory
-static size_t   mem_inuse;              // amount of memory in use by gc'ed memory
hunk ./src/data/rts/jhc_jgc.c 231
+                Word_t n_roots;
+                J1C(n_roots,gc_roots,0,-1);
hunk ./src/data/rts/jhc_jgc.c 235
-                fprintf(stderr, "%3u - Ss: %5u Ps: %5u Rs: %5u As: %6u ", number_gcs, number_stack, number_ptr, number_redirects, number_allocs);
-                Word_t n_allocated,n_roots;
-                J1C(n_allocated,gc_allocated,0,-1);
-                J1C(n_roots,gc_roots,0,-1);
-                fprintf(stderr,"live: %5lu root: %3lu inuse: %6lu threshold: %6lu %p %p\n",arena->num_used,n_roots,(long unsigned)mem_inuse,(long unsigned)heap_threshold, gc_stack_base, gc);
+                fprintf(stdout, "%3u - %6u Used: %4u Thresh: %4u Ss: %5u Ps: %5u Rs: %5u Root: %3u\n",
+                        number_gcs,
+                        number_allocs,
+                        (unsigned)arena->num_used,
+                        page_threshold,
+                        number_stack,
+                        number_ptr,
+                        number_redirects,
+                        (unsigned)n_roots
+                        );
+               jhc_malloc_fini(); 
hunk ./src/data/rts/jhc_jgc.c 269
-        mem_inuse += (count + 1)*GC_BASE;
+        //mem_inuse += (count + 1)*GC_BASE;
hunk ./src/data/rts/jhc_jgc.c 298
-        if(1) {
+        if(0) {
hunk ./src/data/rts/jhc_jgc.c 310
+// #undef static
hunk ./src/data/rts/jhc_jgc.h 10
-#define JGC_STATUS 1
+#define JGC_STATUS 0
hunk ./src/data/rts/slub.c 30
+
hunk ./src/data/rts/slub.c 44
+        TAILQ_HEAD(,s_page) full_pages;
hunk ./src/data/rts/slub.c 52
-void print_cache(struct s_cache *sc);
hunk ./src/data/rts/slub.c 53
-
hunk ./src/data/rts/slub.c 64
-found:
-        {
-        int o = __builtin_ffsl(~ba[i]);
-        assert(o);
-        ba[i] |= (1UL << (o - 1));
-        *next_free = i;
-        return (i*BITS_PER_UNIT + (o - 1));
-        }
+found: ;
+       int o = __builtin_ffsl(~ba[i]);
+       assert(o);
+       ba[i] |= (1UL << (o - 1));
+       *next_free = i;
+       return (i*BITS_PER_UNIT + (o - 1));
hunk ./src/data/rts/slub.c 78
-        if(arena->num_used >= page_threshold) {
+        if(__predict_false(arena->num_used >= page_threshold)) {
hunk ./src/data/rts/slub.c 81
-                if(arena->num_used * 10 >= page_threshold * 8) {
+                if((unsigned)arena->num_used * 10 >= page_threshold * 9) {
hunk ./src/data/rts/slub.c 92
+        struct s_page *pg = (struct s_page *)(arena->base + PAGESIZE*found);
hunk ./src/data/rts/slub.c 94
-        return (struct s_page *)(arena->base + PAGESIZE*found);
+//        printf("Allocing: %p %u\n", pg, arena->num_used);
+        return pg;
hunk ./src/data/rts/slub.c 102
-                struct s_page *pg;
-                TAILQ_FOREACH(pg,&sc->pages,tailq) {
-                        if(pg->num_free == sc->num_entries) {
-                                TAILQ_REMOVE(&sc->pages,pg,tailq);
-                                BIT_UNSET(arena->used,((uintptr_t)pg - (uintptr_t)arena->base) / PAGESIZE);
-                                arena->num_used--;
+                struct s_page *pg = TAILQ_FIRST(&sc->pages);
+                struct s_page *fpg = TAILQ_FIRST(&sc->full_pages);
+//                printf("Sc: %p %p %p\n", sc, pg, fpg);
+                TAILQ_INIT(&sc->pages);
+                TAILQ_INIT(&sc->full_pages);
+                if(!pg) {
+                        pg = fpg;
+                        fpg = NULL;
+                }
+                while(pg) {
+//                        printf("Considering: %p\n", pg);
+                        struct s_page *npg = TAILQ_NEXT(pg,tailq);
+                        if(pg->num_free == 0) {
+                                TAILQ_INSERT_HEAD(&sc->full_pages,pg,tailq);
+                        } else {
+                                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);
+                                }
hunk ./src/data/rts/slub.c 124
+
+//                        printf("moving on %p %p\n", pg, npg, fpg);
+                        if(!npg && fpg) {
+                                pg = fpg;
+                                fpg = NULL;
+                        } else
+                                pg = npg;
hunk ./src/data/rts/slub.c 135
-
-
hunk ./src/data/rts/slub.c 140
+//        pg = TAILQ_FIRST(&sc->pages);
hunk ./src/data/rts/slub.c 145
-        pg = get_free_page(gc, sc->arena);
-        assert(pg);
-        pg->num_free = sc->num_entries;
-        pg->color = sc->color;
-        pg->size = sc->size;
-        pg->next_free = 0;
-        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);
-        TAILQ_INSERT_HEAD(&sc->pages,pg,tailq);
+                pg = get_free_page(gc, sc->arena);
+                assert(pg);
+                pg->num_free = sc->num_entries;
+                pg->color = sc->color;
+                pg->size = sc->size;
+                pg->next_free = 0;
+                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);
+                TAILQ_INSERT_HEAD(&sc->pages,pg,tailq);
hunk ./src/data/rts/slub.c 170
-                TAILQ_INSERT_TAIL(&sc->pages,pg,tailq);
+                //TAILQ_INSERT_TAIL(&sc->pages,pg,tailq);
+                TAILQ_INSERT_HEAD(&sc->full_pages,pg,tailq);
hunk ./src/data/rts/slub.c 203
+        TAILQ_INIT(&sc->full_pages);
hunk ./src/data/rts/slub.c 215
-                struct s_page *pg;
-                TAILQ_FOREACH(pg,&sc->pages,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);
-                }
+                struct s_page *pg = TAILQ_FIRST(&sc->pages);
+                struct s_page *fpg = TAILQ_FIRST(&sc->full_pages);
+                do {
+                        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);
+                        }
+                        pg = fpg;
+                        fpg = NULL;
+                }  while(pg);
hunk ./src/data/rts/slub.c 301
+        printf("  full_pages:\n");
+        TAILQ_FOREACH(pg,&sc->full_pages,tailq) {
+            printf("%20p %9i %9i %9i %9i\n", pg, pg->num_free, pg->color, pg->size, pg->next_free);
+        }