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.
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user