remove more duplicate functions

This commit is contained in:
Yuichi Nishiwaki 2016-06-19 21:22:37 +09:00
parent 93c5d8782c
commit c8893930ae
4 changed files with 112 additions and 207 deletions

View File

@ -35,7 +35,9 @@ struct object {
}; };
struct heap { struct heap {
union header base, *freep; /* unused if PIC_USE_BITMAP */ #if !PIC_USE_BITMAPGC
union header base, *freep;
#endif
struct heap_page *pages; struct heap_page *pages;
struct weak *weaks; /* weak map chain */ struct weak *weaks; /* weak map chain */
}; };
@ -448,6 +450,85 @@ gc_finalize_object(pic_state *pic, struct object *obj)
# include "./gc/markandsweep.c" # include "./gc/markandsweep.c"
#endif #endif
struct heap *
pic_heap_open(pic_state *pic)
{
struct heap *heap;
heap = pic_malloc(pic, sizeof(struct heap));
#if !PIC_USE_BITMAPGC
heap->base.s.ptr = &heap->base;
heap->base.s.size = 0; /* not 1, since it must never be used for allocation */
heap->freep = &heap->base;
#endif
heap->pages = NULL;
heap->weaks = NULL;
return heap;
}
void
pic_heap_close(pic_state *pic, struct heap *heap)
{
struct heap_page *page;
while (heap->pages) {
page = heap->pages;
heap->pages = heap->pages->next;
pic_free(pic, page);
}
pic_free(pic, heap);
}
static void
gc_sweep_phase(pic_state *pic)
{
struct heap_page *page;
int it;
khash_t(weak) *h;
khash_t(oblist) *s = &pic->oblist;
symbol *sym;
struct object *obj;
size_t total = 0, inuse = 0;
/* weak maps */
while (pic->heap->weaks != NULL) {
h = &pic->heap->weaks->hash;
for (it = kh_begin(h); it != kh_end(h); ++it) {
if (! kh_exist(h, it))
continue;
obj = kh_key(h, it);
if (! is_marked(pic, obj)) {
kh_del(weak, h, it);
}
}
pic->heap->weaks = pic->heap->weaks->prev;
}
/* symbol table */
for (it = kh_begin(s); it != kh_end(s); ++it) {
if (! kh_exist(s, it))
continue;
sym = kh_val(s, it);
if (sym && ! is_marked(pic, (struct object *)sym)) {
kh_del(oblist, s, it);
}
}
page = pic->heap->pages;
while (page) {
inuse += gc_sweep_page(pic, page);
total += PAGE_UNITS;
page = page->next;
}
if (PIC_PAGE_REQUEST_THRESHOLD(total) <= inuse) {
heap_morecore(pic);
}
}
void void
pic_gc(pic_state *pic) pic_gc(pic_state *pic)
{ {
@ -461,6 +542,34 @@ pic_gc(pic_state *pic)
gc_sweep_phase(pic); gc_sweep_phase(pic);
} }
struct object *
pic_obj_alloc_unsafe(pic_state *pic, size_t size, int type)
{
struct object *obj;
#if GC_STRESS
pic_gc(pic);
#endif
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL) {
pic_gc(pic);
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL) {
heap_morecore(pic);
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL)
pic_panic(pic, "GC memory exhausted");
}
}
#if !PIC_USE_BITMAPGC
obj->u.basic.gc_mark = WHITE;
#endif
obj->u.basic.tt = type;
return obj;
}
struct object * struct object *
pic_obj_alloc(pic_state *pic, size_t size, int type) pic_obj_alloc(pic_state *pic, size_t size, int type)
{ {

View File

@ -18,32 +18,6 @@ struct heap_page {
uint32_t index[BITMAP_SIZE / UNIT_SIZE]; uint32_t index[BITMAP_SIZE / UNIT_SIZE];
}; };
struct heap *
pic_heap_open(pic_state *pic)
{
struct heap *heap;
heap = pic_malloc(pic, sizeof(struct heap));
heap->pages = NULL;
heap->weaks = NULL;
return heap;
}
void
pic_heap_close(pic_state *pic, struct heap *heap)
{
struct heap_page *page;
while (heap->pages) {
page = heap->pages;
heap->pages = heap->pages->next;
pic_free(pic, page);
}
pic_free(pic, heap);
}
/* bitmap */ /* bitmap */
static union header * static union header *
@ -55,9 +29,9 @@ index2header(struct heap_page *page, size_t index)
static struct heap_page * static struct heap_page *
obj2page(pic_state *PIC_UNUSED(pic), union header *h) obj2page(pic_state *PIC_UNUSED(pic), union header *h)
{ {
unsigned long int mask = ~(PIC_HEAP_PAGE_SIZE - 1); static const unsigned long mask = ~(PIC_HEAP_PAGE_SIZE - 1);
return (struct heap_page *)(((unsigned long int) h) & mask); return (struct heap_page *)(((unsigned long)h) & mask);
} }
static int static int
@ -105,7 +79,6 @@ is_marked_at(uint32_t *bitmap, size_t index, size_t size)
} }
return 0; return 0;
} }
static void * static void *
@ -223,53 +196,6 @@ gc_sweep_page(pic_state *pic, struct heap_page *page)
return inuse; return inuse;
} }
static void
gc_sweep_phase(pic_state *pic)
{
struct heap_page *page;
int it;
khash_t(weak) *h;
khash_t(oblist) *s = &pic->oblist;
symbol *sym;
struct object *obj;
size_t total = 0, inuse = 0;
/* weak maps */
while (pic->heap->weaks != NULL) {
h = &pic->heap->weaks->hash;
for (it = kh_begin(h); it != kh_end(h); ++it) {
if (! kh_exist(h, it))
continue;
obj = kh_key(h, it);
if (! is_marked(pic, obj)) {
kh_del(weak, h, it);
}
}
pic->heap->weaks = pic->heap->weaks->prev;
}
/* symbol table */
for (it = kh_begin(s); it != kh_end(s); ++it) {
if (! kh_exist(s, it))
continue;
sym = kh_val(s, it);
if (sym && ! is_marked(pic, (struct object *)sym)) {
kh_del(oblist, s, it);
}
}
page = pic->heap->pages;
while (page) {
inuse += gc_sweep_page(pic, page);
total += PAGE_UNITS;
page = page->next;
}
if (PIC_PAGE_REQUEST_THRESHOLD(total) <= inuse) {
heap_morecore(pic);
}
}
void void
gc_init(pic_state *pic) gc_init(pic_state *pic)
{ {
@ -285,28 +211,3 @@ gc_init(pic_state *pic)
page = page->next; page = page->next;
} }
} }
struct object *
pic_obj_alloc_unsafe(pic_state *pic, size_t size, int type)
{
struct object *obj;
#if GC_STRESS
pic_gc(pic);
#endif
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL) {
pic_gc(pic);
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL) {
heap_morecore(pic);
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL)
pic_panic(pic, "GC memory exhausted");
}
}
obj->u.basic.tt = type;
return obj;
}

