浏览代码

feat & fix: 添加守护器的测试程序

添加守护器的测试程序
修复守护器的执行bug
SongZihuan 3 年之前
父节点
当前提交
877c797d4b
共有 4 个文件被更改,包括 168 次插入37 次删除
  1. 4 2
      src/core/env.c
  2. 119 33
      src/core/gc.c
  3. 2 2
      src/core/run.c
  4. 43 0
      test/src/run_code.c

+ 4 - 2
src/core/env.c

@@ -1486,9 +1486,11 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
     if (!is_normal)
     if (!is_normal)
         freeMark(env->activity);  // 遇到非正常退出时, 释放`mark`
         freeMark(env->activity);  // 遇到非正常退出时, 释放`mark`
 
 
-    if (env->activity->type == act_top || env->activity->type == act_gc || env->activity->type == act_guardian) // 顶层或gc/guardian层
+    if (env->activity->type == act_top || env->activity->type == act_gc || env->activity->type == act_guardian) {// 顶层或gc/guardian层
         runTopMessageProcess((env->activity->type == act_top), env);
         runTopMessageProcess((env->activity->type == act_top), env);
-    else {
+        if (env->activity->type == act_guardian)
+            env->activity->prev->process_msg_first++;  // guardian开始处理时, 已经在原activity中有msg了, 所以要先处理
+    } else {
         connectMessage(&(env->activity->msg_down), env->activity->prev->msg_down);
         connectMessage(&(env->activity->msg_down), env->activity->prev->msg_down);
         env->activity->prev->msg_down = env->activity->msg_down;
         env->activity->prev->msg_down = env->activity->msg_down;
         env->activity->msg_down = NULL;
         env->activity->msg_down = NULL;

+ 119 - 33
src/core/gc.c

@@ -5,39 +5,125 @@
 #include "__env.h"
 #include "__env.h"
 
 
 /* gc 操控函数 */
 /* gc 操控函数 */
-#define GC_FUNC_DEFINED(type) \
-void gc_add##type(af_##type *obj, af_Environment *env) { \
-    obj->gc.prev = NULL; \
-    if (env->core->gc_##type != NULL) { \
-        env->core->gc_##type->gc.prev = obj; \
-    }                             \
-    obj->gc.next = env->core->gc_##type; \
-    env->core->gc_##type = obj;  \
-    env->core->gc_count->num++;  \
-} \
-void gc_add##type##ByCore(af_##type *obj, af_Core *core) { \
-if (obj->gc.next != NULL || obj->gc.prev != NULL) {return;} \
-obj->gc.prev = NULL; \
-obj->gc.next = core->gc_##type; \
-core->gc_##type = obj;        \
-core->gc_count->num++;  \
-} \
-void gc_add##type##Reference(af_##type *obj) { \
-    obj->gc.info.reference++; \
-} \
-void gc_del##type##Reference(af_##type *obj) { \
-    obj->gc.info.reference--; \
-} \
-GcCount gc_get##type##Reference(af_##type *obj) { \
-    return obj->gc.info.reference; \
-}
-
-GC_FUNC_DEFINED(ObjectData)
-GC_FUNC_DEFINED(Object)
-GC_FUNC_DEFINED(Var)
-GC_FUNC_DEFINED(VarSpace)
-
-#undef GC_FUNC_DEFINED
+
+void gc_addObjectData(af_ObjectData *obj, af_Environment *env){
+    obj->gc.prev = ((void *) 0);
+    if (env->core->gc_ObjectData != ((void *) 0))
+        env->core->gc_ObjectData->gc.prev = obj;
+    obj->gc.next = env->core->gc_ObjectData;
+    env->core->gc_ObjectData = obj;
+    env->core->gc_count->num++;
+}
+
+void gc_addObjectDataByCore(af_ObjectData *obj, af_Core *core){
+    if (obj->gc.next != ((void *) 0) || obj->gc.prev != ((void *) 0))
+        return;
+    obj->gc.prev = ((void *) 0);
+    obj->gc.next = core->gc_ObjectData;
+    core->gc_ObjectData = obj;
+    core->gc_count->num++;
+}
+
+void gc_addObjectDataReference(af_ObjectData *obj){
+    obj->gc.info.reference++;
+}
+
+void gc_delObjectDataReference(af_ObjectData *obj){
+    obj->gc.info.reference--;
+}
+
+GcCount gc_getObjectDataReference(af_ObjectData *obj){
+    return obj->gc.info.reference;
+}
+
+void gc_addObject(af_Object *obj, af_Environment *env){
+    obj->gc.prev = ((void *) 0);
+    if (env->core->gc_Object != ((void *) 0))
+        env->core->gc_Object->gc.prev = obj;
+    obj->gc.next = env->core->gc_Object;
+    env->core->gc_Object = obj;
+    env->core->gc_count->num++;
+}
+
+void gc_addObjectByCore(af_Object *obj, af_Core *core){
+    if (obj->gc.next != ((void *) 0) || obj->gc.prev != ((void *) 0))
+        return;
+    obj->gc.prev = ((void *) 0);
+    obj->gc.next = core->gc_Object;
+    core->gc_Object = obj;
+    core->gc_count->num++;
+}
+
+void gc_addObjectReference(af_Object *obj){
+    obj->gc.info.reference++;
+}
+
+void gc_delObjectReference(af_Object *obj){
+    obj->gc.info.reference--;
+}
+
+GcCount gc_getObjectReference(af_Object *obj){
+    return obj->gc.info.reference;
+}
+
+void gc_addVar(af_Var *obj, af_Environment *env) {
+    obj->gc.prev = ((void *) 0);
+    if (env->core->gc_Var != ((void *) 0))
+        env->core->gc_Var->gc.prev = obj;
+    obj->gc.next = env->core->gc_Var;
+    env->core->gc_Var = obj;
+    env->core->gc_count->num++;
+}
+
+void gc_addVarByCore(af_Var *obj, af_Core *core) {
+    if (obj->gc.next != ((void *) 0) || obj->gc.prev != ((void *) 0))
+        return;
+    obj->gc.prev = ((void *) 0);
+    obj->gc.next = core->gc_Var;
+    core->gc_Var = obj;
+    core->gc_count->num++;
+}
+
+void gc_addVarReference(af_Var *obj) {
+    obj->gc.info.reference++;
+}
+
+void gc_delVarReference(af_Var *obj) {
+    obj->gc.info.reference--;
+}
+
+GcCount gc_getVarReference(af_Var *obj) {
+    return obj->gc.info.reference;
+}
+
+void gc_addVarSpace(af_VarSpace *obj, af_Environment *env){
+    obj->gc.prev = ((void *) 0);
+    if (env->core->gc_VarSpace != ((void *) 0)) { env->core->gc_VarSpace->gc.prev = obj; }
+    obj->gc.next = env->core->gc_VarSpace;
+    env->core->gc_VarSpace = obj;
+    env->core->gc_count->num++;
+}
+
+void gc_addVarSpaceByCore(af_VarSpace *obj, af_Core *core) {
+    if (obj->gc.next != ((void *) 0) || obj->gc.prev != ((void *) 0))
+        return;
+    obj->gc.prev = ((void *) 0);
+    obj->gc.next = core->gc_VarSpace;
+    core->gc_VarSpace = obj;
+    core->gc_count->num++;
+}
+
+void gc_addVarSpaceReference(af_VarSpace *obj) {
+    obj->gc.info.reference++;
+}
+
+void gc_delVarSpaceReference(af_VarSpace *obj) {
+    obj->gc.info.reference--;
+}
+
+GcCount gc_getVarSpaceReference(af_VarSpace *obj) {
+    return obj->gc.info.reference;
+}
 
 
 /* gc_DestructList 函数 */
 /* gc_DestructList 函数 */
 /* gc_DestructList 创建与释放 */
 /* gc_DestructList 创建与释放 */

