summaryrefslogtreecommitdiff
path: root/libc/src/stdlib/atexit.cpp
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2024-03-31 22:43:06 -0700
committerVitaly Buka <vitalybuka@google.com>2024-03-31 22:43:06 -0700
commit7aced1ab9772075ef9a77b1ba4a6456968f27906 (patch)
tree995152f5bc707d6c2160f92a879eb52f8fc2a3a9 /libc/src/stdlib/atexit.cpp
parentfd7a6d054b1e027c036a1cff5ddc7ee81461f90a (diff)
parent1e442ac4c33ac36d33e191c2d18ff594d8a5d11a (diff)
Created using spr 1.3.4 [skip ci]
Diffstat (limited to 'libc/src/stdlib/atexit.cpp')
-rw-r--r--libc/src/stdlib/atexit.cpp31
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)});