From ae3cfb63f490a444bfeb31ae267d0896281c527c Mon Sep 17 00:00:00 2001 From: paladin-t Date: Tue, 1 Mar 2016 16:55:33 +0800 Subject: [PATCH] *fixed a gc issue. --- core/my_basic.c | 101 +++++++++++++++++++++++++------------------- output/my_basic.exe | Bin 365056 -> 365568 bytes 2 files changed, 57 insertions(+), 44 deletions(-) diff --git a/core/my_basic.c b/core/my_basic.c index 93cd77a..6839c29 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -563,6 +563,7 @@ typedef struct _object_t { _import_info_t* import_info; #endif /* MB_ENABLE_SOURCE_TRACE */ mb_val_bytes_t bytes; + void* pointer; _raw_t raw; } data; bool_t ref; @@ -1440,15 +1441,17 @@ static char* _extract_string(_object_t* obj); default: break; \ } #define _ADDGC(__o, __g) \ - switch((__o)->type) { \ - _ADDGC_USERTYPE_REF(__o, __g) \ - _ADDGC_ARRAY(__o, __g) \ - _ADDGC_COLL(__o, __g) \ - _ADDGC_COLL_IT(__o, __g) \ - _ADDGC_CLASS(__o, __g) \ - _ADDGC_ROUTINE(__o, __g) \ - _ADDGC_STRING(__o) \ - default: break; \ + if(!(__o)->data.pointer || !_ht_find((__g)->collected_table, (__o)->data.pointer)) { \ + switch((__o)->type) { \ + _ADDGC_USERTYPE_REF(__o, __g) \ + _ADDGC_ARRAY(__o, __g) \ + _ADDGC_COLL(__o, __g) \ + _ADDGC_COLL_IT(__o, __g) \ + _ADDGC_CLASS(__o, __g) \ + _ADDGC_ROUTINE(__o, __g) \ + _ADDGC_STRING(__o) \ + default: break; \ + } \ } static bool_t _lock_ref_object(_lock_t* lk, _ref_t* ref, void* obj); @@ -1466,18 +1469,18 @@ static void _gc_add(_ref_t* ref, void* data, _gc_t* gc); static void _gc_remove(_ref_t* ref, void* data); static int _gc_add_reachable(void* data, void* extra, void* ht); static void _gc_get_reachable(mb_interpreter_t* s, _ht_node_t* ht); -static int _gc_destroy_garbage_in_list(void* data, void* extra, void* gc); -static int _gc_destroy_garbage_in_dict(void* data, void* extra, void* gc); +static int _gc_destroy_garbage_in_list(void* data, void* extra, _gc_t* gc); +static int _gc_destroy_garbage_in_dict(void* data, void* extra, _gc_t* gc); #ifdef MB_ENABLE_CLASS -static int _gc_destroy_garbage_in_class(void* data, void* extra, void* gc); +static int _gc_destroy_garbage_in_class(void* data, void* extra, _gc_t* gc); #endif /* MB_ENABLE_CLASS */ #ifdef MB_ENABLE_LAMBDA -static int _gc_destroy_garbage_in_lambda(void* data, void* extra, void* gc); +static int _gc_destroy_garbage_in_lambda(void* data, void* extra, _gc_t* gc); static void _gc_destroy_garbage_in_outer_scope(_running_context_ref_t* p, _gc_t* gc); #endif /* MB_ENABLE_LAMBDA */ -static int _gc_destroy_garbage(void* data, void* extra); +static int _gc_destroy_garbage(void* data, void* extra, _gc_t* gc); #ifdef MB_ENABLE_CLASS -static int _gc_destroy_garbage_class(void* data, void* extra); +static int _gc_destroy_garbage_class(void* data, void* extra, _gc_t* gc); #endif /* MB_ENABLE_CLASS */ static void _gc_swap_tables(mb_interpreter_t* s); static void _gc_try_trigger(mb_interpreter_t* s); @@ -5543,17 +5546,16 @@ static void _gc_get_reachable(mb_interpreter_t* s, _ht_node_t* ht) { } } -static int _gc_destroy_garbage_in_list(void* data, void* extra, void* gc) { +static int _gc_destroy_garbage_in_list(void* data, void* extra, _gc_t* gc) { /* Destroy only the capsule (wrapper) of an object, leave the data behind, and add it to GC if possible */ int result = _OP_RESULT_NORMAL; _object_t* obj = 0; - _gc_t* _gc = (_gc_t*)gc; mb_unrefvar(extra); mb_assert(data); obj = (_object_t*)data; - _ADDGC(obj, _gc); + _ADDGC(obj, gc); safe_free(obj); result = _OP_RESULT_DEL_NODE; @@ -5561,20 +5563,19 @@ static int _gc_destroy_garbage_in_list(void* data, void* extra, void* gc) { return result; } -static int _gc_destroy_garbage_in_dict(void* data, void* extra, void* gc) { +static int _gc_destroy_garbage_in_dict(void* data, void* extra, _gc_t* gc) { /* Destroy only the capsule (wrapper) of an object, leave the data behind, deal with extra as well, and add it to GC if possible */ int result = _OP_RESULT_NORMAL; _object_t* obj = 0; - _gc_t* _gc = (_gc_t*)gc; mb_assert(data); obj = (_object_t*)data; - _ADDGC(obj, _gc); + _ADDGC(obj, gc); safe_free(obj); obj = (_object_t*)extra; - _ADDGC(obj, _gc); + _ADDGC(obj, gc); safe_free(obj); result = _OP_RESULT_DEL_NODE; @@ -5583,11 +5584,10 @@ static int _gc_destroy_garbage_in_dict(void* data, void* extra, void* gc) { } #ifdef MB_ENABLE_CLASS -static int _gc_destroy_garbage_in_class(void* data, void* extra, void* gc) { +static int _gc_destroy_garbage_in_class(void* data, void* extra, _gc_t* gc) { /* Destroy only the capsule (wrapper) of an object, leave the data behind, deal with extra as well, and add it to GC if possible */ int result = _OP_RESULT_NORMAL; _object_t* obj = 0; - _gc_t* _gc = (_gc_t*)gc; mb_unrefvar(extra); mb_assert(data); @@ -5598,7 +5598,7 @@ static int _gc_destroy_garbage_in_class(void* data, void* extra, void* gc) { safe_free(obj->data.variable->name); safe_free(obj->data.variable); } else { - _ADDGC(obj, _gc); + _ADDGC(obj, gc); } safe_free(obj); @@ -5609,11 +5609,10 @@ static int _gc_destroy_garbage_in_class(void* data, void* extra, void* gc) { #endif /* MB_ENABLE_CLASS */ #ifdef MB_ENABLE_LAMBDA -static int _gc_destroy_garbage_in_lambda(void* data, void* extra, void* gc) { +static int _gc_destroy_garbage_in_lambda(void* data, void* extra, _gc_t* gc) { /* Destroy only the capsule (wrapper) of an object, leave the data behind, deal with extra as well, and add it to GC if possible */ int result = _OP_RESULT_NORMAL; _object_t* obj = 0; - _gc_t* _gc = (_gc_t*)gc; mb_unrefvar(extra); mb_assert(data); @@ -5624,7 +5623,7 @@ static int _gc_destroy_garbage_in_lambda(void* data, void* extra, void* gc) { safe_free(obj->data.variable->name); safe_free(obj->data.variable); } else { - _ADDGC(obj, _gc); + _ADDGC(obj, gc); } safe_free(obj); @@ -5644,11 +5643,11 @@ static void _gc_destroy_garbage_in_outer_scope(_running_context_ref_t* p, _gc_t* } #endif /* MB_ENABLE_LAMBDA */ -static int _gc_destroy_garbage(void* data, void* extra) { +static int _gc_destroy_garbage(void* data, void* extra, _gc_t* gc) { /* Destroy a garbage */ int result = _OP_RESULT_NORMAL; - _gc_t* gc = 0; _ref_t* ref = 0; + bool_t proc = true; bool_t cld = false; #ifdef MB_ENABLE_COLLECTION_LIB _list_t* lst = 0; @@ -5661,7 +5660,8 @@ static int _gc_destroy_garbage(void* data, void* extra) { mb_assert(data && extra); ref = (_ref_t*)extra; - gc = &ref->s->gc; + if(_ht_find(gc->collected_table, ref)) + goto _exit; switch(ref->type) { #ifdef MB_ENABLE_COLLECTION_LIB case _DT_LIST: @@ -5690,34 +5690,41 @@ static int _gc_destroy_garbage(void* data, void* extra) { break; #endif /* MB_ENABLE_LAMBDA */ - default: /* Do nothing */ + default: + proc = false; + break; } - if(ref->count) { + if(proc && ref->count) { cld = *ref->count == _NONE_REF + 1; _unref(ref, data); - if(cld) + if(cld) { _ht_set_or_insert(gc->collected_table, ref, data); + _ht_set_or_insert(gc->collected_table, data, ref); + } } - result = _OP_RESULT_DEL_NODE; +_exit: + if(proc) + result = _OP_RESULT_DEL_NODE; return result; } #ifdef MB_ENABLE_CLASS -static int _gc_destroy_garbage_class(void* data, void* extra) { +static int _gc_destroy_garbage_class(void* data, void* extra, _gc_t* gc) { /* Destroy a class instance garbage */ int result = _OP_RESULT_NORMAL; - _gc_t* gc = 0; _ref_t* ref = 0; + bool_t proc = true; bool_t cld = false; _class_t* instance = 0; mb_assert(data && extra); ref = (_ref_t*)extra; - gc = &ref->s->gc; + if(_ht_find(gc->collected_table, ref)) + goto _exit; switch(ref->type) { case _DT_CLASS: instance = (_class_t*)data; @@ -5732,17 +5739,23 @@ static int _gc_destroy_garbage_class(void* data, void* extra) { #endif /* MB_ENABLE_LAMBDA */ break; - default: /* Do nothing */ + default: + proc = false; + break; } - if(ref->count) { + if(proc && ref->count) { cld = *ref->count == _NONE_REF + 1; _unref(ref, data); - if(cld) + if(cld) { _ht_set_or_insert(gc->collected_table, ref, data); + _ht_set_or_insert(gc->collected_table, data, ref); + } } - result = _OP_RESULT_DEL_NODE; +_exit: + if(proc) + result = _OP_RESULT_DEL_NODE; return result; } @@ -5789,9 +5802,9 @@ static void _gc_collect_garbage(mb_interpreter_t* s, int depth) { /* Collect garbage */ do { #ifdef MB_ENABLE_CLASS - _ht_foreach(s->gc.table, _gc_destroy_garbage_class); + _HT_FOREACH(s->gc.table, _do_nothing_on_object, _gc_destroy_garbage_class, &s->gc); #endif /* MB_ENABLE_CLASS */ - _ht_foreach(s->gc.table, _gc_destroy_garbage); + _HT_FOREACH(s->gc.table, _do_nothing_on_object, _gc_destroy_garbage, &s->gc); _ht_clear(s->gc.table); if(s->gc.collecting > 1) s->gc.collecting--; diff --git a/output/my_basic.exe b/output/my_basic.exe index e9175d2ae5badcf66d74ef6a8df5b9611d010497..e5ace809c36ddca912c236ab9f50699d0e1211f1 100755 GIT binary patch delta 20100 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 delta 19914 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