early morecore request

This commit is contained in:
Yuichi Nishiwaki 2015-07-16 16:34:59 +09:00
parent d43db5e9c8
commit 6b50ebba2b
2 changed files with 20 additions and 3 deletions

View File

@ -708,10 +708,11 @@ gc_sweep_symbols(pic_state *pic)
} }
} }
static void static size_t
gc_sweep_page(pic_state *pic, struct heap_page *page) gc_sweep_page(pic_state *pic, struct heap_page *page)
{ {
union header *bp, *p, *head = NULL, *tail = NULL; union header *bp, *p, *head = NULL, *tail = NULL;
size_t alive = 0;
for (bp = page->basep; ; bp = bp->s.ptr) { for (bp = page->basep; ; bp = bp->s.ptr) {
p = bp + (bp->s.size ? bp->s.size : 1); /* first bp's size is 0, so force advnce */ p = bp + (bp->s.size ? bp->s.size : 1); /* first bp's size is 0, so force advnce */
@ -721,6 +722,7 @@ gc_sweep_page(pic_state *pic, struct heap_page *page)
} }
if (gc_is_marked(p)) { if (gc_is_marked(p)) {
gc_unmark(p); gc_unmark(p);
alive += p->s.size;
} else { } else {
if (head == NULL) { if (head == NULL) {
head = p; head = p;
@ -741,14 +743,17 @@ gc_sweep_page(pic_state *pic, struct heap_page *page)
gc_finalize_object(pic, (struct pic_object *)(p + 1)); gc_finalize_object(pic, (struct pic_object *)(p + 1));
heap_free(pic, p + 1); heap_free(pic, p + 1);
} }
return alive;
} }
static void static void
gc_sweep_phase(pic_state *pic) gc_sweep_phase(pic_state *pic)
{ {
struct heap_page *page = pic->heap->pages; struct heap_page *page;
khiter_t it; khiter_t it;
khash_t(reg) *h; khash_t(reg) *h;
size_t total = 0, inuse = 0;
/* registries */ /* registries */
while (pic->regs != NULL) { while (pic->regs != NULL) {
@ -765,10 +770,16 @@ gc_sweep_phase(pic_state *pic)
gc_sweep_symbols(pic); gc_sweep_symbols(pic);
page = pic->heap->pages;
while (page) { while (page) {
gc_sweep_page(pic, page); inuse += gc_sweep_page(pic, page);
total += page->endp - page->basep;
page = page->next; page = page->next;
} }
if (PIC_PAGE_REQUEST_THRESHOLD(total) <= inuse) {
heap_morecore(pic);
}
} }
void void

View File

@ -33,6 +33,8 @@
/* #define PIC_HEAP_PAGE_SIZE 10000 */ /* #define PIC_HEAP_PAGE_SIZE 10000 */
/* #define PIC_PAGE_REQUEST_THRESHOLD(total) ((total) * 77 / 100) */
/* #define PIC_STACK_SIZE 1024 */ /* #define PIC_STACK_SIZE 1024 */
/* #define PIC_RESCUE_SIZE 30 */ /* #define PIC_RESCUE_SIZE 30 */
@ -127,6 +129,10 @@
# define PIC_HEAP_PAGE_SIZE (2 * 1024 * 1024) # define PIC_HEAP_PAGE_SIZE (2 * 1024 * 1024)
#endif #endif
#ifndef PIC_PAGE_REQUEST_THRESHOLD
# define PIC_PAGE_REQUEST_THRESHOLD(total) ((total) * 77 / 100)
#endif
#ifndef PIC_STACK_SIZE #ifndef PIC_STACK_SIZE
# define PIC_STACK_SIZE 2048 # define PIC_STACK_SIZE 2048
#endif #endif