tree data OPTIMIZE duplication of a hash table
Allocate the exact amount of memory for a new hash table as was
allocated for the old one at once.
diff --git a/src/tree_data.c b/src/tree_data.c
index e1463ea..5bddf5f 100644
--- a/src/tree_data.c
+++ b/src/tree_data.c
@@ -2148,6 +2148,11 @@
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 ce237b1..9be655c 100644
--- a/src/tree_data_hash.c
+++ b/src/tree_data_hash.c
@@ -84,7 +84,7 @@
*
* 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 2bfa66d..b3a027c 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"
@@ -601,6 +602,13 @@
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.
*
* @param[in] node Data node which hash will be inserted into the ::lyd_node_inner.children_ht hash table of its parent.