From: Yu Watanabe Date: Sat, 8 May 2021 06:32:52 +0000 (+0900) Subject: hashmap,set: make hashmap_clear_with_destructor() or friends safer X-Git-Tag: v249-rc1~240^2~20 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=38c116df7fe29c814eda1a54e0986dcdd1d58843;p=thirdparty%2Fsystemd.git hashmap,set: make hashmap_clear_with_destructor() or friends safer --- diff --git a/src/basic/hashmap.h b/src/basic/hashmap.h index c20ee8eb4bc..c855f39b1d3 100644 --- a/src/basic/hashmap.h +++ b/src/basic/hashmap.h @@ -371,28 +371,26 @@ static inline void *ordered_hashmap_first_key(OrderedHashmap *h) { return _hashmap_first_key(HASHMAP_BASE(h), false); } -#define hashmap_clear_with_destructor(_s, _f) \ +#define hashmap_clear_with_destructor(h, f) \ ({ \ + Hashmap *_h = (h); \ void *_item; \ - while ((_item = hashmap_steal_first(_s))) \ - _f(_item); \ + while ((_item = hashmap_steal_first(_h))) \ + f(_item); \ + _h; \ }) -#define hashmap_free_with_destructor(_s, _f) \ - ({ \ - hashmap_clear_with_destructor(_s, _f); \ - hashmap_free(_s); \ - }) -#define ordered_hashmap_clear_with_destructor(_s, _f) \ +#define hashmap_free_with_destructor(h, f) \ + hashmap_free(hashmap_clear_with_destructor(h, f)) +#define ordered_hashmap_clear_with_destructor(h, f) \ ({ \ + OrderedHashmap *_h = (h); \ void *_item; \ - while ((_item = ordered_hashmap_steal_first(_s))) \ - _f(_item); \ - }) -#define ordered_hashmap_free_with_destructor(_s, _f) \ - ({ \ - ordered_hashmap_clear_with_destructor(_s, _f); \ - ordered_hashmap_free(_s); \ + while ((_item = ordered_hashmap_steal_first(_h))) \ + f(_item); \ + _h; \ }) +#define ordered_hashmap_free_with_destructor(h, f) \ + ordered_hashmap_free(ordered_hashmap_clear_with_destructor(h, f)) /* no hashmap_next */ void* ordered_hashmap_next(OrderedHashmap *h, const void *key); diff --git a/src/basic/set.h b/src/basic/set.h index 52b6f4984c0..0f8673934f1 100644 --- a/src/basic/set.h +++ b/src/basic/set.h @@ -95,17 +95,16 @@ static inline void *set_steal_first(Set *s) { return _hashmap_first_key_and_value(HASHMAP_BASE(s), true, NULL); } -#define set_clear_with_destructor(_s, _f) \ +#define set_clear_with_destructor(s, f) \ ({ \ + Set *_s = (s); \ void *_item; \ while ((_item = set_steal_first(_s))) \ - _f(_item); \ - }) -#define set_free_with_destructor(_s, _f) \ - ({ \ - set_clear_with_destructor(_s, _f); \ - set_free(_s); \ + f(_item); \ + _s; \ }) +#define set_free_with_destructor(s, f) \ + set_free(set_clear_with_destructor(s, f)) /* no set_steal_first_key */ /* no set_first_key */