浏览代码

refactor & feat: 退出函数倒序执行

SongZihuan 3 年之前
父节点
当前提交
e671ab656e
共有 2 个文件被更改,包括 22 次插入16 次删除
  1. 14 13
      src/tool/exit_.cpp
  2. 8 3
      test/src/tool-exit.cpp

+ 14 - 13
src/tool/exit_.cpp

@@ -16,9 +16,10 @@ struct ExitFuncData {
  */
 [[ noreturn ]] void aFuntool::aFunExit(int exit_code) {
     if (pthread_mutex_trylock(&exit_mutex) == 0) {
-        int count = 0;
-        for (struct ExitFuncData *tmp = exit_func; tmp->func != nullptr && count < exit_func_size; tmp++, count++)
-            tmp->func(tmp->data);
+        for (int i = exit_func_size - 1; i >= 0; i--) {
+            if (exit_func[i].func != nullptr)
+                exit_func[i].func(exit_func[i].data);
+        }
         pthread_mutex_unlock(&exit_mutex);
     }
     exit(exit_code);
@@ -29,11 +30,11 @@ struct ExitFuncData {
  */
 int aFuntool::aFunTryExitPseudo() {
     if (pthread_mutex_trylock(&exit_mutex) == 0) {
-        int count = 0;
-        for (struct ExitFuncData *tmp = exit_func; tmp->func != nullptr && count < exit_func_size; tmp++, count++) {
-            tmp->func(tmp->data);
-            tmp->data = nullptr;
-            tmp->func = nullptr;
+        for (int i = exit_func_size - 1; i >= 0; i--) {
+            if (exit_func[i].func != nullptr)
+                exit_func[i].func(exit_func[i].data);
+            exit_func[i].func = nullptr;
+            exit_func[i].data = nullptr;
         }
         pthread_mutex_unlock(&exit_mutex);
         return 1;
@@ -46,11 +47,11 @@ int aFuntool::aFunTryExitPseudo() {
  */
 int aFuntool::aFunExitPseudo() {
     if (pthread_mutex_lock(&exit_mutex) == 0) {
-        int count = 0;
-        for (struct ExitFuncData *tmp = exit_func; tmp->func != nullptr && count < exit_func_size; tmp++, count++) {
-            tmp->func(tmp->data);
-            tmp->data = nullptr;
-            tmp->func = nullptr;
+        for (int i = exit_func_size - 1; i >= 0; i--) {
+            if (exit_func[i].func != nullptr)
+                exit_func[i].func(exit_func[i].data);
+            exit_func[i].func = nullptr;
+            exit_func[i].data = nullptr;
         }
         pthread_mutex_unlock(&exit_mutex);
         return 1;

+ 8 - 3
test/src/tool-exit.cpp

@@ -2,11 +2,16 @@
 #include "aFuntool.h"
 using namespace aFuntool;
 
-void exit_func(void *) {
-    std::cout << "I am exit" << std::endl;
+void exit_func_push1(void *) {
+    std::cout << "I am exit push-1" << std::endl;
+}
+
+void exit_func_push2(void *) {
+    std::cout << "I am exit push-2" << std::endl;
 }
 
 int main(int argc, char **argv) {
-    aFunAtExit(exit_func, nullptr);
+    aFunAtExit(exit_func_push1, nullptr);
+    aFunAtExit(exit_func_push2, nullptr);
     aFunExit(0);
 }