diff options
| author | Vitaly Buka <vitalybuka@google.com> | 2024-03-31 22:43:06 -0700 |
|---|---|---|
| committer | Vitaly Buka <vitalybuka@google.com> | 2024-03-31 22:43:06 -0700 |
| commit | 7aced1ab9772075ef9a77b1ba4a6456968f27906 (patch) | |
| tree | 995152f5bc707d6c2160f92a879eb52f8fc2a3a9 /libc/src/stdlib/atexit.cpp | |
| parent | fd7a6d054b1e027c036a1cff5ddc7ee81461f90a (diff) | |
| parent | 1e442ac4c33ac36d33e191c2d18ff594d8a5d11a (diff) | |
[𝘀𝗽𝗿] changes introduced through rebaseusers/vitalybuka/spr/main.analysis-exclude-llvmallowruntimeubsancheck-from-aliassettracker
Created using spr 1.3.4
[skip ci]
Diffstat (limited to 'libc/src/stdlib/atexit.cpp')
| -rw-r--r-- | libc/src/stdlib/atexit.cpp | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/libc/src/stdlib/atexit.cpp b/libc/src/stdlib/atexit.cpp index 741ea4f25103..fa072b2fdf8d 100644 --- a/libc/src/stdlib/atexit.cpp +++ b/libc/src/stdlib/atexit.cpp @@ -55,14 +55,10 @@ void stdc_at_exit_func(void *payload) { reinterpret_cast<StdCAtExitCallback *>(payload)(); } -} // namespace - -namespace internal { - void call_exit_callbacks() { handler_list_mtx.lock(); while (!exit_callbacks.empty()) { - auto unit = exit_callbacks.back(); + AtExitUnit &unit = exit_callbacks.back(); exit_callbacks.pop_back(); handler_list_mtx.unlock(); unit.callback(unit.payload); @@ -71,20 +67,31 @@ void call_exit_callbacks() { ExitCallbackList::destroy(&exit_callbacks); } -} // namespace internal - -static int add_atexit_unit(const AtExitUnit &unit) { +int add_atexit_unit(const AtExitUnit &unit) { MutexLock lock(&handler_list_mtx); - if (!exit_callbacks.push_back(unit)) - return -1; - return 0; + if (exit_callbacks.push_back(unit)) + return 0; + return -1; } +} // namespace + +extern "C" { + // TODO: Handle the last dso handle argument. -extern "C" int __cxa_atexit(AtExitCallback *callback, void *payload, void *) { +int __cxa_atexit(AtExitCallback *callback, void *payload, void *) { return add_atexit_unit({callback, payload}); } +// TODO: Handle the dso handle argument. call_exit_callbacks should only invoke +// the callbacks from this DSO. Requires adding support for __dso_handle. +void __cxa_finalize(void *dso) { + if (!dso) + call_exit_callbacks(); +} + +} // extern "C" + LLVM_LIBC_FUNCTION(int, atexit, (StdCAtExitCallback * callback)) { return add_atexit_unit( {&stdc_at_exit_func, reinterpret_cast<void *>(callback)}); |
