Przeglądaj źródła

feat: 守护器添加void *data数据

SongZihuan 3 lat temu
rodzic
commit
e0370c9ba5
6 zmienionych plików z 46 dodań i 20 usunięć
  1. 6 2
      include/core/env.h
  2. 2 1
      include/core/info/obj_api.h
  3. 7 1
      src/core/__env.h
  4. 29 14
      src/core/env.c
  5. 1 1
      src/core/lexical.c
  6. 1 1
      src/core/run.c

+ 6 - 2
include/core/env.h

@@ -13,9 +13,12 @@ typedef struct af_ImportInfo af_ImportInfo;
 typedef void TopMsgProcessFunc(af_Message *msg, bool is_top, af_Environment *env);
 DEFINE_DLC_SYMBOL(TopMsgProcessFunc);
 
-typedef void GuardianFunc(bool is_guard, af_Environment *env);
+typedef void GuardianFunc(char *type, bool is_guard, void *data, af_Environment *env);
 DEFINE_DLC_SYMBOL(GuardianFunc);
 
+typedef void GuardianDestruct(char *type, void *data, af_Environment *env);
+DEFINE_DLC_SYMBOL(GuardianDestruct);
+
 enum GcRunTime {
     grt_always = 0,  // 总是运行
     grt_count,  // 累计式运行
@@ -72,7 +75,8 @@ AFUN_CORE_EXPORT void setEnvVarNumber(char *name, int32_t data, af_Environment *
 AFUN_CORE_EXPORT bool addTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func, af_Environment *env);
 
 /* 顶层消息处理器 相关操作 */
-AFUN_CORE_EXPORT bool addGuardian(char *type, bool always, DLC_SYMBOL(GuardianFunc) func, af_Environment *env);
+AFUN_CORE_EXPORT bool addGuardian(char *type, bool always, size_t size, DLC_SYMBOL(GuardianFunc) func,
+                                  DLC_SYMBOL(GuardianDestruct) destruct, void **pdata, af_Environment *env);
 AFUN_CORE_EXPORT bool popGuardian(char *type, af_Environment *env);
 
 /* LiteralRegex 相关操作 */

+ 2 - 1
include/core/info/obj_api.h

@@ -23,7 +23,8 @@ typedef void objectAPIFunc();  // 位于object.h (所有Object API函数指针
 typedef void TopMsgProcessFunc(af_Message *msg, bool is_top, af_Environment *env);  // 位于env.h
 
 /* 守护器处理函数 */
-typedef void GuardianFunc(bool is_guard, af_Environment *env);
+typedef void GuardianFunc(char *type, bool is_guard, void *data, af_Environment *env);
+typedef void GuardianDestruct(char *type, void *data, af_Environment *env);
 
 /* 回调C函数 */
 typedef struct CallFuncInfo CallFuncInfo;

+ 7 - 1
src/core/__env.h

@@ -185,9 +185,12 @@ struct af_ActivityTrackBack {
 typedef void TopMsgProcessFunc(af_Message *msg, bool is_top, af_Environment *env);
 NEW_DLC_SYMBOL(TopMsgProcessFunc, TopMsgProcessFunc);
 
-typedef void GuardianFunc(bool is_guard, af_Environment *env);
+typedef void GuardianFunc(char *type, bool is_guard, void *data, af_Environment *env);
 NEW_DLC_SYMBOL(GuardianFunc, GuardianFunc);
 
+typedef void GuardianDestruct(char *type, void *data, af_Environment *env);
+NEW_DLC_SYMBOL(GuardianDestruct, GuardianDestruct);
+
 struct af_TopMsgProcess {  // 顶层msg处理器
     char *type;
     DLC_SYMBOL(TopMsgProcessFunc) func;
@@ -196,7 +199,10 @@ struct af_TopMsgProcess {  // 顶层msg处理器
 
 struct af_Guardian {  // 守护器
     char *type;
+    void *data;
+    size_t size;
     DLC_SYMBOL(GuardianFunc) func;
+    DLC_SYMBOL(GuardianDestruct) destruct;
     bool always;
     struct af_Guardian *next;
 };

+ 29 - 14
src/core/env.c

@@ -45,9 +45,9 @@ static void freeAllTopMsgProcess(af_TopMsgProcess *mp);
 static af_TopMsgProcess *findTopMsgProcessFunc(char *type, af_Environment *env);
 
 /* 守护器 创建与释放 */
-static af_Guardian *makeGuardian(char *type, bool always, DLC_SYMBOL(GuardianFunc) func);
-static af_Guardian *freeGuardian(af_Guardian *gd);
-static void freeAllGuardian(af_Guardian *gd);
+static af_Guardian *makeGuardian(char *type, bool always, size_t size, DLC_SYMBOL(GuardianFunc) func, DLC_SYMBOL(GuardianDestruct) destruct);
+static af_Guardian *freeGuardian(af_Guardian *gd, af_Environment *env);
+static void freeAllGuardian(af_Guardian *gd, af_Environment *env);
 
 /* 守护器 处理函数 */
 static af_Guardian *findGuardian(char *type, af_Environment *env);
@@ -80,7 +80,7 @@ static void mp_IMPORT(af_Message *msg, bool is_top, af_Environment *env);
 
 /* 内置守护器 */
 static bool checkSignal(int signum, char *sig, char *sigcfg, char *sigerr, char err[], af_Environment *env);
-static void guardian_Signal(bool is_guard, af_Environment *env);
+static void guardian_Signal(char *type, bool is_guard, void *data, af_Environment *env);
 
 /* 变量检查函数 */
 static bool isInfixFunc(af_Code *code, af_Environment *env);
@@ -772,7 +772,7 @@ static bool checkSignal(int signum, char *sig, char *sigcfg, char *sigerr, char
     return true;
 }
 
-static void guardian_Signal(bool is_guard, af_Environment *env) {
+static void guardian_Signal(char *type, bool is_guard, void *data, af_Environment *env) {
     char error_msg[218] = {NUL};
     checkSignal(SIGINT, ev_sigint, ev_sigint_cfg, SIGNAL_INT, error_msg, env);
     checkSignal(SIGTERM, ev_sigterm, ev_sigterm_cfg, SIGNAL_TERM, error_msg, env);
@@ -824,7 +824,7 @@ af_Environment *makeEnvironment(enum GcRunTime grt) {
 
     /* 设置守护器 */
     DLC_SYMBOL(GuardianFunc) func4 = MAKE_SYMBOL(guardian_Signal, GuardianFunc);
-    addGuardian("SIGNAL", false, func4, env);
+    addGuardian("SIGNAL", false, 0, func4, NULL, NULL, env);
     FREE_SYMBOL(func4);
 
     env->core->status = core_init;
@@ -845,7 +845,7 @@ void freeEnvironment(af_Environment *env) {
     freeAllActivity(env->activity);
     freeEnvVarSpace(env->esv);
     freeAllTopMsgProcess(env->process);
-    freeAllGuardian(env->guardian);
+    freeAllGuardian(env->guardian, env);
     freeCore(env);  // core最后释放, 因为Object等需要最后释放
 
     if (!res)
@@ -893,25 +893,38 @@ bool addTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func, af_Environ
     return true;
 }
 
-static af_Guardian *makeGuardian(char *type, bool always, DLC_SYMBOL(GuardianFunc) func) {
+static af_Guardian *makeGuardian(char *type, bool always, size_t size, DLC_SYMBOL(GuardianFunc) func, DLC_SYMBOL(GuardianDestruct) destruct) {
     af_Guardian *gd = calloc(1, sizeof(af_Guardian));
     gd->type = strCopy(type);
     gd->always = always;
+
+    if (size != 0) {
+        gd->data = calloc(1, size);
+        gd->size = size;
+    }
+
     gd->func = COPY_SYMBOL(func, GuardianFunc);
+
+    if (destruct != NULL)
+        gd->destruct = COPY_SYMBOL(destruct, GuardianDestruct);
     return gd;
 }
 
-static af_Guardian *freeGuardian(af_Guardian *gd) {
+static af_Guardian *freeGuardian(af_Guardian *gd, af_Environment *env) {
     af_Guardian *next = gd->next;
+    if (gd->data != NULL && gd->destruct != NULL)
+        GET_SYMBOL(gd->destruct)(gd->type, gd->data, env);
+    free(gd->data);
     free(gd->type);
     FREE_SYMBOL(gd->func);
+    FREE_SYMBOL(gd->destruct);
     free(gd);
     return next;
 }
 
-static void freeAllGuardian(af_Guardian *gd) {
+static void freeAllGuardian(af_Guardian *gd, af_Environment *env) {
     while (gd != NULL)
-        gd = freeGuardian(gd);
+        gd = freeGuardian(gd, env);
 }
 
 static af_Guardian *findGuardian(char *type, af_Environment *env) {
@@ -923,14 +936,16 @@ static af_Guardian *findGuardian(char *type, af_Environment *env) {
     return NULL;
 }
 
-bool addGuardian(char *type, bool always, DLC_SYMBOL(GuardianFunc) func, af_Environment *env) {
+bool addGuardian(char *type, bool always, size_t size, DLC_SYMBOL(GuardianFunc) func, DLC_SYMBOL(GuardianDestruct) destruct, void **pdata, af_Environment *env) {
     af_Guardian *gd = findGuardian(type, env);
     if (gd != NULL)
         return false;
 
-    gd = makeGuardian(type, always, func);
+    gd = makeGuardian(type, always, size, func, destruct);
     gd->next = env->guardian;
     env->guardian = gd;
+    if (pdata != NULL)
+        *pdata = gd->data;
     return true;
 }
 
@@ -938,7 +953,7 @@ bool popGuardian(char *type, af_Environment *env) {
     af_Guardian **gd = &env->guardian;
     for (NULL; *gd != NULL; gd = &((*gd)->next)) {
         if (EQ_STR(type, (*gd)->type)) {
-            *gd = freeGuardian(*gd);
+            *gd = freeGuardian(*gd, env);
             return true;
         }
     }

+ 1 - 1
src/core/lexical.c

@@ -11,7 +11,7 @@
 #define isascii (((c) & ~0x7f) == 0)
 #endif
 
-#define isignore(ch) (isascii(ch) && (iscntrl(ch) || isspace(ch) || ch == ','))  /* 被忽略的符号 */
+#define isignore(ch) (isascii(ch) && (iscntrl(ch) || isspace(ch) || (ch) == ','))  /* 被忽略的符号 */
 #define iselement(ch) (!isascii(ch) || isgraph(ch))  /* 可以作为element的符号 */
 
 static void printLexicalError(char *info, af_Parser *parser) {

+ 1 - 1
src/core/run.c

@@ -235,7 +235,7 @@ static bool codeBlock(af_Code *code, af_Environment *env) {
 static void runGuardian(af_Environment *env) {
     for (af_Guardian *gd = env->guardian; gd != NULL; gd = gd->next) {
         if (gd->always || !env->activity->is_guard)  // guardian被标记为一直执行, 或者非is_guard模式
-            GET_SYMBOL(gd->func)(env->activity->is_guard, env);
+            GET_SYMBOL(gd->func)(gd->type, env->activity->is_guard, gd->data, env);
     }
 }