diff options
author | Michal Schmidt <mschmidt@redhat.com> | 2014-08-13 01:00:18 +0200 |
---|---|---|
committer | Michal Schmidt <mschmidt@redhat.com> | 2014-09-15 16:08:50 +0200 |
commit | d5099efc47d4e6ac60816b5381a5f607ab03f06e (patch) | |
tree | 661308aae8a0885e90da25874e7df3e795532356 /src/resolve | |
parent | f44541bc934c6e2b02155559e9eeb17a13a09558 (diff) |
hashmap: introduce hash_ops to make struct Hashmap smaller
It is redundant to store 'hash' and 'compare' function pointers in
struct Hashmap separately. The functions always comprise a pair.
Store a single pointer to struct hash_ops instead.
systemd keeps hundreds of hashmaps, so this saves a little bit of
memory.
Diffstat (limited to 'src/resolve')
-rw-r--r-- | src/resolve/resolved-dns-cache.c | 2 | ||||
-rw-r--r-- | src/resolve/resolved-dns-domain.c | 5 | ||||
-rw-r--r-- | src/resolve/resolved-dns-domain.h | 1 | ||||
-rw-r--r-- | src/resolve/resolved-dns-packet.c | 4 | ||||
-rw-r--r-- | src/resolve/resolved-dns-query.c | 4 | ||||
-rw-r--r-- | src/resolve/resolved-dns-rr.c | 9 | ||||
-rw-r--r-- | src/resolve/resolved-dns-rr.h | 4 | ||||
-rw-r--r-- | src/resolve/resolved-dns-scope.c | 2 | ||||
-rw-r--r-- | src/resolve/resolved-dns-server.c | 9 | ||||
-rw-r--r-- | src/resolve/resolved-dns-server.h | 3 | ||||
-rw-r--r-- | src/resolve/resolved-dns-transaction.c | 2 | ||||
-rw-r--r-- | src/resolve/resolved-dns-zone.c | 6 | ||||
-rw-r--r-- | src/resolve/resolved-link.c | 2 | ||||
-rw-r--r-- | src/resolve/resolved-manager.c | 4 |
14 files changed, 35 insertions, 22 deletions
diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c index 733ef6348d..33ca4d1a45 100644 --- a/src/resolve/resolved-dns-cache.c +++ b/src/resolve/resolved-dns-cache.c @@ -186,7 +186,7 @@ static int dns_cache_init(DnsCache *c) { if (r < 0) return r; - r = hashmap_ensure_allocated(&c->by_key, dns_resource_key_hash_func, dns_resource_key_compare_func); + r = hashmap_ensure_allocated(&c->by_key, &dns_resource_key_hash_ops); if (r < 0) return r; diff --git a/src/resolve/resolved-dns-domain.c b/src/resolve/resolved-dns-domain.c index 8ed1ecf0a4..e1eb3ddfe5 100644 --- a/src/resolve/resolved-dns-domain.c +++ b/src/resolve/resolved-dns-domain.c @@ -371,6 +371,11 @@ int dns_name_compare_func(const void *a, const void *b) { } } +const struct hash_ops dns_name_hash_ops = { + .hash = dns_name_hash_func, + .compare = dns_name_compare_func +}; + int dns_name_equal(const char *x, const char *y) { int r, q, k, w; diff --git a/src/resolve/resolved-dns-domain.h b/src/resolve/resolved-dns-domain.h index e674c5d9c5..0888a7846f 100644 --- a/src/resolve/resolved-dns-domain.h +++ b/src/resolve/resolved-dns-domain.h @@ -37,6 +37,7 @@ int dns_name_normalize(const char *s, char **_ret); unsigned long dns_name_hash_func(const void *s, const uint8_t hash_key[HASH_KEY_SIZE]); int dns_name_compare_func(const void *a, const void *b); +extern const struct hash_ops dns_name_hash_ops; int dns_name_equal(const char *x, const char *y); int dns_name_endswith(const char *name, const char *suffix); diff --git a/src/resolve/resolved-dns-packet.c b/src/resolve/resolved-dns-packet.c index 0d276df8c9..7375f77481 100644 --- a/src/resolve/resolved-dns-packet.c +++ b/src/resolve/resolved-dns-packet.c @@ -433,9 +433,7 @@ int dns_packet_append_name(DnsPacket *p, const char *name, goto fail; if (allow_compression) { - r = hashmap_ensure_allocated(&p->names, - dns_name_hash_func, - dns_name_compare_func); + r = hashmap_ensure_allocated(&p->names, &dns_name_hash_ops); if (r < 0) goto fail; diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c index 669595d7f9..f0483c9806 100644 --- a/src/resolve/resolved-dns-query.c +++ b/src/resolve/resolved-dns-query.c @@ -144,7 +144,7 @@ static int dns_query_add_transaction(DnsQuery *q, DnsScope *s, DnsResourceKey *k assert(q); assert(s); - r = set_ensure_allocated(&q->transactions, NULL, NULL); + r = set_ensure_allocated(&q->transactions, NULL); if (r < 0) return r; @@ -166,7 +166,7 @@ static int dns_query_add_transaction(DnsQuery *q, DnsScope *s, DnsResourceKey *k return r; } - r = set_ensure_allocated(&t->queries, NULL, NULL); + r = set_ensure_allocated(&t->queries, NULL); if (r < 0) goto gc; diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c index c5f7cb931e..fd5ecf413d 100644 --- a/src/resolve/resolved-dns-rr.c +++ b/src/resolve/resolved-dns-rr.c @@ -133,7 +133,7 @@ int dns_resource_key_match_cname(const DnsResourceKey *key, const DnsResourceRec return dns_name_equal(DNS_RESOURCE_KEY_NAME(rr->key), DNS_RESOURCE_KEY_NAME(key)); } -unsigned long dns_resource_key_hash_func(const void *i, const uint8_t hash_key[HASH_KEY_SIZE]) { +static unsigned long dns_resource_key_hash_func(const void *i, const uint8_t hash_key[HASH_KEY_SIZE]) { const DnsResourceKey *k = i; unsigned long ul; @@ -144,7 +144,7 @@ unsigned long dns_resource_key_hash_func(const void *i, const uint8_t hash_key[H return ul; } -int dns_resource_key_compare_func(const void *a, const void *b) { +static int dns_resource_key_compare_func(const void *a, const void *b) { const DnsResourceKey *x = a, *y = b; int ret; @@ -165,6 +165,11 @@ int dns_resource_key_compare_func(const void *a, const void *b) { return 0; } +const struct hash_ops dns_resource_key_hash_ops = { + .hash = dns_resource_key_hash_func, + .compare = dns_resource_key_compare_func +}; + int dns_resource_key_to_string(const DnsResourceKey *key, char **ret) { char cbuf[DECIMAL_STR_MAX(uint16_t)], tbuf[DECIMAL_STR_MAX(uint16_t)]; const char *c, *t; diff --git a/src/resolve/resolved-dns-rr.h b/src/resolve/resolved-dns-rr.h index 3222f1f0ee..9d9a89d383 100644 --- a/src/resolve/resolved-dns-rr.h +++ b/src/resolve/resolved-dns-rr.h @@ -159,8 +159,6 @@ DnsResourceKey* dns_resource_key_unref(DnsResourceKey *key); int dns_resource_key_equal(const DnsResourceKey *a, const DnsResourceKey *b); int dns_resource_key_match_rr(const DnsResourceKey *key, const DnsResourceRecord *rr); int dns_resource_key_match_cname(const DnsResourceKey *key, const DnsResourceRecord *rr); -unsigned long dns_resource_key_hash_func(const void *i, const uint8_t hash_key[HASH_KEY_SIZE]); -int dns_resource_key_compare_func(const void *a, const void *b); int dns_resource_key_to_string(const DnsResourceKey *key, char **ret); DEFINE_TRIVIAL_CLEANUP_FUNC(DnsResourceKey*, dns_resource_key_unref); @@ -175,3 +173,5 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(DnsResourceRecord*, dns_resource_record_unref); const char *dns_class_to_string(uint16_t type); int dns_class_from_string(const char *name, uint16_t *class); + +extern const struct hash_ops dns_resource_key_hash_ops; diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 039a754ff0..40d59922d1 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -709,7 +709,7 @@ int dns_scope_notify_conflict(DnsScope *scope, DnsResourceRecord *rr) { /* We don't send these queries immediately. Instead, we queue * them, and send them after some jitter delay. */ - r = hashmap_ensure_allocated(&scope->conflict_queue, dns_resource_key_hash_func, dns_resource_key_compare_func); + r = hashmap_ensure_allocated(&scope->conflict_queue, &dns_resource_key_hash_ops); if (r < 0) { log_oom(); return r; diff --git a/src/resolve/resolved-dns-server.c b/src/resolve/resolved-dns-server.c index c99768be4f..caf06fe450 100644 --- a/src/resolve/resolved-dns-server.c +++ b/src/resolve/resolved-dns-server.c @@ -100,7 +100,7 @@ DnsServer* dns_server_free(DnsServer *s) { return NULL; } -unsigned long dns_server_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) { +static unsigned long dns_server_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) { const DnsServer *s = p; uint64_t u; @@ -110,7 +110,7 @@ unsigned long dns_server_hash_func(const void *p, const uint8_t hash_key[HASH_KE return u; } -int dns_server_compare_func(const void *a, const void *b) { +static int dns_server_compare_func(const void *a, const void *b) { const DnsServer *x = a, *y = b; if (x->family < y->family) @@ -120,3 +120,8 @@ int dns_server_compare_func(const void *a, const void *b) { return memcmp(&x->address, &y->address, FAMILY_ADDRESS_SIZE(x->family)); } + +const struct hash_ops dns_server_hash_ops = { + .hash = dns_server_hash_func, + .compare = dns_server_compare_func +}; diff --git a/src/resolve/resolved-dns-server.h b/src/resolve/resolved-dns-server.h index f2361a8385..a438a27763 100644 --- a/src/resolve/resolved-dns-server.h +++ b/src/resolve/resolved-dns-server.h @@ -60,5 +60,4 @@ int dns_server_new( DnsServer* dns_server_free(DnsServer *s); -unsigned long dns_server_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]); -int dns_server_compare_func(const void *a, const void *b); +extern const struct hash_ops dns_server_hash_ops; diff --git a/src/resolve/resolved-dns-transaction.c b/src/resolve/resolved-dns-transaction.c index 990b1f2e43..74b0634142 100644 --- a/src/resolve/resolved-dns-transaction.c +++ b/src/resolve/resolved-dns-transaction.c @@ -78,7 +78,7 @@ int dns_transaction_new(DnsTransaction **ret, DnsScope *s, DnsQuestion *q) { assert(s); assert(q); - r = hashmap_ensure_allocated(&s->manager->dns_transactions, NULL, NULL); + r = hashmap_ensure_allocated(&s->manager->dns_transactions, NULL); if (r < 0) return r; diff --git a/src/resolve/resolved-dns-zone.c b/src/resolve/resolved-dns-zone.c index b53e957d76..8098ff5e70 100644 --- a/src/resolve/resolved-dns-zone.c +++ b/src/resolve/resolved-dns-zone.c @@ -126,11 +126,11 @@ static int dns_zone_init(DnsZone *z) { assert(z); - r = hashmap_ensure_allocated(&z->by_key, dns_resource_key_hash_func, dns_resource_key_compare_func); + r = hashmap_ensure_allocated(&z->by_key, &dns_resource_key_hash_ops); if (r < 0) return r; - r = hashmap_ensure_allocated(&z->by_name, dns_name_hash_func, dns_name_compare_func); + r = hashmap_ensure_allocated(&z->by_name, &dns_name_hash_ops); if (r < 0) return r; @@ -194,7 +194,7 @@ static int dns_zone_item_probe_start(DnsZoneItem *i) { return r; } - r = set_ensure_allocated(&t->zone_items, NULL, NULL); + r = set_ensure_allocated(&t->zone_items, NULL); if (r < 0) goto gc; diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c index f47017ced8..4def672214 100644 --- a/src/resolve/resolved-link.c +++ b/src/resolve/resolved-link.c @@ -33,7 +33,7 @@ int link_new(Manager *m, Link **ret, int ifindex) { assert(m); assert(ifindex > 0); - r = hashmap_ensure_allocated(&m->links, NULL, NULL); + r = hashmap_ensure_allocated(&m->links, NULL); if (r < 0) return r; diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 00aaffe448..63d7845387 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -737,11 +737,11 @@ int manager_write_resolv_conf(Manager *m) { manager_read_resolv_conf(m); /* Add the full list to a set, to filter out duplicates */ - dns = set_new(dns_server_hash_func, dns_server_compare_func); + dns = set_new(&dns_server_hash_ops); if (!dns) return -ENOMEM; - domains = set_new(dns_name_hash_func, dns_name_compare_func); + domains = set_new(&dns_name_hash_ops); if (!domains) return -ENOMEM; |