From: Daan De Meyer Date: Wed, 14 May 2025 13:06:50 +0000 (+0200) Subject: static-destruct: Move static_destruct() logic to implementation file X-Git-Tag: v258-rc1~621 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=02b6ac3a50a57f63a1c5d398f1a3e445b25fd00f;p=thirdparty%2Fsystemd.git static-destruct: Move static_destruct() logic to implementation file This will allow us to remove the memory-util.h include from static-destruct.h as part of #37344. --- diff --git a/src/basic/meson.build b/src/basic/meson.build index a2ac978a20c..44b90c2e768 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 00000000000..f8006c86ddc --- /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 f167d6413ec..aaafbbc478b 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); }