changeset 40013:3f2678b62046

omap: Don't dispose the old value when the function returns it. * lib/gl_array_omap.c (gl_array_remove_at): Don't invoke the vdispose_fn here. * lib/gl_avltree_omap.c (NODE_PAYLOAD_DISPOSE): Likewise. * lib/gl_rbtree_omap.c (NODE_PAYLOAD_DISPOSE): Likewise. * lib/gl_omap.h (gl_omap_nx_put, gl_omap_remove): Invoke the vdispose_fn here.
author Bruno Haible <bruno@clisp.org>
date Wed, 12 Dec 2018 01:14:34 +0100
parents 975fc034aecf
children be8d2daa572e
files ChangeLog lib/gl_array_omap.c lib/gl_avltree_omap.c lib/gl_omap.h lib/gl_rbtree_omap.c
diffstat 5 files changed, 43 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Dec 12 01:03:13 2018 +0100
+++ b/ChangeLog	Wed Dec 12 01:14:34 2018 +0100
@@ -1,5 +1,13 @@
 2018-12-11  Bruno Haible  <bruno@clisp.org>
 
+	omap: Don't dispose the old value when the function returns it.
+	* lib/gl_array_omap.c (gl_array_remove_at): Don't invoke the vdispose_fn
+	here.
+	* lib/gl_avltree_omap.c (NODE_PAYLOAD_DISPOSE): Likewise.
+	* lib/gl_rbtree_omap.c (NODE_PAYLOAD_DISPOSE): Likewise.
+	* lib/gl_omap.h (gl_omap_nx_put, gl_omap_remove): Invoke the vdispose_fn
+	here.
+
 	array-omap, avltree-omap, rbtree-omap: Tweak style.
 	* lib/gl_anytree_omap.h (gl_tree_nx_getput): Return 1 or 0, not true or
 	false.
--- a/lib/gl_array_omap.c	Wed Dec 12 01:03:13 2018 +0100
+++ b/lib/gl_array_omap.c	Wed Dec 12 01:14:34 2018 +0100
@@ -220,25 +220,6 @@
   return 1;
 }
 
-/* Remove the pair at the given position,
-   0 <= position < gl_omap_size (map).  */
-static void
-gl_array_remove_at (gl_omap_t map, size_t position)
-{
-  size_t count = map->count;
-  struct pair *pairs;
-  size_t i;
-
-  pairs = map->pairs;
-  if (map->base.vdispose_fn != NULL)
-    map->base.vdispose_fn (pairs[position].value);
-  if (map->base.kdispose_fn != NULL)
-    map->base.kdispose_fn (pairs[position].key);
-  for (i = position + 1; i < count; i++)
-    pairs[i - 1] = pairs[i];
-  map->count = count - 1;
-}
-
 static int
 gl_array_nx_getput (gl_omap_t map, const void *key, const void *value,
                     const void **oldvaluep)
@@ -279,6 +260,23 @@
   return gl_array_nx_add_at (map, low, key, value);
 }
 
+/* Remove the pair at the given position,
+   0 <= position < gl_omap_size (map).  */
+static void
+gl_array_remove_at (gl_omap_t map, size_t position)
+{
+  size_t count = map->count;
+  struct pair *pairs;
+  size_t i;
+
+  pairs = map->pairs;
+  if (map->base.kdispose_fn != NULL)
+    map->base.kdispose_fn (pairs[position].key);
+  for (i = position + 1; i < count; i++)
+    pairs[i - 1] = pairs[i];
+  map->count = count - 1;
+}
+
 static bool
 gl_array_getremove (gl_omap_t map, const void *key, const void **oldvaluep)
 {
--- a/lib/gl_avltree_omap.c	Wed Dec 12 01:03:13 2018 +0100
+++ b/lib/gl_avltree_omap.c	Wed Dec 12 01:14:34 2018 +0100
@@ -39,8 +39,6 @@
   node->key = key; \
   node->value = value;
 #define NODE_PAYLOAD_DISPOSE \
-  if (container->base.vdispose_fn != NULL) \
-    container->base.vdispose_fn (node->value); \
   if (container->base.kdispose_fn != NULL) \
     container->base.kdispose_fn (node->key);
 
--- a/lib/gl_omap.h	Wed Dec 12 01:03:13 2018 +0100
+++ b/lib/gl_omap.h	Wed Dec 12 01:14:34 2018 +0100
@@ -360,14 +360,30 @@
 gl_omap_nx_put (gl_omap_t map, const void *key, const void *value)
 {
   const void *oldvalue;
-  return gl_omap_nx_getput (map, key, value, &oldvalue);
+  int result = gl_omap_nx_getput (map, key, value, &oldvalue);
+  if (result == 0)
+    {
+      gl_mapvalue_dispose_fn vdispose_fn =
+        ((const struct gl_omap_impl_base *) map)->vdispose_fn;
+      if (vdispose_fn != NULL)
+        vdispose_fn (oldvalue);
+    }
+  return result;
 }
 
 GL_OMAP_INLINE bool
 gl_omap_remove (gl_omap_t map, const void *key)
 {
   const void *oldvalue;
-  return gl_omap_getremove (map, key, &oldvalue);
+  bool result = gl_omap_getremove (map, key, &oldvalue);
+  if (result)
+    {
+      gl_mapvalue_dispose_fn vdispose_fn =
+        ((const struct gl_omap_impl_base *) map)->vdispose_fn;
+      if (vdispose_fn != NULL)
+        vdispose_fn (oldvalue);
+    }
+  return result;
 }
 
 #ifdef __cplusplus
--- a/lib/gl_rbtree_omap.c	Wed Dec 12 01:03:13 2018 +0100
+++ b/lib/gl_rbtree_omap.c	Wed Dec 12 01:14:34 2018 +0100
@@ -39,8 +39,6 @@
   node->key = key; \
   node->value = value;
 #define NODE_PAYLOAD_DISPOSE \
-  if (container->base.vdispose_fn != NULL) \
-    container->base.vdispose_fn (node->value); \
   if (container->base.kdispose_fn != NULL) \
     container->base.kdispose_fn (node->key);