trying to fix bugs in gc implementation
This commit is contained in:
parent
8c01bef2fb
commit
8f6176f451
@ -43,14 +43,51 @@ hawk_val_t* hawk_val_zlm = (hawk_val_t*)&awk_zlm;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
BEGIN {
|
BEGIN {
|
||||||
@local a, b, nil;
|
@local a, b, c, nil;
|
||||||
|
for (i = 1; i < 10; i++) a[i] = i;
|
||||||
|
a[11] = a;
|
||||||
|
a[12] = a;
|
||||||
|
a = nil;
|
||||||
|
b[1] = a;
|
||||||
|
c[1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
@local a, b, c, nil;
|
||||||
|
j[1] = 20;
|
||||||
|
j[2] = 20;
|
||||||
for (i = 1; i < 10; i++) a[i] = i;
|
for (i = 1; i < 10; i++) a[i] = i;
|
||||||
|
a[9] = j;
|
||||||
|
a[10] = "world";
|
||||||
a[11] = a;
|
a[11] = a;
|
||||||
a[12] = a;
|
a[12] = a;
|
||||||
|
a[13] = "hello";
|
||||||
|
j[3] = a;
|
||||||
|
a[14] = j;
|
||||||
a = nil;
|
a = nil;
|
||||||
b[1] = a;
|
b[1] = a;
|
||||||
c[1] = 0;
|
c[1] = 0;
|
||||||
} */
|
}
|
||||||
|
*
|
||||||
|
* BEGIN {
|
||||||
|
@local a, b, c, nil;
|
||||||
|
j[1] = 20;
|
||||||
|
j[2] = 20;
|
||||||
|
for (i = 1; i < 10; i++) a[i] = i;
|
||||||
|
a[9] = j;
|
||||||
|
a[10] = "world";
|
||||||
|
a[11] = a;
|
||||||
|
a[12] = a;
|
||||||
|
a[13] = "hello";
|
||||||
|
j[3] = a;
|
||||||
|
a[14] = j;
|
||||||
|
a = nil;
|
||||||
|
j = nil;
|
||||||
|
b[1] = a;
|
||||||
|
c[1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
#define GCH_MOVED HAWK_TYPE_MAX(hawk_uintptr_t)
|
#define GCH_MOVED HAWK_TYPE_MAX(hawk_uintptr_t)
|
||||||
|
|
||||||
@ -77,18 +114,21 @@ static HAWK_INLINE void gc_chain_val (hawk_gch_t* list, hawk_val_t* v)
|
|||||||
gc_chain_gch (list, hawk_val_to_gch(v));
|
gc_chain_gch (list, hawk_val_to_gch(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
static HAWK_INLINE void gc_move_gchs (hawk_gch_t* list, hawk_gch_t* src)
|
static HAWK_INLINE void gc_move_all_gchs (hawk_gch_t* src, hawk_gch_t* dst)
|
||||||
{
|
{
|
||||||
if (list->gc_next != list)
|
if (src->gc_next != src)
|
||||||
{
|
{
|
||||||
hawk_gch_t* last;
|
dst->gc_next = src->gc_next;
|
||||||
|
dst->gc_next->gc_prev = dst;
|
||||||
last = list->gc_prev;
|
dst->gc_prev = src->gc_prev;
|
||||||
last->gc_next = src->gc_next;
|
dst->gc_prev->gc_next = dst;
|
||||||
last->gc_next->gc_prev = last;
|
|
||||||
list->gc_prev = src->gc_prev;
|
|
||||||
list->gc_prev->gc_next = list;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst->gc_prev = dst;
|
||||||
|
dst->gc_next = dst;
|
||||||
|
}
|
||||||
|
|
||||||
src->gc_prev = src;
|
src->gc_prev = src;
|
||||||
src->gc_next = src;
|
src->gc_next = src;
|
||||||
}
|
}
|
||||||
@ -153,7 +193,7 @@ static void gc_dump_refs (hawk_rtx_t* rtx, hawk_gch_t* list)
|
|||||||
printf (" %p %d\n", gch, (int)gch->gc_refs);
|
printf (" %p %d\n", gch, (int)gch->gc_refs);
|
||||||
gch = gch->gc_next;
|
gch = gch->gc_next;
|
||||||
}
|
}
|
||||||
printf ("-----all_count => %d---------\n\n", (int)rtx->gc.all_count);
|
printf ("-----all_count => %d---------\n", (int)rtx->gc.all_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gc_move_reachables (hawk_gch_t* list, hawk_gch_t* reachable_list)
|
static void gc_move_reachables (hawk_gch_t* list, hawk_gch_t* reachable_list)
|
||||||
@ -212,11 +252,12 @@ static void gc_free_unreachables (hawk_rtx_t* rtx, hawk_gch_t* list)
|
|||||||
|
|
||||||
while (list->gc_next != list)
|
while (list->gc_next != list)
|
||||||
{
|
{
|
||||||
gch = list->gc_next;
|
gch = list->gc_next; /* the first entry in the list */
|
||||||
|
|
||||||
printf ("^^^^^^^^^^^ freeing %p gc_refs %d v_refs %d\n", gch, (int)gch->gc_refs, (int)hawk_gch_to_val(gch)->v_refs);
|
printf ("^^^^^^^^^^^ freeing %p gc_refs %d v_refs %d\n", gch, (int)gch->gc_refs, (int)hawk_gch_to_val(gch)->v_refs);
|
||||||
//hawk_rtx_freeval (rtx, hawk_gch_to_val(gch), 0);
|
#if 0
|
||||||
|
hawk_rtx_freeval (rtx, hawk_gch_to_val(gch), 0);
|
||||||
|
#else
|
||||||
{
|
{
|
||||||
// TODO: revise this. MAP ONLY as of now.
|
// TODO: revise this. MAP ONLY as of now.
|
||||||
hawk_val_map_t* v = (hawk_val_map_t*)hawk_gch_to_val(gch);
|
hawk_val_map_t* v = (hawk_val_map_t*)hawk_gch_to_val(gch);
|
||||||
@ -230,22 +271,23 @@ printf ("^^^^^^^^^^^ freeing %p gc_refs %d v_refs %d\n", gch, (int)gch->gc_re
|
|||||||
{
|
{
|
||||||
if (HAWK_MAP_VPTR(pair) == v)
|
if (HAWK_MAP_VPTR(pair) == v)
|
||||||
{
|
{
|
||||||
HAWK_MAP_VPTR(pair) = hawk_rtx_makenilval(rtx);
|
|
||||||
refs++;
|
refs++;
|
||||||
|
HAWK_MAP_VPTR(pair) = hawk_rtx_makenilval(rtx);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HAWK_MAP_VPTR(pair) = hawk_rtx_makenilval(rtx);
|
|
||||||
hawk_rtx_refdownval (rtx, HAWK_MAP_VPTR(pair));
|
hawk_rtx_refdownval (rtx, HAWK_MAP_VPTR(pair));
|
||||||
|
HAWK_MAP_VPTR(pair) = hawk_rtx_makenilval(rtx);
|
||||||
}
|
}
|
||||||
pair = hawk_map_getnextpair(v->map, &itr);
|
pair = hawk_map_getnextpair(v->map, &itr);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf (" >>>>>>>> freeing %p val %p gc_refs %d v_refs %d refs %d\n", gch, v, (int)gch->gc_refs, (int)hawk_gch_to_val(gch)->v_refs, (int)refs);
|
//printf (" >>>>>>>> freeing %p val %p gc_refs %d v_refs %d refs %d\n", gch, v, (int)gch->gc_refs, (int)hawk_gch_to_val(gch)->v_refs, (int)refs);
|
||||||
while (refs-- > 0) hawk_rtx_refdownval (rtx, v);
|
while (refs-- > 0) hawk_rtx_refdownval (rtx, v);
|
||||||
|
|
||||||
printf (" >>>>>>>> freed %p\n", gch);
|
//printf (" >>>>>>>> freed %p\n", gch);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,7 +308,8 @@ gc_dump_refs (rtx, &rtx->gc.all);
|
|||||||
gc_dump_refs (rtx, &rtx->gc.all);
|
gc_dump_refs (rtx, &rtx->gc.all);
|
||||||
HAWK_ASSERT (rtx->gc.all.gc_next == &rtx->gc.all);
|
HAWK_ASSERT (rtx->gc.all.gc_next == &rtx->gc.all);
|
||||||
|
|
||||||
gc_move_gchs (&rtx->gc.all, &reachable);
|
/* move all reachables back to the main list */
|
||||||
|
gc_move_all_gchs (&reachable, &rtx->gc.all);
|
||||||
|
|
||||||
printf ("collecting garbage.done ..\n");
|
printf ("collecting garbage.done ..\n");
|
||||||
}
|
}
|
||||||
@ -904,7 +947,7 @@ hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t da
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tmp == HAWK_NULL || hawk_rtx_setmapvalfld (rtx, map, p->key.ptr, p->key.len, tmp) == HAWK_NULL)
|
if (tmp == HAWK_NULL || hawk_rtx_setmapvalfld(rtx, map, p->key.ptr, p->key.len, tmp) == HAWK_NULL)
|
||||||
{
|
{
|
||||||
if (tmp) hawk_rtx_freeval (rtx, tmp, 1);
|
if (tmp) hawk_rtx_freeval (rtx, tmp, 1);
|
||||||
hawk_rtx_freeval (rtx, map, 1);
|
hawk_rtx_freeval (rtx, map, 1);
|
||||||
@ -915,9 +958,7 @@ hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t da
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
hawk_val_t* hawk_rtx_setmapvalfld (
|
hawk_val_t* hawk_rtx_setmapvalfld (hawk_rtx_t* rtx, hawk_val_t* map, const hawk_ooch_t* kptr, hawk_oow_t klen, hawk_val_t* v)
|
||||||
hawk_rtx_t* rtx, hawk_val_t* map,
|
|
||||||
const hawk_ooch_t* kptr, hawk_oow_t klen, hawk_val_t* v)
|
|
||||||
{
|
{
|
||||||
HAWK_ASSERT (HAWK_RTX_GETVALTYPE (rtx, map) == HAWK_VAL_MAP);
|
HAWK_ASSERT (HAWK_RTX_GETVALTYPE (rtx, map) == HAWK_VAL_MAP);
|
||||||
|
|
||||||
@ -1143,7 +1184,7 @@ void hawk_rtx_freeval (hawk_rtx_t* rtx, hawk_val_t* val, int cache)
|
|||||||
|
|
||||||
case HAWK_VAL_MAP:
|
case HAWK_VAL_MAP:
|
||||||
#if defined(HAWK_ENABLE_GC)
|
#if defined(HAWK_ENABLE_GC)
|
||||||
printf ("FREEING VAL %p\n");
|
printf ("FREEING GCH %p VAL %p\n", hawk_val_to_gch(val), val);
|
||||||
rtx->gc.all_count--;
|
rtx->gc.all_count--;
|
||||||
gc_unchain_val (val);
|
gc_unchain_val (val);
|
||||||
hawk_map_fini (((hawk_val_map_t*)val)->map);
|
hawk_map_fini (((hawk_val_map_t*)val)->map);
|
||||||
|
Loading…
Reference in New Issue
Block a user