exit_.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "tool.h"
  2. #include "exit_.h"
  3. #include "mutex"
  4. namespace aFuntool {
  5. static const int exit_func_size = 1024;
  6. static std::mutex exit_mutex;
  7. struct ExitFuncData {
  8. aFunExitFunc *func;
  9. void *data;
  10. } exit_func[exit_func_size];
  11. /**
  12. * 退出程序
  13. * @param exit_code 退出代码
  14. */
  15. [[noreturn]] void aFunExit(int exit_code){
  16. std::unique_lock<std::mutex> ul{exit_mutex};
  17. for (int i = exit_func_size - 1; i >= 0; i--) {
  18. if (exit_func[i].func != nullptr)
  19. exit_func[i].func(exit_func[i].data);
  20. }
  21. ul.unlock();
  22. exit(exit_code);
  23. }
  24. /**
  25. * 尝试执行退出函数
  26. */
  27. int aFunTryExitPseudo(){
  28. if (exit_mutex.try_lock()) {
  29. std::unique_lock<std::mutex> ul{exit_mutex, std::adopt_lock};
  30. for (int i = exit_func_size - 1; i >= 0; i--) {
  31. if (exit_func[i].func != nullptr)
  32. exit_func[i].func(exit_func[i].data);
  33. exit_func[i].func = nullptr;
  34. exit_func[i].data = nullptr;
  35. }
  36. return 1;
  37. }
  38. return 0;
  39. }
  40. /**
  41. * 执行退出函数, 但不退出
  42. */
  43. int aFunExitPseudo(){
  44. std::unique_lock<std::mutex> ul{exit_mutex};
  45. for (int i = exit_func_size - 1; i >= 0; i--) {
  46. if (exit_func[i].func != nullptr)
  47. exit_func[i].func(exit_func[i].data);
  48. exit_func[i].func = nullptr;
  49. exit_func[i].data = nullptr;
  50. }
  51. return 0;
  52. }
  53. /**
  54. * 尝试注册退出函数, 若锁占用则返回-1
  55. * @param func 退出函数
  56. * @param data 参数
  57. */
  58. int aFunAtExitTry(aFunExitFunc *func, void *data){
  59. if (exit_mutex.try_lock()) {
  60. std::unique_lock<std::mutex> ul{exit_mutex, std::adopt_lock};
  61. struct ExitFuncData *tmp = exit_func;
  62. int count = 0;
  63. for (NULL; tmp->func != nullptr; tmp++, count++) {
  64. if (count >= exit_func_size) {
  65. return -1;
  66. }
  67. }
  68. tmp->func = func;
  69. tmp->data = data;
  70. return count;
  71. }
  72. return -1;
  73. }
  74. /**
  75. * 注册退出函数, aFun退出函数会在atexit退出函数之前执行
  76. * @param func 退出函数
  77. * @param data 参数
  78. * @return
  79. */
  80. int aFunAtExit(aFunExitFunc *func, void *data){
  81. std::unique_lock<std::mutex> ul{exit_mutex};
  82. struct ExitFuncData *tmp = exit_func;
  83. int count = 0;
  84. for (NULL; tmp->func != nullptr; tmp++, count++) {
  85. if (count >= exit_func_size) {
  86. return -1;
  87. }
  88. }
  89. tmp->func = func;
  90. tmp->data = data;
  91. return count;
  92. }
  93. }