diff options
author | Bruno Haible <bruno@clisp.org> | 2018-12-12 01:14:34 +0100 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2018-12-12 01:14:34 +0100 |
commit | 1a833ed0ddb6e482b121f813e00e5e2b5e79a8d2 (patch) | |
tree | b08913e3855e53ea226949806e0335dc9ff957a6 /lib/gl_omap.h | |
parent | 821015b5747ecf99422ada31398bde8dd7549970 (diff) | |
download | gnulib-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.h | 20 |
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 |