make env_entry::callback conditional on !CONFIG_SPL_BUILD
authorRasmus Villemoes <rasmus.villemoes@prevas.dk>
Thu, 27 Feb 2020 13:56:12 +0000 (13:56 +0000)
committerTom Rini <trini@konsulko.com>
Fri, 24 Apr 2020 14:09:59 +0000 (10:09 -0400)
The callback member of struct env_entry is always NULL for an SPL
build. Removing it thus saves a bit of run-time memory in the
SPL (when CONFIG_SPL_ENV_SUPPORT=y) since struct env_entry is embedded
in struct env_entry_node - i.e. about 2KB for the normal case of
512+change hash table entries.

Two small fixups are needed for this, all other references to the
callback member are already under !CONFIG_SPL_BUILD: Don't initialize
.callback in set_flags() - hsearch_r doesn't use that value
anyway. And make env_callback_init() initialize ->callback to NULL for
a new entry instead of relying on an unused or deleted entry having
NULL in ->callback.

Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
Reviewed-by: Simon Glass <sjg@chromium.org>
env/callback.c
env/flags.c
include/search.h
lib/hashtable.c

index f0904cfdc5352249376d2fcc0a0eb2c83bb5b633..4054b9ef58b3a25fda8371938b3c904e0f573ce4 100644 (file)
@@ -55,6 +55,8 @@ void env_callback_init(struct env_entry *var_entry)
                first_call = 0;
        }
 
+       var_entry->callback = NULL;
+
        /* look in the ".callbacks" var for a reference to this variable */
        if (callback_list != NULL)
                ret = env_attr_lookup(callback_list, var_name, callback_name);
index 418d6cc7425a5689164b0d99fa250e3d4d2c9fa2..b88fe7ba9c8a6b69443e14cea125f9a811bc2886 100644 (file)
@@ -457,7 +457,6 @@ static int set_flags(const char *name, const char *value, void *priv)
 
        e.key   = name;
        e.data  = NULL;
-       e.callback = NULL;
        hsearch_r(e, ENV_FIND, &ep, &env_htab, 0);
 
        /* does the env variable actually exist? */
index 0469a852e07cbec68b401b3c8c7361a780c1dbbb..8f87dc72ce7b8fd3985cb382a5e6064c16905711 100644 (file)
@@ -29,8 +29,10 @@ enum env_action {
 struct env_entry {
        const char *key;
        char *data;
+#ifndef CONFIG_SPL_BUILD
        int (*callback)(const char *name, const char *value, enum env_op op,
                int flags);
+#endif
        int flags;
 };
 
index c4e1e2bd45fbe07b020dc942e8c69b6a21bd3bf6..f82f2463cf23a640082c78b6b54bf8069f8b03d5 100644 (file)
@@ -450,7 +450,6 @@ static void _hdelete(const char *key, struct hsearch_data *htab,
        debug("hdelete: DELETING key \"%s\"\n", key);
        free((void *)ep->key);
        free(ep->data);
-       ep->callback = NULL;
        ep->flags = 0;
        htab->table[idx].used = USED_DELETED;