From 066ed7e4a1b1229849214b26c3d83ff02570c9eb Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 15 Apr 2025 22:20:40 +0300 Subject: [PATCH] LibC: merge atexit and __cxa_atexit into common function --- userspace/libraries/LibC/icxxabi.cpp | 34 +++++++++++++--------------- userspace/libraries/LibC/stdlib.cpp | 14 ++---------- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/userspace/libraries/LibC/icxxabi.cpp b/userspace/libraries/LibC/icxxabi.cpp index 8a91d1ca..0f07d3ff 100644 --- a/userspace/libraries/LibC/icxxabi.cpp +++ b/userspace/libraries/LibC/icxxabi.cpp @@ -1,41 +1,39 @@ -#include -#include #include #define ATEXIT_MAX_FUNCS 128 struct atexit_func_entry_t { - void(*func)(void*); + void (*func)(void*); void* arg; void* dso_handle; }; -static atexit_func_entry_t __atexit_funcs[ATEXIT_MAX_FUNCS]; -static size_t __atexit_func_count = 0; +static atexit_func_entry_t s_atexit_funcs[ATEXIT_MAX_FUNCS]; +static size_t s_atexit_func_count = 0; extern "C" int __cxa_atexit(void(*func)(void*), void* arg, void* dso_handle) { - if (__atexit_func_count >= ATEXIT_MAX_FUNCS) + if (s_atexit_func_count >= ATEXIT_MAX_FUNCS) return -1; - auto& atexit_func = __atexit_funcs[__atexit_func_count++]; - atexit_func.func = func; - atexit_func.arg = arg; - atexit_func.dso_handle = dso_handle; + s_atexit_funcs[s_atexit_func_count++] = { + .func = func, + .arg = arg, + .dso_handle = dso_handle, + }; return 0; }; -extern "C" void __cxa_finalize(void* f) +extern "C" void __cxa_finalize(void* dso_handle) { - for (size_t i = __atexit_func_count; i > 0; i--) + for (size_t i = s_atexit_func_count; i > 0; i--) { - auto& atexit_func = __atexit_funcs[i - 1]; + auto& atexit_func = s_atexit_funcs[i - 1]; if (atexit_func.func == nullptr) continue; - if (f == nullptr || f == atexit_func.func) - { - atexit_func.func(atexit_func.arg); - atexit_func.func = nullptr; - } + if (dso_handle && dso_handle != atexit_func.dso_handle) + continue; + atexit_func.func(atexit_func.arg); + atexit_func.func = nullptr; } }; diff --git a/userspace/libraries/LibC/stdlib.cpp b/userspace/libraries/LibC/stdlib.cpp index a1bec184..466009ab 100644 --- a/userspace/libraries/LibC/stdlib.cpp +++ b/userspace/libraries/LibC/stdlib.cpp @@ -25,9 +25,6 @@ static bool s_environ_malloced = false; extern "C" __attribute__((weak)) void _fini(); -static void (*at_exit_funcs[64])(); -static uint32_t at_exit_funcs_count = 0; - void abort(void) { sigset_t set; @@ -44,8 +41,6 @@ void abort(void) void exit(int status) { - for (uint32_t i = at_exit_funcs_count; i > 0; i--) - at_exit_funcs[i - 1](); fflush(nullptr); __cxa_finalize(nullptr); if (_fini) _fini(); @@ -65,13 +60,8 @@ int abs(int val) int atexit(void (*func)(void)) { - if (at_exit_funcs_count > sizeof(at_exit_funcs) / sizeof(*at_exit_funcs)) - { - errno = ENOBUFS; - return -1; - } - at_exit_funcs[at_exit_funcs_count++] = func; - return 0; + void* func_addr = reinterpret_cast(func); + return __cxa_atexit([](void* func_ptr) { reinterpret_cast(func_ptr)(); }, func_addr, nullptr); } static constexpr int get_base_digit(char c, int base)