Ver código fonte

feat: gc引用计数操作使用互斥锁保护

SongZihuan 3 anos atrás
pai
commit
b2a9d7ec43

+ 8 - 8
include/core/env.h

@@ -39,18 +39,18 @@ AFUN_CORE_EXPORT af_Environment *deriveEnvironment(bool derive_tmp, bool derive_
 AFUN_CORE_EXPORT af_Message *makeMessage(char *type, size_t size);
 AFUN_CORE_EXPORT af_Message *freeMessage(af_Message *msg);
 AFUN_CORE_EXPORT bool freeMessageCount(size_t count, af_Message *msg);
-AFUN_CORE_EXPORT af_Message *makeNORMALMessage(af_Object *obj);
+AFUN_CORE_EXPORT af_Message *makeNORMALMessage(af_Object *obj, af_Environment *env);
 AFUN_CORE_EXPORT af_Message *makeERRORMessage(char *type, char *error, af_Environment *env);
 AFUN_CORE_EXPORT af_Message *makeERRORMessageFormat(char *type, af_Environment *env, const char *format, ...);
-AFUN_CORE_EXPORT af_Message *makeIMPORTMessage(char *mark, af_Object *obj);
+AFUN_CORE_EXPORT af_Message *makeIMPORTMessage(char *mark, af_Object *obj, af_Environment *env);
 
 /* ErrorInfo 创建与释放 */
 AFUN_CORE_EXPORT af_ErrorInfo *makeErrorInfo(char *type, char *error, char *note, FileLine line, FilePath path);
-AFUN_CORE_EXPORT void freeErrorInfo(af_ErrorInfo *ei);
+AFUN_CORE_EXPORT void freeErrorInfo(af_ErrorInfo *ei, af_Environment *env);
 
 /* ImportInfo 创建与释放 */
-af_ImportInfo *makeImportInfo(char *mark, af_Object *obj);
-void freeImportInfo(af_ImportInfo *ii);
+af_ImportInfo *makeImportInfo(char *mark, af_Object *obj, af_Environment *env);
+void freeImportInfo(af_ImportInfo *ii, af_Environment *env);
 
 /* 运行环境 相关操作 */
 AFUN_CORE_EXPORT void enableEnvironment(af_Environment *env);
@@ -98,7 +98,7 @@ AFUN_CORE_EXPORT void fprintfErrorInfoStdout(af_ErrorInfo *ei);
 AFUN_CORE_EXPORT void pushErrorBacktracking(FileLine line, FilePath file, char *note, af_ErrorInfo *ei);
 
 /* GuardianList 相关操作 */
-af_GuardianList **pushGuardianList(af_Object *obj, af_Object *func, af_GuardianList **pgl);
+af_GuardianList **pushGuardianList(af_Object *obj, af_Object *func, af_GuardianList **pgl, af_Environment *env);
 
 /* 环境变量 属性访问 */
 AFUN_CORE_EXPORT char *findEnvVarData(char *name, af_Environment *env);
@@ -125,7 +125,7 @@ AFUN_CORE_EXPORT bool isEnviromentExit(af_Environment *env);
 AFUN_CORE_EXPORT size_t getEnviromentSonCount(af_Environment *env);
 
 /* 消息 属性访问 */
-AFUN_CORE_EXPORT af_Object *getMsgNormalData(af_Message *msg);
+AFUN_CORE_EXPORT af_Object *getMsgNormalData(af_Message *msg, af_Environment *env);
 AFUN_CORE_EXPORT af_ErrorInfo *getMsgErrorInfo(af_Message *msg);
 AFUN_CORE_EXPORT af_ImportInfo *getMsgImportInfo(af_Message *msg);
 
@@ -135,6 +135,6 @@ AFUN_CORE_EXPORT char *getError(af_ErrorInfo *ei);
 
 /* ImportInfo 属性访问 */
 AFUN_CORE_EXPORT char *getImportMark(af_ImportInfo *ii);
-AFUN_CORE_EXPORT af_Object *getImportObject(af_ImportInfo *ii);
+AFUN_CORE_EXPORT af_Object *getImportObject(af_ImportInfo *ii, af_Environment *env);
 
 #endif //AFUN_ENV

+ 3 - 3
include/core/func.h

@@ -43,11 +43,11 @@ NEW_DLC_SYMBOL(callFuncBody, callFuncBody);
 
 /* af_ArgCodeList 创建与释放 */
 AFUN_CORE_EXPORT af_ArgCodeList *makeArgCodeList(af_Code *code, size_t size, bool free_code, bool run_in_func);
-AFUN_CORE_EXPORT void freeAllArgCodeList(af_ArgCodeList *acl);
+AFUN_CORE_EXPORT void freeAllArgCodeList(af_ArgCodeList *acl, af_Environment *env);
 
 /* af_ArgList 创建与释放 */
-AFUN_CORE_EXPORT af_ArgList *makeArgList(char *name, af_Object *obj);
-AFUN_CORE_EXPORT void freeAllArgList(af_ArgList *al);
+AFUN_CORE_EXPORT af_ArgList *makeArgList(char *name, af_Object *obj, af_Environment *env);
+AFUN_CORE_EXPORT void freeAllArgList(af_ArgList *al, af_Environment *env);
 
 /* FuncBody 创建与释放 */
 AFUN_CORE_EXPORT af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code, char **msg_type);

+ 10 - 20
include/core/gc.h

@@ -14,20 +14,15 @@ enum af_GcListType {
 };
 
 /* gc 引用计数管理函数 */
-#define gc_addReference(obj) ((_Generic((obj), \
+#define gc_addReference(obj, env) ((_Generic((obj), \
                                af_Object *:gc_addObjectReference, \
                                af_Var *: gc_addVarReference, \
