aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libctf/ChangeLog8
-rw-r--r--libctf/ctf-hash.c18
2 files changed, 22 insertions, 4 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 28be757..08a2e3a 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,3 +1,11 @@
+2019-07-30 Nick Alcock <nick.alcock@oracle.com>
+
+ * ctf-hash.c (ctf_hashtab_insert): Pass in the key and value
+ freeing functions: if set, free the key and value if the slot
+ already exists. Always reassign the key.
+ (ctf_dynhash_insert): Adjust call appropriately.
+ (ctf_hash_insert_type): Likewise.
+
2019-08-03 Nick Alcock <nick.alcock@oracle.com>
* ctf-create.c (ctf_add_type): Look up and use the forwarded-to
diff --git a/libctf/ctf-hash.c b/libctf/ctf-hash.c
index c6233eb..59fceed 100644
--- a/libctf/ctf-hash.c
+++ b/libctf/ctf-hash.c
@@ -152,7 +152,9 @@ ctf_hashtab_lookup (struct htab *htab, const void *key, enum insert_option inser
}
static ctf_helem_t *
-ctf_hashtab_insert (struct htab *htab, void *key, void *value)
+ctf_hashtab_insert (struct htab *htab, void *key, void *value,
+ ctf_hash_free_fun key_free,
+ ctf_hash_free_fun value_free)
{
ctf_helem_t **slot;
@@ -169,8 +171,15 @@ ctf_hashtab_insert (struct htab *htab, void *key, void *value)
*slot = malloc (sizeof (ctf_helem_t));
if (!*slot)
return NULL;
- (*slot)->key = key;
}
+ else
+ {
+ if (key_free)
+ key_free ((*slot)->key);
+ if (value_free)
+ value_free ((*slot)->value);
+ }
+ (*slot)->key = key;
(*slot)->value = value;
return *slot;
}
@@ -180,7 +189,8 @@ ctf_dynhash_insert (ctf_dynhash_t *hp, void *key, void *value)
{
ctf_helem_t *slot;
- slot = ctf_hashtab_insert (hp->htab, key, value);
+ slot = ctf_hashtab_insert (hp->htab, key, value,
+ hp->key_free, hp->value_free);
if (!slot)
return errno;
@@ -317,7 +327,7 @@ ctf_hash_insert_type (ctf_hash_t *hp, ctf_file_t *fp, uint32_t type,
return 0; /* Just ignore empty strings on behalf of caller. */
if (ctf_hashtab_insert ((struct htab *) hp, (char *) str,
- (void *) (ptrdiff_t) type) != NULL)
+ (void *) (ptrdiff_t) type, NULL, NULL) != NULL)
return 0;
return errno;
}