--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "static-destruct.h"
+
+void static_destruct_impl(const StaticDestructor *start, const StaticDestructor *end) {
+ if (!start)
+ return;
+
+ for (const StaticDestructor *d = ALIGN_PTR(start); d < end; d = ALIGN_PTR(d + 1))
+ switch (d->type) {
+ case STATIC_DESTRUCTOR_SIMPLE:
+ d->simple.destroy(d->simple.data);
+ break;
+
+ case STATIC_DESTRUCTOR_ARRAY:
+ array_cleanup(&d->array);
+ break;
+
+ default:
+ assert_not_reached();
+ }
+}
extern const StaticDestructor _weak_ __start_SYSTEMD_STATIC_DESTRUCT[];
extern const StaticDestructor _weak_ __stop_SYSTEMD_STATIC_DESTRUCT[];
+void static_destruct_impl(const StaticDestructor *start, const StaticDestructor *end);
+
/* The function to destroy everything. (Note that this must be static inline, as it's key that it remains in
* the same linking unit as the variables we want to destroy.) */
static inline void static_destruct(void) {
- if (!__start_SYSTEMD_STATIC_DESTRUCT)
- return;
-
- for (const StaticDestructor *d = ALIGN_PTR(__start_SYSTEMD_STATIC_DESTRUCT);
- d < __stop_SYSTEMD_STATIC_DESTRUCT;
- d = ALIGN_PTR(d + 1))
- switch (d->type) {
- case STATIC_DESTRUCTOR_SIMPLE:
- d->simple.destroy(d->simple.data);
- break;
-
- case STATIC_DESTRUCTOR_ARRAY:
- array_cleanup(&d->array);
- break;
-
- default:
- assert_not_reached();
- }
+ return static_destruct_impl(__start_SYSTEMD_STATIC_DESTRUCT, __stop_SYSTEMD_STATIC_DESTRUCT);
}