From 3af8914a76dbbaac86a87829f875ba086a144051 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Sat, 8 Mar 2014 23:04:29 +0100 Subject: [PATCH] Key may be part of obj, remove it at the last. --- src/xbt/lib.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/xbt/lib.c b/src/xbt/lib.c index 8c594cfb82..7fa4bc7caa 100644 --- a/src/xbt/lib.c +++ b/src/xbt/lib.c @@ -80,25 +80,28 @@ void xbt_lib_unset(xbt_lib_t lib, const char *key, int level, int invoke_callbac } void *obj = elts[level]; - if (!obj) { XBT_WARN("no key %s at level %d", key, level); - } else { - XBT_DEBUG("Remove %p of key %s at level %d", obj, key, level); - if (invoke_callback) - lib->free_f[level](obj); - elts[level] = NULL; + return; } + XBT_DEBUG("Remove %p of key %s at level %d", obj, key, level); + elts[level] = NULL; + /* check if there still remains any elements of this key */ + int empty = 1; int i; - for (i = 0; i < lib->levels; i++) { + for (i = 0; i < lib->levels && empty; i++) { if (elts[i] != NULL) - return; + empty = 0; + } + if (empty) { + /* there is no element at any level, so delete the key */ + xbt_dict_remove(lib->dict, key); } - /* there is no element at any level, so delete the key */ - xbt_dict_remove(lib->dict, key); + if (invoke_callback) + lib->free_f[level](obj); } void *xbt_lib_get_or_null(xbt_lib_t lib, const char *key, int level) -- 2.20.1