From: Tobias Stoeckmann Date: Tue, 5 Nov 2024 16:47:02 +0000 (+0100) Subject: libkmod: Introduce kmod_list_release X-Git-Tag: v34~98 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=63aec6095b0ea0bed20d5fb6fc72a067a5e73380;p=thirdparty%2Fkmod.git libkmod: Introduce kmod_list_release Add a macro to reduce amount of explicit while-loops for removal of nodes and release of their associated data in code base. Signed-off-by: Tobias Stoeckmann Link: https://github.com/kmod-project/kmod/pull/228 Signed-off-by: Lucas De Marchi --- diff --git a/libkmod/libkmod-config.c b/libkmod/libkmod-config.c index 4078dda2..648656e1 100644 --- a/libkmod/libkmod-config.c +++ b/libkmod/libkmod-config.c @@ -151,15 +151,6 @@ static int kmod_config_add_command(struct kmod_config *config, const char *modna return 0; } -static void kmod_config_free_command(struct kmod_config *config, struct kmod_list *l, - struct kmod_list **list) -{ - struct kmod_command *cmd = l->data; - - free(cmd); - *list = kmod_list_remove(l); -} - static int kmod_config_add_options(struct kmod_config *config, const char *modname, const char *options) { @@ -189,15 +180,6 @@ static int kmod_config_add_options(struct kmod_config *config, const char *modna return 0; } -static void kmod_config_free_options(struct kmod_config *config, struct kmod_list *l) -{ - struct kmod_options *opt = l->data; - - free(opt); - - config->options = kmod_list_remove(l); -} - static int kmod_config_add_alias(struct kmod_config *config, const char *name, const char *modname) { @@ -225,15 +207,6 @@ static int kmod_config_add_alias(struct kmod_config *config, const char *name, return 0; } -static void kmod_config_free_alias(struct kmod_config *config, struct kmod_list *l) -{ - struct kmod_alias *alias = l->data; - - free(alias); - - config->aliases = kmod_list_remove(l); -} - static int kmod_config_add_blacklist(struct kmod_config *config, const char *modname) { _cleanup_free_ char *p; @@ -254,12 +227,6 @@ static int kmod_config_add_blacklist(struct kmod_config *config, const char *mod return 0; } -static void kmod_config_free_blacklist(struct kmod_config *config, struct kmod_list *l) -{ - free(l->data); - config->blacklists = kmod_list_remove(l); -} - static int kmod_config_add_softdep(struct kmod_config *config, const char *modname, const char *line) { @@ -636,18 +603,6 @@ static char *weakdep_to_char(struct kmod_weakdep *dep) return s; } -static void kmod_config_free_softdep(struct kmod_config *config, struct kmod_list *l) -{ - free(l->data); - config->softdeps = kmod_list_remove(l); -} - -static void kmod_config_free_weakdep(struct kmod_config *config, struct kmod_list *l) -{ - free(l->data); - config->weakdeps = kmod_list_remove(l); -} - static void kcmdline_parse_result(struct kmod_config *config, char *modname, char *param, char *value) { @@ -913,34 +868,14 @@ done_next: void kmod_config_free(struct kmod_config *config) { - while (config->aliases) - kmod_config_free_alias(config, config->aliases); - - while (config->blacklists) - kmod_config_free_blacklist(config, config->blacklists); - - while (config->options) - kmod_config_free_options(config, config->options); - - while (config->install_commands) { - kmod_config_free_command(config, config->install_commands, - &config->install_commands); - } - - while (config->remove_commands) { - kmod_config_free_command(config, config->remove_commands, - &config->remove_commands); - } - - while (config->softdeps) - kmod_config_free_softdep(config, config->softdeps); - - while (config->weakdeps) - kmod_config_free_weakdep(config, config->weakdeps); - - for (; config->paths != NULL; config->paths = kmod_list_remove(config->paths)) - free(config->paths->data); - + kmod_list_release(config->aliases, free); + kmod_list_release(config->blacklists, free); + kmod_list_release(config->options, free); + kmod_list_release(config->install_commands, free); + kmod_list_release(config->remove_commands, free); + kmod_list_release(config->softdeps, free); + kmod_list_release(config->weakdeps, free); + kmod_list_release(config->paths, free); free(config); } @@ -1146,11 +1081,8 @@ int kmod_config_new(struct kmod_ctx *ctx, struct kmod_config **p_config, return 0; oom: - for (; list != NULL; list = kmod_list_remove(list)) - free(list->data); - - for (; path_list != NULL; path_list = kmod_list_remove(path_list)) - free(path_list->data); + kmod_list_release(list, free); + kmod_list_release(path_list, free); return -ENOMEM; } diff --git a/libkmod/libkmod-internal.h b/libkmod/libkmod-internal.h index 3ecf9458..c27be01b 100644 --- a/libkmod/libkmod-internal.h +++ b/libkmod/libkmod-internal.h @@ -62,6 +62,11 @@ _must_check_ struct kmod_list *kmod_list_remove_n_latest(struct kmod_list *list, _nonnull_(2) struct kmod_list *kmod_list_insert_after(struct kmod_list *list, const void *data); _nonnull_(2) struct kmod_list *kmod_list_insert_before(struct kmod_list *list, const void *data); _must_check_ struct kmod_list *kmod_list_append_list(struct kmod_list *list1, struct kmod_list *list2); +#define kmod_list_release(list, free_data) \ + while (list) { \ + free_data((list)->data); \ + list = kmod_list_remove(list); \ + } /* libkmod.c */ _nonnull_all_ int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name, struct kmod_list **list); diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 8b7a056b..1324eeb0 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -495,8 +495,7 @@ KMOD_EXPORT int kmod_module_new_from_name_lookup(struct kmod_ctx *ctx, KMOD_EXPORT int kmod_module_unref_list(struct kmod_list *list) { - for (; list != NULL; list = kmod_list_remove(list)) - kmod_module_unref(list->data); + kmod_list_release(list, kmod_module_unref); return 0; } @@ -1728,10 +1727,7 @@ KMOD_EXPORT unsigned long kmod_module_section_get_address(const struct kmod_list KMOD_EXPORT void kmod_module_section_free_list(struct kmod_list *list) { - while (list) { - kmod_module_section_free(list->data); - list = kmod_list_remove(list); - } + kmod_list_release(list, kmod_module_section_free); } static struct kmod_elf *kmod_module_get_elf(const struct kmod_module *mod) @@ -1980,10 +1976,7 @@ KMOD_EXPORT const char *kmod_module_info_get_value(const struct kmod_list *entry KMOD_EXPORT void kmod_module_info_free_list(struct kmod_list *list) { - while (list) { - kmod_module_info_free(list->data); - list = kmod_list_remove(list); - } + kmod_list_release(list, kmod_module_info_free); } struct kmod_module_version { @@ -2085,10 +2078,7 @@ KMOD_EXPORT uint64_t kmod_module_version_get_crc(const struct kmod_list *entry) KMOD_EXPORT void kmod_module_versions_free_list(struct kmod_list *list) { - while (list) { - kmod_module_version_free(list->data); - list = kmod_list_remove(list); - } + kmod_list_release(list, kmod_module_version_free); } struct kmod_module_symbol { @@ -2189,10 +2179,7 @@ KMOD_EXPORT uint64_t kmod_module_symbol_get_crc(const struct kmod_list *entry) KMOD_EXPORT void kmod_module_symbols_free_list(struct kmod_list *list) { - while (list) { - kmod_module_symbol_free(list->data); - list = kmod_list_remove(list); - } + kmod_list_release(list, kmod_module_symbol_free); } struct kmod_module_dependency_symbol { @@ -2312,8 +2299,5 @@ KMOD_EXPORT int kmod_module_dependency_symbol_get_bind(const struct kmod_list *e KMOD_EXPORT void kmod_module_dependency_symbols_free_list(struct kmod_list *list) { - while (list) { - kmod_module_dependency_symbol_free(list->data); - list = kmod_list_remove(list); - } + kmod_list_release(list, kmod_module_dependency_symbol_free); } diff --git a/tools/depmod.c b/tools/depmod.c index 822b8dbd..999b5b5a 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -1930,12 +1930,7 @@ static int depmod_report_cycles_from_root(struct depmod *depmod, struct mod *roo ret = 0; out: - while (free_list) { - v = free_list->data; - l = kmod_list_remove(free_list); - free_list = l; - free(v); - } + kmod_list_release(free_list, free); return ret; }