-                               af_VarSpace *: gc_addVarSpaceReference))(obj))
+                               af_VarSpace *: gc_addVarSpaceReference))((obj), (env)))
 
-#define gc_delReference(obj) ((_Generic((obj), \
+#define gc_delReference(obj, env) ((_Generic((obj), \
                                af_Object *: gc_delObjectReference, \
                                af_Var *: gc_delVarReference, \
-                               af_VarSpace *: gc_delVarSpaceReference))(obj))
-
-#define gc_getReference(obj) ((_Generic((obj), \
-                               af_Object *: gc_getObjectReference, \
-                               af_Var *: gc_getVarReference, \
-                               af_VarSpace *: gc_getVarSpaceReference))(obj))
+                               af_VarSpace *: gc_delVarSpaceReference))((obj), (env)))
 
 /* GcList 创建与释放 */
 AFUN_CORE_EXPORT af_GcList *makeGcList(enum af_GcListType type, void *data);
@@ -37,15 +32,10 @@ AFUN_CORE_EXPORT void freeAllGcList(af_GcList *gl);
 AFUN_CORE_EXPORT af_GcList *pushGcList(enum af_GcListType type, void *data, af_GcList *base);
 
 /* gc Reference 相关操作 */
-AFUN_CORE_EXPORT void gc_addObjectReference(af_Object *obj);
-AFUN_CORE_EXPORT void gc_addVarReference(af_Var *obj);
-AFUN_CORE_EXPORT void gc_addVarSpaceReference(af_VarSpace *obj);
-AFUN_CORE_EXPORT void gc_delObjectReference(af_Object *obj);
-AFUN_CORE_EXPORT void gc_delVarReference(af_Var *obj);
-AFUN_CORE_EXPORT void gc_delVarSpaceReference(af_VarSpace *obj);
-
-/* gc Reference 属性访问 */
-AFUN_CORE_EXPORT GcCount gc_getObjectReference(af_Object *obj);
-AFUN_CORE_EXPORT GcCount gc_getVarReference(af_Var *obj);
-AFUN_CORE_EXPORT GcCount gc_getVarSpaceReference(af_VarSpace *obj);
+AFUN_CORE_EXPORT void gc_addObjectReference(af_Object *obj, af_Environment *base);
+AFUN_CORE_EXPORT void gc_addVarReference(af_Var *obj, af_Environment *base);
+AFUN_CORE_EXPORT void gc_addVarSpaceReference(af_VarSpace *obj, af_Environment *base);
+AFUN_CORE_EXPORT void gc_delObjectReference(af_Object *obj, af_Environment *base);
+AFUN_CORE_EXPORT void gc_delVarReference(af_Var *obj, af_Environment *base);
+AFUN_CORE_EXPORT void gc_delVarSpaceReference(af_VarSpace *obj, af_Environment *base);
 #endif //AFUN_GC

+ 6 - 14
src/core/__gc.h

@@ -85,7 +85,6 @@ struct gc_Factory {
 #ifdef core_shared_t_EXPORTS
 #undef gc_addReference
 #undef gc_delReference
-#undef gc_getReference
 #define gc_addReference(obj) ((_Generic((obj), \
                                af_ObjectData *: gc_addObjectDataReference, \
                                af_Object *: gc_addObjectReference, \
@@ -97,12 +96,6 @@ struct gc_Factory {
                                af_Object *: gc_delObjectReference, \
                                af_Var *: gc_delVarReference, \
                                af_VarSpace *: gc_delVarSpaceReference))(obj))
-
-#define gc_getReference(obj) ((_Generic((obj), \
-                               af_ObjectData *: gc_getObjectDataReference, \
-                               af_Object *: gc_getObjectReference, \
-                               af_Var *: gc_getVarReference, \
-                               af_VarSpace *: gc_getVarSpaceReference))(obj))
 #endif
 
 /* gc_Factory 创建与释放 */
@@ -110,15 +103,14 @@ AFUN_CORE_NO_EXPORT gc_Factory *makegGcFactory(void);
 AFUN_CORE_NO_EXPORT void freeGcFactory(gc_Factory *factory);
 
 /* gc 对象新增函数 */
-AFUN_CORE_NO_EXPORT void gc_addObject(af_Object *obj, af_Environment *env);
-AFUN_CORE_NO_EXPORT void gc_addVar(af_Var *obj, af_Environment *env);
-AFUN_CORE_NO_EXPORT void gc_addVarSpace(af_VarSpace *obj, af_Environment *env);
-AFUN_CORE_NO_EXPORT void gc_addObjectData(struct af_ObjectData *obj, af_Environment *env);
+AFUN_CORE_NO_EXPORT void gc_addObject(af_Object *obj, af_Environment *base);
+AFUN_CORE_NO_EXPORT void gc_addVar(af_Var *obj, af_Environment *base);
+AFUN_CORE_NO_EXPORT void gc_addVarSpace(af_VarSpace *obj, af_Environment *base);
+AFUN_CORE_NO_EXPORT void gc_addObjectData(struct af_ObjectData *obj, af_Environment *base);
 
 /* gc Reference 管理函数 : 涉及af_ObjectData 不对外公开 */
-AFUN_CORE_NO_EXPORT void gc_addObjectDataReference(af_ObjectData *obj);
-AFUN_CORE_NO_EXPORT void gc_delObjectDataReference(af_ObjectData *obj);
-AFUN_CORE_NO_EXPORT GcCount gc_getObjectDataReference(af_ObjectData *obj);
+AFUN_CORE_NO_EXPORT void gc_addObjectDataReference(af_ObjectData *obj, af_Environment *base);
+AFUN_CORE_NO_EXPORT void gc_delObjectDataReference(af_ObjectData *obj, af_Environment *base);
 
 /* gc 操控函数 : gc的启动由解释器完全管理 */
 AFUN_CORE_NO_EXPORT af_GuardianList *gc_RunGC(af_Environment *env);