View File

@ -18,37 +18,6 @@ struct heap_page {
union header basep[1]; union header basep[1];
}; };
struct heap *
pic_heap_open(pic_state *pic)
{
struct heap *heap;
heap = pic_malloc(pic, sizeof(struct heap));
heap->base.s.ptr = &heap->base;
heap->base.s.size = 0; /* not 1, since it must never be used for allocation */
heap->freep = &heap->base;
heap->pages = NULL;
heap->weaks = NULL;
return heap;
}
void
pic_heap_close(pic_state *pic, struct heap *heap)
{
struct heap_page *page;
while (heap->pages) {
page = heap->pages;
heap->pages = heap->pages->next;
pic_free(pic, page);
}
pic_free(pic, heap);
}
static void * static void *
heap_alloc(pic_state *pic, size_t size) heap_alloc(pic_state *pic, size_t size)
{ {
@ -186,81 +155,8 @@ gc_sweep_page(pic_state *pic, struct heap_page *page)
return alive; return alive;
} }
static void
gc_sweep_phase(pic_state *pic)
{
struct heap_page *page;
int it;
khash_t(weak) *h;
khash_t(oblist) *s = &pic->oblist;
symbol *sym;
struct object *obj;
size_t total = 0, inuse = 0;
/* weak maps */
while (pic->heap->weaks != NULL) {
h = &pic->heap->weaks->hash;
for (it = kh_begin(h); it != kh_end(h); ++it) {
if (! kh_exist(h, it))
continue;
obj = kh_key(h, it);
if (obj->u.basic.gc_mark == WHITE) {
kh_del(weak, h, it);
}
}
pic->heap->weaks = pic->heap->weaks->prev;
}
/* symbol table */
for (it = kh_begin(s); it != kh_end(s); ++it) {
if (! kh_exist(s, it))
continue;
sym = kh_val(s, it);
if (sym && ! is_marked(pic, (struct object *)sym)) {
kh_del(oblist, s, it);
}
}
page = pic->heap->pages;
while (page) {
inuse += gc_sweep_page(pic, page);
total += PAGE_UNITS;
page = page->next;
}
if (PIC_PAGE_REQUEST_THRESHOLD(total) <= inuse) {
heap_morecore(pic);
}
}
static void static void
gc_init(pic_state *PIC_UNUSED(pic)) gc_init(pic_state *PIC_UNUSED(pic))
{ {
return; return;
} }
struct object *
pic_obj_alloc_unsafe(pic_state *pic, size_t size, int type)
{
struct object *obj;
#if GC_STRESS
pic_gc(pic);
#endif
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL) {
pic_gc(pic);
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL) {
heap_morecore(pic);
obj = (struct object *)heap_alloc(pic, size);
if (obj == NULL)
pic_panic(pic, "GC memory exhausted");
}
}
obj->u.basic.gc_mark = WHITE;
obj->u.basic.tt = type;
return obj;
}

View File

@ -466,4 +466,3 @@ double PIC_CSTRING_TO_DOUBLE(const char *);
# define PIC_MEMALIGN(pic, buf, alignment, size) posix_memalign(buf, alignment, size) # define PIC_MEMALIGN(pic, buf, alignment, size) posix_memalign(buf, alignment, size)
# define PIC_USE_BITMAPGC 1 # define PIC_USE_BITMAPGC 1
#endif #endif