浏览代码

refactor: 新增 gc 释放函数

SongZihuan 3 年之前
父节点
当前提交
c7c9d1eb22
共有 4 个文件被更改,包括 41 次插入11 次删除
  1. 5 7
      src/core/__gc.h
  2. 32 0
      src/core/gc.c
  3. 2 2
      src/core/object.c
  4. 2 2
      src/core/var.c

+ 5 - 7
src/core/__gc.h

@@ -11,13 +11,6 @@ typedef struct af_GcList af_GcList;
 typedef struct gc_Analyzed gc_Analyzed, **pgc_Analyzed;
 typedef struct gc_Factory gc_Factory;
 
-#define GC_FREE_EXCHANGE(obj, Type, Env) do { \
-pthread_mutex_lock(&(Env)->gc_factory->mutex); \
-{if ((obj)->gc.prev != NULL) {(obj)->gc.prev->gc.next = (obj)->gc.next;} \
- else {(Env)->gc_factory->gc_##Type = (obj)->gc.next;}} \
-{if ((obj)->gc.next != NULL) {(obj)->gc.next->gc.prev = (obj)->gc.prev;}} \
-pthread_mutex_unlock(&(Env)->gc_factory->mutex);} while(0)
-
 #define GC_CHAIN(type) struct type *next, *prev
 typedef uint32_t GcCount;
 
@@ -106,6 +99,11 @@ 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);
 
+AFUN_CORE_NO_EXPORT void gc_delObject(af_Object *obj, af_Environment *base);
+AFUN_CORE_NO_EXPORT void gc_delVar(af_Var *obj, af_Environment *base);
+AFUN_CORE_NO_EXPORT void gc_delVarSpace(af_VarSpace *obj, af_Environment *base);
+AFUN_CORE_NO_EXPORT void gc_delObjectData(struct af_ObjectData *obj, af_Environment *base);
+
 /* gc Reference 管理函数 : 涉及af_ObjectData 不对外公开 */
 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);

+ 32 - 0
src/core/gc.c

@@ -19,6 +19,14 @@ void gc_addObjectData(af_ObjectData *od, af_Environment *base){
     writeTrackLog(aFunCoreLogger, "Make ObjectData %p", od);
 }
 
+void gc_delObjectData(af_ObjectData *od, af_Environment *base){
+    pthread_mutex_lock(&base->gc_factory->mutex);
+    if ((od)->gc.prev != ((void *) 0)) { (od->gc.prev->gc.next = (od)->gc.next; }
+    else { base->gc_factory->gc_ObjectData = (od)->gc.next; }
+    if ((od)->gc.next != ((void *) 0)) { (od)->gc.next->gc.prev od)->gc.prev; }
+    pthread_mutex_unlock(&base->gc_factory->mutex);
+}
+
 void gc_addObjectDataReference(af_ObjectData *od, af_Environment *base){
     base = base->base;  // 转换为主线程 Env
 
@@ -48,6 +56,14 @@ void gc_addObject(af_Object *obj, af_Environment *base){
     writeTrackLog(aFunCoreLogger, "Make Object %p", obj);
 }
 
+void gc_delObject(af_Object *obj, af_Environment *base){
+    pthread_mutex_lock(&base->gc_factory->mutex);
+    if ((obj)->gc.prev != ((void *) 0)) { (obj->gc.prev->gc.next = (obj)->gc.next; }
+    else { base->gc_factory->gc_Object = (obj)->gc.next; }
+    if ((obj)->gc.next != ((void *) 0)) { (obj)->gc.next->gc.prev = (obj)->gc.prev; }
+    pthread_mutex_unlock(&base->gc_factory->mutex);
+}
+
 void gc_addObjectReference(af_Object *obj, af_Environment *base){
     base = base->base;  // 转换为主线程 Env
 
@@ -75,6 +91,14 @@ void gc_addVar(af_Var *var, af_Environment *base) {
     writeTrackLog(aFunCoreLogger, "Make Var %p", var);
 }
 
+void gc_delVar(af_Var *var, af_Environment *base){
+    pthread_mutex_lock(&base->gc_factory->mutex);
+    if ((var)->gc.prev != ((void *) 0)) { (var)->gc.prev->gc.next = (var)->gc.next; }
+    else { base->gc_factory->gc_Var = (var)->gc.next; }
+    if ((var)->gc.next != ((void *) 0)) { (var)->gc.next->gc.prev = (var)->gc.prev; }
+    pthread_mutex_unlock(&base->gc_factory->mutex);
+}
+
 void gc_addVarReference(af_Var *var, af_Environment *base) {
     base = base->base;  // 转换为主线程 Env
 
@@ -108,6 +132,14 @@ void gc_addVarSpace(af_VarSpace *vs, af_Environment *base){
     writeTrackLog(aFunCoreLogger, "Make VarSpace %p", vs);
 }
 
+void gc_delVarSpace(af_VarSpace *vs, af_Environment *base){
+    pthread_mutex_lock(&base->gc_factory->mutex);
+    if ((vs)->gc.prev != ((void *) 0)) { (vs)->gc.prev->gc.next = (vs)->gc.next; }
+    else { base->gc_factory->gc_VarSpace = (vs)->gc.next; }
+    if ((vs)->gc.next != ((void *) 0)) { (vs)->gc.next->gc.prev = (vs)->gc.prev; }
+    pthread_mutex_unlock(&base->gc_factory->mutex);
+}
+
 void gc_addVarSpaceReference(af_VarSpace *vs, af_Environment *base) {
     base = base->base;  // 转换为主线程 Env
 

+ 2 - 2
src/core/object.c

@@ -147,13 +147,13 @@ void freeObjectData(af_ObjectData *od, af_Environment *env) {
         freeObjectAPI(od->api);
     if (od->free_inherit)
         freeAllInherit(od->inherit);
-    GC_FREE_EXCHANGE(od, ObjectData, env);
+    gc_delObjectData(od, env);
     pthread_rwlock_destroy(&od->lock);
     free(od);
 }
 
 void freeObject(af_Object *obj, af_Environment *env) {
-    GC_FREE_EXCHANGE(obj, Object, env);
+    gc_delObject(obj, env);
     pthread_rwlock_destroy(&obj->lock);
     free(obj);
 }

+ 2 - 2
src/core/var.c

@@ -63,7 +63,7 @@ af_Var *makeVar(char *name, char p_self, char p_posterity, char p_external, af_O
 void freeVar(af_Var *var, af_Environment *env){
     freeAllVarNode(var->vn);
     free(var->name);
-    GC_FREE_EXCHANGE(var, Var, env);
+    gc_delVar(var, env);
     pthread_rwlock_destroy(&var->lock);
     free(var);
 }
@@ -153,7 +153,7 @@ af_VarSpace *makeVarSpace(af_Object *belong, char p_self, char p_posterity, char
 void freeVarSpace(af_VarSpace *vs, af_Environment *env) {
     for (int i = 0; i < VAR_HASHTABLE_SIZE; i++)
         freeAllVarCup(vs->var[i]);
-    GC_FREE_EXCHANGE(vs, VarSpace, env);
+    gc_delVarSpace(vs, env);
     pthread_rwlock_destroy(&vs->lock);
     free(vs);
 }