+ 48 - 48
src/core/env.c

@@ -11,9 +11,9 @@ static af_Activity *makeFuncActivity(af_Code *bt_top, af_Code *bt_start, bool re
 static af_Activity *makeTopActivity(af_Code *bt_top, af_Code *bt_start, af_VarSpace *protect, af_Object *belong);
 static af_Activity *makeTopImportActivity(af_Code *bt_top, af_Code *bt_start, af_VarSpace *protect, af_Object *belong, char *mark);
 static af_Activity *makeGuardianActivity(af_GuardianList *gl, af_GuardianList **pgl, af_Environment *env);
-static af_Activity *freeActivity(af_Activity *activity);
+static af_Activity *freeActivity(af_Activity *activity, af_Environment *env);
 static void freeActivityTop(af_Activity *activity);
-static void freeAllActivity(af_Activity *activity);
+static void freeAllActivity(af_Activity *activity, af_Environment *env);
 
 /* Activity 相关处理函数 */
 static void clearFuncActivity(af_Activity *activity);
@@ -75,9 +75,9 @@ static void fprintfNoteStderr(char *note);
 static void fprintfNoteStdout(char *note);
 
 /* af_GuardianList 创建与释放 */
-static af_GuardianList *makeGuardianList(af_Object *obj, af_Object *func);
-static af_GuardianList *freeGuardianList(af_GuardianList *gl);
-static void freeAllGuardianList(af_GuardianList *gl);
+static af_GuardianList *makeGuardianList(af_Object *obj, af_Object *func, af_Environment *env);
+static af_GuardianList *freeGuardianList(af_GuardianList *gl, af_Environment *env);
+static void freeAllGuardianList(af_GuardianList *gl, af_Environment *env);
 
 /* 内置顶层消息处理器 */
 static void mp_NORMAL(af_Message *msg, bool is_top, af_Environment *env);
@@ -263,7 +263,7 @@ static af_Activity *makeGuardianActivity(af_GuardianList *gl, af_GuardianList **
     return activity;
 }
 
-static af_Activity *freeActivity(af_Activity *activity) {
+static af_Activity *freeActivity(af_Activity *activity, af_Environment *env){
     pthread_rwlock_wrlock(&activity->gc_lock);
     af_Activity *prev = activity->prev;
 
@@ -275,12 +275,12 @@ static af_Activity *freeActivity(af_Activity *activity) {
 
     if (activity->type == act_guardian) {
         if (activity->gl != NULL)
-            freeAllGuardianList(activity->gl);
+            freeAllGuardianList(activity->gl, env);
     } else {
         freeVarSpaceListCount(activity->count_out_varlist, activity->out_varlist);
         freeVarSpaceListCount(activity->count_macro_varlist, activity->macro_varlist);
 
-        freeAllArgCodeList(activity->acl_start);
+        freeAllArgCodeList(activity->acl_start, env);
         if (activity->fi != NULL)
             freeFuncInfo(activity->fi);
         freeAllLiteralData(activity->ld);
@@ -304,9 +304,9 @@ static void freeActivityTop(af_Activity *activity) {
     free(activity->file);
 }
 
-static void freeAllActivity(af_Activity *activity) {
+static void freeAllActivity(af_Activity *activity, af_Environment *env){
     while (activity != NULL)
-        activity = freeActivity(activity);
+        activity = freeActivity(activity, env);
 }
 
 static void pushActivity(af_Activity *activity, af_Environment *env) {
@@ -581,10 +581,10 @@ void connectMessage(af_Message **base, af_Message *msg) {
     *base = msg;
 }
 
-af_Message *makeNORMALMessage(af_Object *obj) {
+af_Message *makeNORMALMessage(af_Object *obj, af_Environment *env){
     af_Message *msg = makeMessage("NORMAL", sizeof(af_Object *));
     *(af_Object **)msg->msg = obj;
-    gc_addReference(obj);
+    gc_addReference(obj, env);
     return msg;
 }
 
@@ -621,9 +621,9 @@ af_Message *makeERRORMessageFormat(char *type, af_Environment *env, const char *
     return makeERRORMessage(type, buf, env);;
 }
 
-af_Message *makeIMPORTMessage(char *mark, af_Object *obj) {
+af_Message *makeIMPORTMessage(char *mark, af_Object *obj, af_Environment *env){
     af_Message *msg = makeMessage("IMPORT", sizeof(af_ImportInfo *));
-    *(af_ImportInfo **)msg->msg = makeImportInfo(mark, obj);
+    *(af_ImportInfo **)msg->msg = makeImportInfo(mark, obj, env);
     return msg;
 }
 
@@ -748,7 +748,7 @@ static void mp_NORMAL(af_Message *msg, bool is_top, af_Environment *env) {
         writeErrorLog(aFunCoreLogger, "NORMAL msg: %p error", msg->msg);
         return;
     }
-    gc_delReference(*(af_Object **)msg->msg);
+    gc_delReference(*(af_Object **)msg->msg, env);
     if (is_top)
         writeDebugLog(aFunCoreLogger, "NORMAL Point: %p", *(af_Object **)msg->msg);
 }
@@ -761,7 +761,7 @@ static void mp_NORMALThread(af_Message *msg, bool is_top, af_Environment *env) {
 
     pthread_mutex_lock(&env->thread_lock);
     env->result = *(af_Object **)msg->msg;
-    gc_delReference(env->result);
+    gc_delReference(env->result, env);
     pthread_mutex_unlock(&env->thread_lock);
 
     if (is_top)
@@ -779,7 +779,7 @@ static void mp_ERROR(af_Message *msg, bool is_top, af_Environment *env) {
         else
             fprintfErrorInfoStderr(*(af_ErrorInfo **) msg->msg);
     }
-    freeErrorInfo(*(af_ErrorInfo **)msg->msg);
+    freeErrorInfo(*(af_ErrorInfo **) msg->msg, env);
 }
 
 static void mp_IMPORT(af_Message *msg, bool is_top, af_Environment *env) {
@@ -798,7 +798,7 @@ static void mp_IMPORT(af_Message *msg, bool is_top, af_Environment *env) {
         writeDebugLog(aFunCoreLogger, "IMPORT point: [%s] %p", ii->mark, ii->obj);
     } else
         writeDebugLog(aFunCoreLogger, "IMPORT point: <no-name> %p", ii->obj);
-    freeImportInfo(ii);
+    freeImportInfo(ii, env);
 }
 
 static bool checkSignal(int signum, char *sig, char *sigcfg, char *sigerr, char err[], af_Environment *env) {
@@ -853,11 +853,11 @@ static af_GuardianList *guardian_Signal(char *type, bool is_guard, void *data, a
             af_Message *msg;
             if (EQ_STR("NORMAL", env->activity->msg_down->type)) {
                 msg = getFirstMessage(env);
-                gc_delReference(*(af_Object **)msg->msg);
+                gc_delReference(*(af_Object **)msg->msg, env);
                 freeMessage(msg);
             } else if (EQ_STR("ERROR", env->activity->msg_down->type)) {
                 msg = getFirstMessage(env);
-                freeErrorInfo(*(af_ErrorInfo **)msg->msg);
+                freeErrorInfo(*(af_ErrorInfo **) msg->msg, env);
                 freeMessage(msg);
             }
         }
@@ -1012,7 +1012,7 @@ bool freeEnvironment(af_Environment *env) {
     if (!env->is_derive && env->status != core_creat)
         res = iterDestruct(10, env);
 
-    freeAllActivity(env->activity);
+    freeAllActivity(env->activity, env);
     freeAllTopMsgProcess(env->process);
     freeAllGuardian(env->guardian, env);
     freeAllLiteralRegex(env->lr);
@@ -1495,14 +1495,14 @@ bool setFuncActivityAddVar(af_Environment *env){
                           env->activity->mark, env))
             return false;
         runArgList(al, env->activity->run_varlist, env);
-        freeAllArgList(al);
+        freeAllArgList(al, env);
     }
 
     if (fi->embedded == protect_embedded)
         setVarSpaceProtect(env->activity->belong, env->activity->run_varlist->vs, true);
 
     /* ArgCodeList 在此处被清理 */
-    freeAllArgCodeList(env->activity->acl_start);
+    freeAllArgCodeList(env->activity->acl_start, env);
     env->activity->acl_start = NULL;
     env->activity->acl_done = NULL;
 
@@ -1636,14 +1636,14 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
     if (env->activity->type == act_func || env->activity->type == act_top || env->activity->type == act_top_import) {
         if (msg != NULL && env->activity->return_first) {  // msg有内容, 并且设定了返回首位, 则清除msg内容, 并压入首位(压入的代码在下面)
             if (EQ_STR(msg->type, "NORMAL")) {
-                gc_delReference(*(af_Object **) msg->msg);
+                gc_delReference(*(af_Object **) msg->msg, env);
                 freeMessage(msg);
                 msg = NULL;
             }
         } else if (env->activity->return_first) {  // msg无内容, 并且设定了返回首位, 则检查msg_down是否有normal, 有则清除
             if (env->activity->msg_down != NULL && EQ_STR(env->activity->msg_down->type, "NORMAL")) {
                 af_Message *tmp = getFirstMessage(env);
-                gc_delReference(*(af_Object **) (tmp->msg));
+                gc_delReference(*(af_Object **) (tmp->msg), env);
                 freeMessage(tmp);
             }
         }
@@ -1652,7 +1652,7 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
             if (env->activity->return_obj == NULL)
                 msg = makeERRORMessage(RUN_ERROR, RETURN_OBJ_NOT_FOUND_INFO, env);
             else
-                msg = makeNORMALMessage(env->activity->return_obj);
+                msg = makeNORMALMessage(env->activity->return_obj, env);
         }
     }
 
@@ -1662,7 +1662,7 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
     if (env->activity->type == act_top_import && /* import模式, 并且msg_down中有normal, 则把normal替换为belong */
         env->activity->msg_down != NULL && EQ_STR(env->activity->msg_down->type, "NORMAL")) {
         af_Message *tmp = getFirstMessage(env);
-        pushMessageDown(makeIMPORTMessage(env->activity->import_mark, env->activity->belong), env);  // 压入belong作为msg
+        pushMessageDown(makeIMPORTMessage(env->activity->import_mark, env->activity->belong, env), env);  // 压入belong作为msg
         pushMessageDown(tmp, env);
     }
 
@@ -1682,7 +1682,7 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
     }
 
     if (env->activity->type != act_top)
-        env->activity = freeActivity(env->activity);
+        env->activity = freeActivity(env->activity, env);
     else
         freeActivityTop(env->activity);  // activity不被释放
 }
@@ -1799,11 +1799,11 @@ af_ErrorInfo *makeErrorInfo(char *type, char *error, char *note, FileLine line,
     return ei;
 }
 
-void freeErrorInfo(af_ErrorInfo *ei) {
+void freeErrorInfo(af_ErrorInfo *ei, af_Environment *env){
     free(ei->error_type);
     free(ei->error);
     if (ei->obj != NULL)
-        gc_delReference(ei->obj);
+        gc_delReference(ei->obj, env);
     freeAllErrorBacktracking(ei->track);
     free(ei);
 }
@@ -2020,48 +2020,48 @@ static char *getActivityTrackBackInfoToBacktracking(af_ActivityTrackBack *atb) {
     return strCopy(info);
 }
 
-af_ImportInfo *makeImportInfo(char *mark, af_Object *obj) {
+af_ImportInfo *makeImportInfo(char *mark, af_Object *obj, af_Environment *env){
     af_ImportInfo *ii = calloc(1, sizeof(af_ImportInfo));
     if (mark != NULL)
         ii->mark = strCopy(mark);
     ii->obj = obj;
-    gc_addReference(obj);
+    gc_addReference(obj, env);
     return ii;
 }
 
-void freeImportInfo(af_ImportInfo *ii) {
+void freeImportInfo(af_ImportInfo *ii, af_Environment *env){
     free(ii->mark);
     if (ii->obj != NULL)
-        gc_delReference(ii->obj);
+        gc_delReference(ii->obj, env);
     free(ii);
 }
 
-static af_GuardianList *makeGuardianList(af_Object *obj, af_Object *func) {
+static af_GuardianList *makeGuardianList(af_Object *obj, af_Object *func, af_Environment *env){
     af_GuardianList *gl = calloc(1, sizeof(af_GuardianList));
     gl->obj = obj;
     gl->func = func;
     if (obj != NULL)
-        gc_addReference(obj);
-    gc_addReference(func);
+        gc_addReference(obj, env);
+    gc_addReference(func, env);
     return gl;
 }
 
-static af_GuardianList *freeGuardianList(af_GuardianList *gl) {
+static af_GuardianList *freeGuardianList(af_GuardianList *gl, af_Environment *env){
     af_GuardianList *next = gl->next;
     if (gl->obj != NULL)
-        gc_delReference(gl->obj);
-    gc_delReference(gl->func);
+        gc_delReference(gl->obj, env);
+    gc_delReference(gl->func, env);
     free(gl);
     return next;
 }
 
-static void freeAllGuardianList(af_GuardianList *gl) {
+static void freeAllGuardianList(af_GuardianList *gl, af_Environment *env){
     while (gl != NULL)
-        gl = freeGuardianList(gl);
+        gl = freeGuardianList(gl, env);
 }
 
-af_GuardianList **pushGuardianList(af_Object *obj, af_Object *func, af_GuardianList **pgl){
-    *pgl = makeGuardianList(obj, func);
+af_GuardianList **pushGuardianList(af_Object *obj, af_Object *func, af_GuardianList **pgl, af_Environment *env){
+    *pgl = makeGuardianList(obj, func, env);
     return &((*pgl)->next);
 }
 
@@ -2162,11 +2162,11 @@ FileLine getActivityLine(af_Environment *env){
     return env->activity->line;
 }
 
-af_Object *getMsgNormalData(af_Message *msg) {
+af_Object *getMsgNormalData(af_Message *msg, af_Environment *env){
     if (!EQ_STR("NORMAL", msg->type))
         return NULL;
     af_Object *obj = *(af_Object **)msg->msg;
-    gc_delReference(obj);
+    gc_delReference(obj, env);
     *(af_Object **)msg->msg = NULL;
     return obj;
 }
@@ -2197,12 +2197,12 @@ char *getImportMark(af_ImportInfo *ii) {
     return ii->mark;
 }
 
-af_Object *getImportObject(af_ImportInfo *ii) {
+af_Object *getImportObject(af_ImportInfo *ii, af_Environment *env){
     af_Object *obj = ii->obj;
     if (obj == NULL)
         return NULL;
     ii->obj = NULL;
-    gc_delReference(obj);
+    gc_delReference(obj, env);
     return obj;
 }
 

+ 10 - 10
src/core/func.c

@@ -16,20 +16,20 @@ af_ArgCodeList *makeArgCodeList(af_Code *code, size_t size, bool free_code, bool
     return acl;
 }
 
-static af_ArgCodeList *freeArgCodeList(af_ArgCodeList *acl) {
+static af_ArgCodeList *freeArgCodeList(af_ArgCodeList *acl, af_Environment *env){
     af_ArgCodeList *next = acl->next;
     free(acl->info);
     if (acl->free_code)
         freeAllCode(acl->code);
     if (acl->result != NULL)
-        gc_delReference(acl->result);
+        gc_delReference(acl->result, env);
     free(acl);
     return next;
 }
 
-void freeAllArgCodeList(af_ArgCodeList *acl) {
+void freeAllArgCodeList(af_ArgCodeList *acl, af_Environment *env){
     while (acl != NULL)
-        acl = freeArgCodeList(acl);
+        acl = freeArgCodeList(acl, env);
 }
 
 af_ArgCodeList **pushArgCodeList(af_ArgCodeList **base, af_ArgCodeList *new) {
@@ -50,26 +50,26 @@ af_Object *getArgCodeListResult(af_ArgCodeList *acl) {
     return acl->result;
 }
 
-af_ArgList *makeArgList(char *name, af_Object *obj) {
+af_ArgList *makeArgList(char *name, af_Object *obj, af_Environment *env){
     af_ArgList *arg_list = calloc(1, sizeof(af_ArgList));
     arg_list->name = strCopy(name);
     arg_list->obj = obj;
-    gc_addReference(obj);
+    gc_addReference(obj, env);
     return arg_list;
 }
 
-static af_ArgList *freeArgList(af_ArgList *al) {
+static af_ArgList *freeArgList(af_ArgList *al, af_Environment *env){
     af_ArgList *next = al->next;
     free(al->name);
     if (al->obj != NULL)
-        gc_delReference(al->obj);
+        gc_delReference(al->obj, env);
     free(al);
     return next;
 }
 
-void freeAllArgList(af_ArgList *al) {
+void freeAllArgList(af_ArgList *al, af_Environment *env){
     while (al != NULL)
-        al = freeArgList(al);
+        al = freeArgList(al, env);
 }
 
 af_ArgList **pushArgList(af_ArgList **base, af_ArgList *new) {

+ 73 - 57
src/core/gc.c

@@ -6,95 +6,111 @@
 #include "pthread.h"
 
 /* gc 操控函数 */
-void gc_addObjectData(af_ObjectData *obj, af_Environment *env){
+void gc_addObjectData(af_ObjectData *obj, af_Environment *base){
+    pthread_mutex_lock(&base->gc_factory->mutex);
     obj->gc.prev = ((void *) 0);
-    pthread_mutex_lock(&env->gc_factory->mutex);
-    if (env->gc_factory->gc_ObjectData != ((void *) 0))
-        env->gc_factory->gc_ObjectData->gc.prev = obj;
-    obj->gc.next = env->gc_factory->gc_ObjectData;
-    env->gc_factory->gc_ObjectData = obj;
-    GcCountAdd1(env);
-    pthread_mutex_unlock(&env->gc_factory->mutex);
+    if (base->gc_factory->gc_ObjectData != ((void *) 0))
+        base->gc_factory->gc_ObjectData->gc.prev = obj;
+    obj->gc.next = base->gc_factory->gc_ObjectData;
+    base->gc_factory->gc_ObjectData = obj;
+    GcCountAdd1(base);
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_addObjectDataReference(af_ObjectData *obj){
+void gc_addObjectDataReference(af_ObjectData *obj, af_Environment *base){
+    base = base->base;  // 转换为主线程 Env
+
+    pthread_mutex_lock(&base->gc_factory->mutex);
     obj->gc.info.reference++;
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_delObjectDataReference(af_ObjectData *obj){
-    obj->gc.info.reference--;
-}
+void gc_delObjectDataReference(af_ObjectData *obj, af_Environment *base){
+    base = base->base;  // 转换为主线程 Env
 
-GcCount gc_getObjectDataReference(af_ObjectData *obj){
-    return obj->gc.info.reference;
+    pthread_mutex_lock(&base->gc_factory->mutex);
+    obj->gc.info.reference--;
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_addObject(af_Object *obj, af_Environment *env){
+void gc_addObject(af_Object *obj, af_Environment *base){
+    pthread_mutex_lock(&base->gc_factory->mutex);
     obj->gc.prev = ((void *) 0);
-    pthread_mutex_lock(&env->gc_factory->mutex);
-    if (env->gc_factory->gc_Object != ((void *) 0))
-        env->gc_factory->gc_Object->gc.prev = obj;
-    obj->gc.next = env->gc_factory->gc_Object;
-    env->gc_factory->gc_Object = obj;
-    GcCountAdd1(env);
-    pthread_mutex_unlock(&env->gc_factory->mutex);
+    if (base->gc_factory->gc_Object != ((void *) 0))
+        base->gc_factory->gc_Object->gc.prev = obj;
+    obj->gc.next = base->gc_factory->gc_Object;
+    base->gc_factory->gc_Object = obj;
+    GcCountAdd1(base);
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_addObjectReference(af_Object *obj){
+void gc_addObjectReference(af_Object *obj, af_Environment *base){
+    base = base->base;  // 转换为主线程 Env
+
+    pthread_mutex_lock(&base->gc_factory->mutex);
     obj->gc.info.reference++;
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_delObjectReference(af_Object *obj){
-    obj->gc.info.reference--;
-}
+void gc_delObjectReference(af_Object *obj, af_Environment *base){
+    base = base->base;  // 转换为主线程 Env
 
-GcCount gc_getObjectReference(af_Object *obj){
-    return obj->gc.info.reference;
+    pthread_mutex_lock(&base->gc_factory->mutex);
+    obj->gc.info.reference--;
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_addVar(af_Var *obj, af_Environment *env) {
+void gc_addVar(af_Var *obj, af_Environment *base) {
+    pthread_mutex_lock(&base->gc_factory->mutex);
     obj->gc.prev = ((void *) 0);
-    pthread_mutex_lock(&env->gc_factory->mutex);
-    if (env->gc_factory->gc_Var != ((void *) 0))
-        env->gc_factory->gc_Var->gc.prev = obj;
-    obj->gc.next = env->gc_factory->gc_Var;
-    env->gc_factory->gc_Var = obj;
-    GcCountAdd1(env);
-    pthread_mutex_unlock(&env->gc_factory->mutex);
+    if (base->gc_factory->gc_Var != ((void *) 0))
+        base->gc_factory->gc_Var->gc.prev = obj;
+    obj->gc.next = base->gc_factory->gc_Var;
+    base->gc_factory->gc_Var = obj;
+    GcCountAdd1(base);
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_addVarReference(af_Var *obj) {
+void gc_addVarReference(af_Var *obj, af_Environment *base) {
+    base = base->base;  // 转换为主线程 Env
+
+    pthread_mutex_lock(&base->gc_factory->mutex);
     obj->gc.info.reference++;
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_delVarReference(af_Var *obj) {
-    obj->gc.info.reference--;
-}
+void gc_delVarReference(af_Var *obj, af_Environment *base) {
+    base = base->base;  // 转换为主线程 Env
 
-GcCount gc_getVarReference(af_Var *obj) {
-    return obj->gc.info.reference;
+    pthread_mutex_lock(&base->gc_factory->mutex);
+    obj->gc.info.reference--;
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_addVarSpace(af_VarSpace *obj, af_Environment *env){
+void gc_addVarSpace(af_VarSpace *obj, af_Environment *base){
+    pthread_mutex_lock(&base->gc_factory->mutex);
     obj->gc.prev = ((void *) 0);
-    pthread_mutex_lock(&env->gc_factory->mutex);
-    if (env->gc_factory->gc_VarSpace != ((void *) 0)) { env->gc_factory->gc_VarSpace->gc.prev = obj; }
-    obj->gc.next = env->gc_factory->gc_VarSpace;
-    env->gc_factory->gc_VarSpace = obj;
-    GcCountAdd1(env);
-    pthread_mutex_unlock(&env->gc_factory->mutex);
+    if (base->gc_factory->gc_VarSpace != ((void *) 0)) { base->gc_factory->gc_VarSpace->gc.prev = obj; }
+    obj->gc.next = base->gc_factory->gc_VarSpace;
+    base->gc_factory->gc_VarSpace = obj;
+    GcCountAdd1(base);
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_addVarSpaceReference(af_VarSpace *obj) {
+void gc_addVarSpaceReference(af_VarSpace *obj, af_Environment *base) {
+    base = base->base;  // 转换为主线程 Env
+
+    pthread_mutex_lock(&base->gc_factory->mutex);
     obj->gc.info.reference++;
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
-void gc_delVarSpaceReference(af_VarSpace *obj) {
-    obj->gc.info.reference--;
-}
+void gc_delVarSpaceReference(af_VarSpace *obj, af_Environment *base) {
+    base = base->base;  // 转换为主线程 Env
 
-GcCount gc_getVarSpaceReference(af_VarSpace *obj) {
-    return obj->gc.info.reference;
+    pthread_mutex_lock(&base->gc_factory->mutex);
+    obj->gc.info.reference--;
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
 /* gc_Factory 函数 */
@@ -441,7 +457,7 @@ static pgc_Analyzed checkDestruct(af_Environment *env, paf_GuardianList *pgl, pg
             af_Object *base = od->base;
             pthread_rwlock_unlock(&od->lock);
 
-            *pgl = pushGuardianList(base, func, *pgl);
+            *pgl = pushGuardianList(base, func, *pgl, env);
             plist = reachableObjectData(od, plist);
         }
     }
@@ -493,7 +509,7 @@ paf_GuardianList checkAllDestruct(af_Environment *env, paf_GuardianList pgl) {
             af_Object *base = od->base;
             pthread_rwlock_unlock(&od->lock);
 
-            pgl = pushGuardianList(base, func, pgl);
+            pgl = pushGuardianList(base, func, pgl, env);
         }
     }
     pthread_mutex_unlock(&env->gc_factory->mutex);

+ 2 - 2
src/core/object.c

@@ -51,7 +51,7 @@ static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI
     }
 
     pthread_rwlock_init(&od->lock, NULL);
-    gc_addObjectData(od, env);
+    gc_addObjectData(od, env->base);
     return od;
 }
 
@@ -60,7 +60,7 @@ static af_Object *makeObject_Pri(char *id, bool free_api, af_ObjectAPI *api, boo
     obj->belong = NULL;
     makeObjectData_Pri(id, free_api, api, allow_inherit, obj, env);
     pthread_rwlock_init(&obj->lock, NULL);
-    gc_addObject(obj, env);
+    gc_addObject(obj, env->base);
     return obj;
 }
 

+ 6 - 6
src/core/run.c

@@ -50,7 +50,7 @@ static bool checkLiteral(af_Message **msg, af_Environment *env) {
     af_Object *obj = *(af_Object **)((*msg)->msg);
     obj_literalSetting *func = findAPI("obj_literalSetting", getObjectAPI(obj));
     if (func == NULL) {
-        gc_delReference(obj);
+        gc_delReference(obj, env);
         freeMessage(*msg);
         *msg = makeERRORMessage(TYPE_ERROR, API_NOT_FOUND_INFO(obj_literalSetting), env);
         return false;
@@ -82,7 +82,7 @@ static int checkMacro(af_Message *msg, af_Environment *env) {
 
     af_Object *obj = *(af_Object **)(msg->msg);
     bool re = pushMacroFuncActivity(obj, env);
-    gc_delReference(obj);
+    gc_delReference(obj, env);
     freeMessage(msg);
     if (re)
         return 1;
@@ -203,7 +203,7 @@ static bool codeElement(af_Code *code, af_Environment *env) {
         }
     }
 
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     setActivityBtNext(env->activity->bt_next->next, env->activity);
     writeTrackLog(aFunCoreLogger, "Get variable %s : %p", code->element.data, obj);
     return false;
@@ -307,7 +307,7 @@ bool checkNormalEnd(af_Message *msg, af_Environment *env) {
             pushMessageDown(msg, env);
             return true;
         } else if (msg != NULL) {
-            gc_delReference(*(af_Object **) (msg->msg));  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
+            gc_delReference(*(af_Object **) (msg->msg), env);  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
             freeMessage(msg);
         }
     } else if (msg != NULL) {
@@ -317,7 +317,7 @@ bool checkNormalEnd(af_Message *msg, af_Environment *env) {
             env->activity->parentheses_call = *(af_Object **) (msg->msg);  // 类前缀调用
             pthread_rwlock_unlock(&env->activity->gc_lock);
         }
-        gc_delReference(*(af_Object **)(msg->msg));  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
+        gc_delReference(*(af_Object **)(msg->msg), env);  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
         freeMessage(msg);
     }
     return false;
@@ -483,7 +483,7 @@ bool iterCode(af_Code *code, int mode, af_Environment *env){
                 break;
             case act_func_get: {
                 af_Object *func = *(af_Object **) (msg->msg);  // func仍保留了msg的gc计数
-                gc_delReference(func);  // 释放计数
+                gc_delReference(func, env);  // 释放计数
                 freeMessage(msg);
                 if (!setFuncActivityToArg(func, env))
                     popActivity(false, NULL, env);

+ 2 - 2
src/core/var.c

@@ -50,7 +50,7 @@ af_Var *makeVar(char *name, char p_self, char p_posterity, char p_external, af_O
     var->permissions[1] = p_posterity;
     var->permissions[2] = p_external;
     pthread_rwlock_init(&var->lock, NULL);
-    gc_addVar(var, env);
+    gc_addVar(var, env->base);
     return var;
 }
 
@@ -135,7 +135,7 @@ af_VarSpace *makeVarSpace(af_Object *belong, char p_self, char p_posterity, char
     vs->permissions[2] = p_external;
 
     pthread_rwlock_init(&vs->lock, NULL);
-    gc_addVarSpace(vs, env);
+    gc_addVarSpace(vs, env->base);
     return vs;
 }
 

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

@@ -35,7 +35,7 @@ static bool funcVarList(char *id, af_Object *obj, af_VarSpaceListNode **vsl, voi
 
 static af_FuncBody *funcBody(af_CallFuncInfo *cfi, af_Environment *env) {
     setCoreExit(0, env);
-    pushMessageDown(makeNORMALMessage(getGlobal(env)), env);
+    pushMessageDown(makeNORMALMessage(getGlobal(env), env), env);
     return NULL;
 }
 

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

@@ -71,7 +71,7 @@ static af_FuncBody *strFuncBody(af_CallFuncInfo *cfi, af_Environment *env) {
     af_Object *obj = cfi->func;
     ObjectStrFunc *osf = getObjectData(obj);
     af_Object *str = makeObject((char *) string_id, false, osf->api, false, NULL, true, makeInherit(obj), env);
-    af_Message *msg = makeNORMALMessage(str);
+    af_Message *msg = makeNORMALMessage(str, env);
     pushMessageDown(msg, env);
     return NULL;
 }

+ 12 - 12
test/src/run_code.c

@@ -68,7 +68,7 @@ af_GcList *getGcList(char *id, af_Object *obj, void *data) {
 }
 
 bool getAl(char *id, af_Object *obj, af_ArgList **al, af_ArgCodeList *acl, void *mark, af_Environment *env) {
-    *al = makeArgList("test", getArgCodeListResult(acl));
+    *al = makeArgList("test", getArgCodeListResult(acl), env);
     return true;
 }
 
@@ -89,7 +89,7 @@ af_FuncBody *testFunc(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用
         FREE_SYMBOL(literal_set);
     }
 
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     return NULL;
 }
 
@@ -154,7 +154,7 @@ af_FuncBody *testFunc2(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
         FREE_SYMBOL(get_gl);
     }
 
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     return NULL;
 }
 
@@ -186,7 +186,7 @@ af_FuncBody *testFunc4(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
         FREE_SYMBOL(literal_set);
     }
 
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     return NULL;
 }
 
@@ -202,7 +202,7 @@ af_FuncBody *testFunc9(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
     af_Object *obj;
     af_FuncBody *fb;
     obj = makeObject("obj", true, makeObjectAPI(), true, NULL, true, NULL, env);
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     printf("testFunc9(%p): I am testFunc9\n", obj);
 
     DLC_SYMBOL(callFuncBody) func1 = MAKE_SYMBOL(testFunc9, callFuncBody);
@@ -225,7 +225,7 @@ bool getInfo9(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
 af_FuncBody *testFunc8(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     obj = makeObject("obj", true, makeObjectAPI(), true, NULL, true, NULL, env);
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     printf("testFunc8(%p): I am testFunc8\n", obj);
     fflush(stdout);
     return NULL;
@@ -234,7 +234,7 @@ af_FuncBody *testFunc8(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
 af_FuncBody *testFunc7(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     obj = makeObject("func", true, makeObjectAPI(), true, NULL, true, NULL, env);
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     printf("testFunc7[des](%p): I am testFunc7\n", obj);
     fflush(stdout);
     return NULL;
@@ -283,7 +283,7 @@ af_FuncBody *testFunc6(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
     }
 
     setObjectAttributes(mg_gc_destruct, 3, 3, 3, des, obj, obj, env);
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     printf("testFunc6[des](%p, %p): I am testFunc6\n", obj, des);
     return NULL;
 }
@@ -335,7 +335,7 @@ af_FuncBody *testFunc5(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
     }
 
     setObjectAttributes(mg_gc_destruct, 3, 3, 3, des, obj, obj, env);
-    pushMessageDown(makeNORMALMessage(obj), env);
+    pushMessageDown(makeNORMALMessage(obj, env), env);
     printf("testFunc5(%p, %p): I am testFunc5\n", obj, des);
     return NULL;
 }
@@ -380,12 +380,12 @@ af_GuardianList *gd_func(char *type, bool is_guard, struct GDData *data, af_Envi
 
     af_GuardianList *gd = NULL;
     data->no_first = true;
-    pushGuardianList(NULL, data->func, &gd);
+    pushGuardianList(NULL, data->func, &gd, env);
     return gd;
 }
 
 void gd_destruct(char *type, struct GDData *data, af_Environment *env) {
-    gc_delReference(data->func);
+    gc_delReference(data->func, env);
 }
 
 int main(int argc, char **argv) {
@@ -1213,7 +1213,7 @@ INIT_ERROR:
         struct GDData *data = NULL;
         addGuardian("test", false, true, sizeof(struct GDData), func, des, (void **) &data, env);
         data->func = af_func;
-        gc_addReference(af_func);
+        gc_addReference(af_func, env);
         FREE_SYMBOL(func);
         FREE_SYMBOL(des);