From: Marek VavruĊĦa Date: Tue, 7 Jul 2015 23:28:53 +0000 (+0200) Subject: lib: faster rdata iterators X-Git-Tag: v1.0.0-beta1~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dacc510fb35e69387279fb2a13d564bfe6023b75;p=thirdparty%2Fknot-resolver.git lib: faster rdata iterators --- diff --git a/lib/cache.c b/lib/cache.c index 2022d07d7..4e168d95f 100644 --- a/lib/cache.c +++ b/lib/cache.c @@ -27,6 +27,7 @@ #include "lib/cache.h" #include "lib/defines.h" +#include "lib/utils.h" /* Key size */ #define KEY_HSIZE (1 + sizeof(uint16_t)) @@ -274,20 +275,22 @@ int kr_cache_materialize(knot_rrset_t *dst, const knot_rrset_t *src, uint32_t dr return kr_error(ENOMEM); } - knot_rdata_t *rd = knot_rdataset_at(&src->rrs, 0); - knot_rdata_t *rd_dst = NULL; + /* Copy valid records */ + knot_rdata_t *rd = src->rrs.data; for (uint16_t i = 0; i < src->rrs.rr_count; ++i) { if (knot_rdata_ttl(rd) >= drift) { - /* Append record */ if (knot_rdataset_add(&dst->rrs, rd, mm) != 0) { knot_rrset_clear(dst, mm); return kr_error(ENOMEM); } - /* Fixup TTL time drift */ - rd_dst = knot_rdataset_at(&dst->rrs, dst->rrs.rr_count - 1); - knot_rdata_set_ttl(rd_dst, knot_rdata_ttl(rd) - drift); } - rd += knot_rdata_array_size(knot_rdata_rdlen(rd)); + rd = kr_rdataset_next(rd); + } + /* Fixup TTL by time passed */ + rd = dst->rrs.data; + for (uint16_t i = 0; i < dst->rrs.rr_count; ++i) { + knot_rdata_set_ttl(rd, knot_rdata_ttl(rd) - drift); + rd = kr_rdataset_next(rd); } return kr_ok(); @@ -310,11 +313,12 @@ int kr_cache_insert_rr(struct kr_cache_txn *txn, const knot_rrset_t *rr, uint32_ .ttl = 0, .count = rr->rrs.rr_count }; + knot_rdata_t *rd = rr->rrs.data; for (uint16_t i = 0; i < rr->rrs.rr_count; ++i) { - knot_rdata_t *rd = knot_rdataset_at(&rr->rrs, i); if (knot_rdata_ttl(rd) > header.ttl) { header.ttl = knot_rdata_ttl(rd); } + rd = kr_rdataset_next(rd); } namedb_val_t data = { rr->rrs.data, knot_rdataset_size(&rr->rrs) }; diff --git a/lib/layer/iterate.c b/lib/layer/iterate.c index 127aa0352..da1b5a46f 100644 --- a/lib/layer/iterate.c +++ b/lib/layer/iterate.c @@ -150,7 +150,7 @@ static void follow_cname_chain(const knot_dname_t **cname, const knot_rrset_t *r static int update_nsaddr(const knot_rrset_t *rr, struct kr_query *query) { if (rr->type == KNOT_RRTYPE_A || rr->type == KNOT_RRTYPE_AAAA) { - const knot_rdata_t *rdata = knot_rdataset_at(&rr->rrs, 0); + const knot_rdata_t *rdata = rr->rrs.data; int ret = kr_zonecut_add(&query->zone_cut, rr->owner, rdata); if (ret != 0) { return KNOT_STATE_FAIL; diff --git a/lib/layer/pktcache.c b/lib/layer/pktcache.c index 4cac85a98..eb62571cb 100644 --- a/lib/layer/pktcache.c +++ b/lib/layer/pktcache.c @@ -45,13 +45,13 @@ static uint32_t limit_ttl(uint32_t ttl) static void adjust_ttl(knot_rrset_t *rr, uint32_t drift) { - knot_rdata_t *rd = knot_rdataset_at(&rr->rrs, 0); + knot_rdata_t *rd = rr->rrs.data; for (uint16_t i = 0; i < rr->rrs.rr_count; ++i) { uint32_t ttl = knot_rdata_ttl(rd); if (ttl >= drift) { knot_rdata_set_ttl(rd, ttl - drift); } - rd += knot_rdata_array_size(knot_rdata_rdlen(rd)); + rd = kr_rdataset_next(rd); } } @@ -148,13 +148,13 @@ static uint32_t packet_ttl(knot_pkt_t *pkt) if (rr->type == KNOT_RRTYPE_OPT || rr->type == KNOT_RRTYPE_TSIG) { continue; } - knot_rdata_t *rd = knot_rdataset_at(&rr->rrs, 0); + knot_rdata_t *rd = rr->rrs.data; for (uint16_t j = 0; j < rr->rrs.rr_count; ++j) { if (knot_rdata_ttl(rd) < ttl) { ttl = knot_rdata_ttl(rd); has_ttl = true; } - rd += knot_rdata_array_size(knot_rdata_rdlen(rd)); + rd = kr_rdataset_next(rd); } } } diff --git a/lib/utils.h b/lib/utils.h index 5c9f8a20f..963cc9a07 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -44,6 +44,9 @@ extern void _cleanup_fclose(FILE **p); knot_pkt_parse_question((pkt)); \ } while (0) +/** @internal Next RDATA shortcut. */ +#define kr_rdataset_next(rd) (rd + knot_rdata_array_size(knot_rdata_rdlen(rd))) + /** Concatenate N strings. */ char* kr_strcatdup(unsigned n, ...); diff --git a/lib/zonecut.c b/lib/zonecut.c index f3b361cd5..55d20c810 100644 --- a/lib/zonecut.c +++ b/lib/zonecut.c @@ -275,12 +275,12 @@ static void fetch_addr(struct kr_zonecut *cut, const knot_dname_t *ns, uint16_t return; } - knot_rdata_t *rd = knot_rdataset_at(&cached_rr.rrs, 0); + knot_rdata_t *rd = cached_rr.rrs.data; for (uint16_t i = 0; i < cached_rr.rrs.rr_count; ++i) { if (knot_rdata_ttl(rd) > timestamp) { (void) kr_zonecut_add(cut, ns, rd); } - rd += knot_rdata_array_size(knot_rdata_rdlen(rd)); + rd = kr_rdataset_next(rd); } }