summaryrefslogtreecommitdiff
path: root/lib/gl_omap.h
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2018-12-12 01:14:34 +0100
committerBruno Haible <bruno@clisp.org>2018-12-12 01:14:34 +0100
commit1a833ed0ddb6e482b121f813e00e5e2b5e79a8d2 (patch)
treeb08913e3855e53ea226949806e0335dc9ff957a6 /lib/gl_omap.h
parent821015b5747ecf99422ada31398bde8dd7549970 (diff)
downloadgnulib-1a833ed0ddb6e482b121f813e00e5e2b5e79a8d2.tar.gz
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.
Diffstat (limited to 'lib/gl_omap.h')
-rw-r--r--lib/gl_omap.h20
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/gl_omap.h b/lib/gl_omap.h
index d00a699b4f..aa82e332b6 100644
--- a/lib/gl_omap.h
+++ b/lib/gl_omap.h
@@ -360,14 +360,30 @@ GL_OMAP_INLINE int
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