diff --git a/src/basic/meson.build b/src/basic/meson.build index a2ac978a20..44b90c2e76 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -96,6 +96,7 @@ basic_sources = files( 'socket-util.c', 'sort-util.c', 'stat-util.c', + 'static-destruct.c', 'strbuf.c', 'string-table.c', 'string-util.c', diff --git a/src/basic/static-destruct.c b/src/basic/static-destruct.c new file mode 100644 index 0000000000..f8006c86dd --- /dev/null +++ b/src/basic/static-destruct.c @@ -0,0 +1,22 @@ +/* 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(); + } +} diff --git a/src/basic/static-destruct.h b/src/basic/static-destruct.h index f167d6413e..aaafbbc478 100644 --- a/src/basic/static-destruct.h +++ b/src/basic/static-destruct.h @@ -84,25 +84,10 @@ typedef struct StaticDestructor { 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); }