Explorar o código

refactor: 处理VarSpace的gc机制

SongZihuan %!s(int64=3) %!d(string=hai) anos
pai
achega
dfeaa5c316
Modificáronse 7 ficheiros con 18 adicións e 11 borrados
  1. 4 4
      src/core/env.c
  2. 1 1
      src/core/global_obj.c
  3. 1 1
      src/core/object.c
  4. 1 1
      src/core/thread.c
  5. 8 0
      src/core/var.c
  6. 1 1
      src/runtime/base/str_obj.c
  7. 2 3
      test/src/run_code.c

+ 4 - 4
src/core/env.c

@@ -956,12 +956,12 @@ af_Environment *makeEnvironment(enum GcRunTime grt) {
     env->activity = makeTopActivity(NULL, NULL, env->protect, env->global, env);
 
     makeVarToProtectVarSpace("global", 3, 3, 3, env->global, env);
-//    gc_delReference(env->global, env);
 
-    af_Object *cycle = makeCycleObject(env);
+    af_Object *cycle = makeCycleObject(env);  // gc 使用的函数 TODO-szh 移动到 runtime-tool 上
     makeVarToProtectVarSpace(mg_sys_cycle, 3, 3, 3, cycle, env);
 
-//    gc_delReference(env->protect, env);
+    gc_delReference(env->protect, env);
+//    gc_delReference(env->global, env);
 //    gc_delReference(cycle, env);
     return env;
 }
@@ -1518,7 +1518,7 @@ bool setFuncActivityAddVar(af_Environment *env){
         /* 新层的变量空间应该属于belong而不是func */
         env->activity->run_varlist = pushNewVarList(env->activity->belong, env->activity->run_varlist, env);;
         env->activity->count_run_varlist++;
-//        gc_delReference(env->activity->run_varlist, env);
+        gc_delReference(env->activity->run_varlist, env);
     }
     pthread_mutex_unlock(env->activity->gc_lock);
 

+ 1 - 1
src/core/global_obj.c

@@ -10,7 +10,7 @@ static char *global_id = "global-object";
 
 static void initGOD(af_Object *obj, GlobalObjectData *data, af_Environment *env) {
     data->share = makeVarSpace(obj, 3, 2, 0, env);
-//    gc_delReference(data->share, env);
+    gc_delReference(data->share, env);
 }
 
 static void freeGOD(GlobalObjectData *god, af_Object  *obj, af_Environment *env) {

+ 1 - 1
src/core/object.c

@@ -89,7 +89,7 @@ af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inh
             init(id, obj, obj->data->data, env);
     }
 
-//    gc_delReference(od->var_space, env);
+    gc_delReference(od->var_space, env);
 //    gc_delReference(od, env);
     return obj;
 }

+ 1 - 1
src/core/thread.c

@@ -33,7 +33,7 @@ af_Environment *startRunThread(af_Environment *env, af_VarSpace *vs, af_Code *co
     vsl->next = new->activity->run_varlist;
     new->activity->run_varlist = vsl;
     new->activity->count_run_varlist++;
-//    gc_delReference(vs, base);
+    gc_delReference(vs, base);
 
     if (enable)  // 如果未Enable, 则暂时不启动线程
         startRunThread_(new, code, free_code);

+ 8 - 0
src/core/var.c

@@ -626,6 +626,14 @@ bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpace
     return false;
 }
 
+/**
+ * 压入新的空VarSpace
+ * 并且保留gc计数
+ * @param belong
+ * @param base
+ * @param env
+ * @return
+ */
 af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env){
     af_VarSpace *vs = makeVarSpace(belong, 3, 2, 0, env);
     af_VarSpaceListNode *new = makeVarSpaceList(vs);

+ 1 - 1
src/runtime/base/str_obj.c

@@ -49,7 +49,7 @@ static void strFuncInit(char *id, af_Object *obj, ObjectStrFunc *data, af_Enviro
     data->func_var_list = copyVarSpaceList(getRunVarSpaceList(env));
     data->share_vs = makeVarSpace(obj, 3, 2, 0, env);
     data->api = makeAPIFromList(api_list);
-//    gc_delReference(data->share_vs, env);
+    gc_delReference(data->share_vs, env);
 }
 
 static bool strFuncArgCodeList(char *id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, void **mark, af_Environment *env) {

+ 2 - 3
test/src/run_code.c

@@ -192,7 +192,7 @@ size_t getSize3(char *id, af_Object *obj) {
 
 void initData3(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
     *data = makeVarSpace(obj, 3, 2, 0, env);
-//    gc_delReference(*data, env);
+    gc_delReference(*data, env);
 }
 
 void freeData3(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
@@ -895,7 +895,6 @@ INIT_ERROR:
     printf("\n");
     sleep(2);
 
-    /*
     {  // 正常程序
         printf("TAG A: [Normal test]\n");
         af_Code *bt1 = makeElementCode("object", 0, 1, "Taga.aun");
@@ -1206,7 +1205,7 @@ INIT_ERROR:
 //        freeAllCode(bt1);
 //        printf("\n");
 //    }
-*/
+
     printf("freeEnvironment:\n");
     destructAFunEnvironment(env);