+ 2 - 2
src/core/run.c

@@ -404,9 +404,9 @@ bool iterCode(af_Code *code, int mode, af_Environment *env){
                 pushDestructActivity(env->activity->dl_next, env);
                 pushDestructActivity(env->activity->dl_next, env);
             continue;
             continue;
         } else if (env->activity->type == act_guardian) {
         } else if (env->activity->type == act_guardian) {
-            if (env->activity->dl_next == NULL)
+            if (env->activity->gl_next == NULL) {
                 popActivity(true, NULL, env);  // 结束运行
                 popActivity(true, NULL, env);  // 结束运行
-            else
+            } else
                 pushGuadianFuncActivity(env->activity->gl_next, env);
                 pushGuadianFuncActivity(env->activity->gl_next, env);
             continue;
             continue;
         }
         }

+ 43 - 0
test/src/run_code.c

@@ -369,6 +369,25 @@ bool infixFunc(char *id, af_Object *obj) {
     return true;
     return true;
 }
 }
 
 
+struct GDData {
+    af_Object *func;
+    bool no_first;
+};
+
+af_GuardianList *gd_func(char *type, bool is_guard, struct GDData *data, af_Environment *env) {
+    if (data->no_first)
+        return NULL;
+
+    af_GuardianList *gd = NULL;
+    data->no_first = true;
+    pushGuardianList(data->func, &gd);
+    return gd;
+}
+
+void gd_destruct(char *type, struct GDData *data, af_Environment *env) {
+    gc_delReference(data->func);
+}
+
 int main(int argc, char **argv) {
 int main(int argc, char **argv) {
     jmp_buf main_buf;
     jmp_buf main_buf;
     char *base_path = getExedir(1);
     char *base_path = getExedir(1);
@@ -430,6 +449,8 @@ INIT_ERROR:
         printf("object(%p)\n", obj);
         printf("object(%p)\n", obj);
     }
     }
 
 
