]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
libkmod: Introduce kmod_list_release
authorTobias Stoeckmann <tobias@stoeckmann.org>
Tue, 5 Nov 2024 16:47:02 +0000 (17:47 +0100)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Fri, 15 Nov 2024 18:59:45 +0000 (12:59 -0600)
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 <tobias@stoeckmann.org>
Link: https://github.com/kmod-project/kmod/pull/228
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
libkmod/libkmod-config.c
libkmod/libkmod-internal.h
libkmod/libkmod-module.c
tools/depmod.c

index 4078dda2b5e4e68f4b080eb5919a749b9befdf23..648656e1e0ee6220ba85b12bf5254b46f3b4840b 100644 (file)
@@ -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;
 }
index 3ecf9458c52ced15e45e1d016c4639d2c4e51ce4..c27be01b4f188ad0beb80344e11c0f0ae2303f7a 100644 (file)
@@ -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);
index 8b7a056b6ab1bda416949b24ef6c50ede995b720..1324eeb0dd9439a2b9f2ca61c5a60e0f9ddd3666 100644 (file)
@@ -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);
 }
index 822b8dbd3c2f54e48b04719a5bbffddce6795dc1..999b5b5a4e80788ded72740fdc39e5e868bf3cdd 100644 (file)
@@ -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;
 }