remove more duplicate functions
This commit is contained in:
parent
93c5d8782c
commit
c8893930ae
111
extlib/benz/gc.c
111
extlib/benz/gc.c
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue