diff --git a/src/hash_table.c b/src/hash_table.c index 8b8319463..4dbfdd18b 100644 --- a/src/hash_table.c +++ b/src/hash_table.c @@ -179,6 +179,7 @@ lyht_free(struct ly_ht *ht, void (*val_free)(void *val_p)) * * @param[in] ht Hash table to resize. * @param[in] operation Operation to perform. 1 to enlarge, -1 to shrink, 0 to only rehash all records. + * @param[in] check Whether to check if the value has already been inserted or not. * @return LY_ERR value. */ static LY_ERR diff --git a/src/tree_data.c b/src/tree_data.c index e1463ea25..5bddf5f9c 100644 --- a/src/tree_data.c +++ b/src/tree_data.c @@ -2148,6 +2148,11 @@ lyd_dup_r(const struct lyd_node *node, const struct ly_ctx *trg_ctx, struct lyd_ struct lyd_node *child; if (options & LYD_DUP_RECURSIVE) { + /* create a hash table with the size of the previous hash table (duplicate) */ + if (orig->children_ht) { + ((struct lyd_node_inner *)dup)->children_ht = lyht_new(orig->children_ht->size, sizeof(struct lyd_node *), lyd_hash_table_val_equal, NULL, 1); + } + /* duplicate all the children */ LY_LIST_FOR(orig->child, child) { LY_CHECK_GOTO(ret = lyd_dup_r(child, trg_ctx, dup, LYD_INSERT_NODE_LAST, NULL, options, NULL), error); diff --git a/src/tree_data_hash.c b/src/tree_data_hash.c index ce237b1e5..9be655ca4 100644 --- a/src/tree_data_hash.c +++ b/src/tree_data_hash.c @@ -84,7 +84,7 @@ lyd_hash(struct lyd_node *node) * * Implementation of ::lyht_value_equal_cb. */ -static ly_bool +ly_bool lyd_hash_table_val_equal(void *val1_p, void *val2_p, ly_bool mod, void *UNUSED(cb_data)) { struct lyd_node *val1, *val2; diff --git a/src/tree_data_internal.h b/src/tree_data_internal.h index 2bfa66de7..b3a027c58 100644 --- a/src/tree_data_internal.h +++ b/src/tree_data_internal.h @@ -16,6 +16,7 @@ #ifndef LY_TREE_DATA_INTERNAL_H_ #define LY_TREE_DATA_INTERNAL_H_ +#include "compat.h" #include "log.h" #include "plugins_types.h" #include "tree_data.h" @@ -600,6 +601,13 @@ LY_ERR ly_value_validate(const struct ly_ctx *ctx, const struct lysc_node *node, */ LY_ERR lyd_hash(struct lyd_node *node); +/** + * @brief Compare callback for values in hash table. + * + * Implementation of ::lyht_value_equal_cb. + */ +ly_bool lyd_hash_table_val_equal(void *val1_p, void *val2_p, ly_bool mod, void *cb_data); + /** * @brief Insert hash of the node into the hash table of its parent. *