+    af_Object *af_func = NULL;
+
     {
     {
         af_ObjectAPI *api = makeObjectAPI();
         af_ObjectAPI *api = makeObjectAPI();
         af_Object *obj;
         af_Object *obj;
@@ -473,6 +494,7 @@ INIT_ERROR:
         FREE_SYMBOL(getSize_2);
         FREE_SYMBOL(getSize_2);
         FREE_SYMBOL(initData_2);
         FREE_SYMBOL(initData_2);
         FREE_SYMBOL(freeData_2);
         FREE_SYMBOL(freeData_2);
+        af_func = obj;
         printf("func(%p)\n", obj);
         printf("func(%p)\n", obj);
     }
     }
 
 
@@ -1181,6 +1203,27 @@ INIT_ERROR:
     }
     }
 #endif
 #endif
 
 
+    {
+        DLC_SYMBOL(GuardianFunc) func = MAKE_SYMBOL(gd_func, GuardianFunc);
+        DLC_SYMBOL(GuardianDestruct) des = MAKE_SYMBOL(gd_destruct, GuardianDestruct);
+        struct GDData *data = NULL;
+        addGuardian("test", false, sizeof(struct GDData), func, des, (void **) &data, env);
+        data->func = af_func;
+        gc_addReference(af_func);
+        FREE_SYMBOL(func);
+        FREE_SYMBOL(des);
+
+        printf("TAG U:\n");
+        af_Code *bt1 = makeElementCode("str", 0, 1, "TagU.aun");
+        af_Code *bt2 = makeElementCode("global", 0, 1, "TagU.aun");
+
+        pushCode(&bt1, bt2);
+        runCodeFromMemory(bt1, 0, env);
+        freeAllCode(bt1);
+        bool re = popGuardian("test", env);
+        printf("popGuardian: %d\n\n", re);
+    }
+
     /* 错误用例 */
     /* 错误用例 */
 
 
     {  // 中缀调用测试
     {  // 中缀调用测试