diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2023-03-21 08:54:21 -0400 |
|---|---|---|
| committer | Donald Sharp <sharpd@nvidia.com> | 2023-03-21 08:54:21 -0400 |
| commit | d8bc11a592110abdd14d11dfcb2ce623653ecab5 (patch) | |
| tree | eee3628586497e48192f65326316f0eb91114011 /lib | |
| parent | 2e1ea892220dccb8a4c72e438cb3bbd4cac22b2b (diff) | |
*: Add a hash_clean_and_free() function
Add a hash_clean_and_free() function as well as convert
the code to use it. This function also takes a double
pointer to the hash to set it NULL. Also it cleanly
does nothing if the pointer is NULL( as a bunch of
code tested for ).
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/command.c | 4 | ||||
| -rw-r--r-- | lib/distribute.c | 15 | ||||
| -rw-r--r-- | lib/ferr.c | 4 | ||||
| -rw-r--r-- | lib/frrscript.c | 6 | ||||
| -rw-r--r-- | lib/hash.c | 10 | ||||
| -rw-r--r-- | lib/hash.h | 11 | ||||
| -rw-r--r-- | lib/if_rmap.c | 2 | ||||
| -rw-r--r-- | lib/northbound.c | 3 | ||||
| -rw-r--r-- | lib/thread.c | 4 | ||||
| -rw-r--r-- | lib/vrf.c | 6 |
10 files changed, 37 insertions, 28 deletions
diff --git a/lib/command.c b/lib/command.c index ee5a3889e8..196d73d46a 100644 --- a/lib/command.c +++ b/lib/command.c @@ -2596,9 +2596,7 @@ void cmd_terminate(void) // well graph_delete_graph(cmd_node->cmdgraph); vector_free(cmd_node->cmd_vector); - hash_clean(cmd_node->cmd_hash, NULL); - hash_free(cmd_node->cmd_hash); - cmd_node->cmd_hash = NULL; + hash_clean_and_free(&cmd_node->cmd_hash, NULL); } vector_free(cmdvec); diff --git a/lib/distribute.c b/lib/distribute.c index 4cfdcc7840..65487676d6 100644 --- a/lib/distribute.c +++ b/lib/distribute.c @@ -445,14 +445,15 @@ int config_write_distribute(struct vty *vty, void distribute_list_delete(struct distribute_ctx **ctx) { - if ((*ctx)->disthash) { - hash_clean((*ctx)->disthash, (void (*)(void *))distribute_free); + hash_clean_and_free(&(*ctx)->disthash, + (void (*)(void *))distribute_free); + + if (dist_ctx_list) { + listnode_delete(dist_ctx_list, *ctx); + if (list_isempty(dist_ctx_list)) + list_delete(&dist_ctx_list); } - if (!dist_ctx_list) - dist_ctx_list = list_new(); - listnode_delete(dist_ctx_list, *ctx); - if (list_isempty(dist_ctx_list)) - list_delete(&dist_ctx_list); + XFREE(MTYPE_DISTRIBUTE_CTX, (*ctx)); } diff --git a/lib/ferr.c b/lib/ferr.c index 5998befec2..33bcb075fa 100644 --- a/lib/ferr.c +++ b/lib/ferr.c @@ -180,9 +180,7 @@ void log_ref_init(void) void log_ref_fini(void) { frr_with_mutex (&refs_mtx) { - hash_clean(refs, NULL); - hash_free(refs); - refs = NULL; + hash_clean_and_free(&refs, NULL); } } diff --git a/lib/frrscript.c b/lib/frrscript.c index 4248a45002..1b99c7e2c6 100644 --- a/lib/frrscript.c +++ b/lib/frrscript.c @@ -398,8 +398,7 @@ fail: void frrscript_delete(struct frrscript *fs) { - hash_clean(fs->lua_function_hash, lua_function_free); - hash_free(fs->lua_function_hash); + hash_clean_and_free(&fs->lua_function_hash, lua_function_free); XFREE(MTYPE_SCRIPT, fs->name); XFREE(MTYPE_SCRIPT, fs); } @@ -417,8 +416,7 @@ void frrscript_init(const char *sd) void frrscript_fini(void) { - hash_clean(codec_hash, codec_free); - hash_free(codec_hash); + hash_clean_and_free(&codec_hash, codec_free); frrscript_names_destroy(); } diff --git a/lib/hash.c b/lib/hash.c index 97a77a2b9a..df56243985 100644 --- a/lib/hash.c +++ b/lib/hash.c @@ -297,6 +297,16 @@ void hash_clean(struct hash *hash, void (*free_func)(void *)) hash->stats.empty = hash->size; } +void hash_clean_and_free(struct hash **hash, void (*free_func)(void *)) +{ + if (!*hash) + return; + + hash_clean(*hash, free_func); + hash_free(*hash); + *hash = NULL; +} + static void hash_to_list_iter(struct hash_bucket *hb, void *arg) { struct list *list = arg; diff --git a/lib/hash.h b/lib/hash.h index f32309d804..810faf9030 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -278,6 +278,17 @@ extern void hash_walk(struct hash *hash, extern void hash_clean(struct hash *hash, void (*free_func)(void *)); /* + * Remove all elements from a hash table and free the table, + * setting the pointer to NULL. + * + * hash + * hash table to operate on + * free_func + * function to call with each removed item, intended to free the data + */ +extern void hash_clean_and_free(struct hash **hash, void (*free_func)(void *)); + +/* * Delete a hash table. * * This function assumes the table is empty. Call hash_clean to delete the diff --git a/lib/if_rmap.c b/lib/if_rmap.c index fa8899e9f8..27c41aaa27 100644 --- a/lib/if_rmap.c +++ b/lib/if_rmap.c @@ -276,7 +276,7 @@ int config_write_if_rmap(struct vty *vty, void if_rmap_ctx_delete(struct if_rmap_ctx *ctx) { listnode_delete(if_rmap_ctx_list, ctx); - hash_clean(ctx->ifrmaphash, (void (*)(void *))if_rmap_free); + hash_clean_and_free(&ctx->ifrmaphash, (void (*)(void *))if_rmap_free); if (ctx->name) XFREE(MTYPE_IF_RMAP_CTX_NAME, ctx); XFREE(MTYPE_IF_RMAP_CTX, ctx); diff --git a/lib/northbound.c b/lib/northbound.c index 6f2c522a29..b208e45d62 100644 --- a/lib/northbound.c +++ b/lib/northbound.c @@ -2498,8 +2498,7 @@ void nb_terminate(void) nb_nodes_delete(); /* Delete the running configuration. */ - hash_clean(running_config_entries, running_config_entry_free); - hash_free(running_config_entries); + hash_clean_and_free(&running_config_entries, running_config_entry_free); nb_config_free(running_config); pthread_mutex_destroy(&running_config_mgmt_lock.mtx); } diff --git a/lib/thread.c b/lib/thread.c index 8324783a7b..87ad3d8823 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -724,9 +724,7 @@ void thread_master_free(struct thread_master *m) list_delete(&m->cancel_req); m->cancel_req = NULL; - hash_clean(m->cpu_record, cpu_record_hash_free); - hash_free(m->cpu_record); - m->cpu_record = NULL; + hash_clean_and_free(&m->cpu_record, cpu_record_hash_free); XFREE(MTYPE_THREAD_MASTER, m->name); XFREE(MTYPE_THREAD_MASTER, m->handler.pfds); @@ -394,11 +394,7 @@ void vrf_bitmap_free(vrf_bitmap_t bmap) { struct hash *vrf_hash = bmap; - if (vrf_hash == NULL) - return; - - hash_clean(vrf_hash, vrf_hash_bitmap_free); - hash_free(vrf_hash); + hash_clean_and_free(&vrf_hash, vrf_hash_bitmap_free); } void vrf_bitmap_set(vrf_bitmap_t bmap, vrf_id_t vrf_id) |
