Merge pull request #2702 from poettering/resolved-iterate-fix
resolved iteration fix
This commit is contained in:
+7
-7
@@ -176,7 +176,7 @@ enum HashmapType {
|
||||
};
|
||||
|
||||
struct _packed_ indirect_storage {
|
||||
char *storage; /* where buckets and DIBs are stored */
|
||||
void *storage; /* where buckets and DIBs are stored */
|
||||
uint8_t hash_key[HASH_KEY_SIZE]; /* hash key; changes during resize */
|
||||
|
||||
unsigned n_entries; /* number of stored entries */
|
||||
@@ -193,7 +193,7 @@ struct direct_storage {
|
||||
/* This gives us 39 bytes on 64bit, or 35 bytes on 32bit.
|
||||
* That's room for 4 set_entries + 4 DIB bytes + 3 unused bytes on 64bit,
|
||||
* or 7 set_entries + 7 DIB bytes + 0 unused bytes on 32bit. */
|
||||
char storage[sizeof(struct indirect_storage)];
|
||||
uint8_t storage[sizeof(struct indirect_storage)];
|
||||
};
|
||||
|
||||
#define DIRECT_BUCKETS(entry_t) \
|
||||
@@ -302,7 +302,7 @@ static void n_entries_dec(HashmapBase *h) {
|
||||
h->n_direct_entries--;
|
||||
}
|
||||
|
||||
static char *storage_ptr(HashmapBase *h) {
|
||||
static void *storage_ptr(HashmapBase *h) {
|
||||
return h->has_indirect ? h->indirect.storage
|
||||
: h->direct.storage;
|
||||
}
|
||||
@@ -347,7 +347,7 @@ static void get_hash_key(uint8_t hash_key[HASH_KEY_SIZE], bool reuse_is_ok) {
|
||||
|
||||
static struct hashmap_base_entry *bucket_at(HashmapBase *h, unsigned idx) {
|
||||
return (struct hashmap_base_entry*)
|
||||
(storage_ptr(h) + idx * hashmap_type_info[h->type].entry_size);
|
||||
((uint8_t*) storage_ptr(h) + idx * hashmap_type_info[h->type].entry_size);
|
||||
}
|
||||
|
||||
static struct plain_hashmap_entry *plain_bucket_at(Hashmap *h, unsigned idx) {
|
||||
@@ -381,7 +381,7 @@ static struct hashmap_base_entry *bucket_at_virtual(HashmapBase *h, struct swap_
|
||||
|
||||
static dib_raw_t *dib_raw_ptr(HashmapBase *h) {
|
||||
return (dib_raw_t*)
|
||||
(storage_ptr(h) + hashmap_type_info[h->type].entry_size * n_buckets(h));
|
||||
((uint8_t*) storage_ptr(h) + hashmap_type_info[h->type].entry_size * n_buckets(h));
|
||||
}
|
||||
|
||||
static unsigned bucket_distance(HashmapBase *h, unsigned idx, unsigned from) {
|
||||
@@ -1028,7 +1028,7 @@ static int hashmap_base_put_boldly(HashmapBase *h, unsigned idx,
|
||||
*/
|
||||
static int resize_buckets(HashmapBase *h, unsigned entries_add) {
|
||||
struct swap_entries swap;
|
||||
char *new_storage;
|
||||
void *new_storage;
|
||||
dib_raw_t *old_dibs, *new_dibs;
|
||||
const struct hashmap_type_info *hi;
|
||||
unsigned idx, optimal_idx;
|
||||
@@ -1095,7 +1095,7 @@ static int resize_buckets(HashmapBase *h, unsigned entries_add) {
|
||||
h->indirect.n_buckets = (1U << new_shift) /
|
||||
(hi->entry_size + sizeof(dib_raw_t));
|
||||
|
||||
old_dibs = (dib_raw_t*)(new_storage + hi->entry_size * old_n_buckets);
|
||||
old_dibs = (dib_raw_t*)((uint8_t*) new_storage + hi->entry_size * old_n_buckets);
|
||||
new_dibs = dib_raw_ptr(h);
|
||||
|
||||
/*
|
||||
|
||||
@@ -361,6 +361,12 @@ static inline unsigned long ALIGN_POWER2(unsigned long u) {
|
||||
_found; \
|
||||
})
|
||||
|
||||
#define SWAP_TWO(x, y) do { \
|
||||
typeof(x) _t = (x); \
|
||||
(x) = (y); \
|
||||
(y) = (_t); \
|
||||
} while (false)
|
||||
|
||||
/* Define C11 thread_local attribute even on older gcc compiler
|
||||
* version */
|
||||
#ifndef thread_local
|
||||
|
||||
@@ -126,6 +126,9 @@ int set_put_strdupv(Set *s, char **l);
|
||||
#define SET_FOREACH(e, s, i) \
|
||||
for ((i) = ITERATOR_FIRST; set_iterate((s), &(i), (void**)&(e)); )
|
||||
|
||||
#define SET_FOREACH_MOVE(e, d, s) \
|
||||
for (; ({ e = set_first(s); assert_se(!e || set_move_one(d, s, e) >= 0); e; }); )
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free_free);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user