From: Alessio Podda Date: Mon, 11 May 2026 14:42:21 +0000 (+0200) Subject: Add dns_diff_appendlist X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a647010fb5cd14eb7b193670d32cfdf36f9cd00;p=thirdparty%2Fbind9.git Add dns_diff_appendlist dns_diff_appendlist() bulk-moves all tuples from one diff to another in O(1), replacing the repeated ISC_LIST_FOREACH + dns_diff_unlink + dns_diff_append loops. --- diff --git a/lib/dns/diff.c b/lib/dns/diff.c index 495bc53d8e9..0a714b09d31 100644 --- a/lib/dns/diff.c +++ b/lib/dns/diff.c @@ -154,6 +154,17 @@ dns_diff_prepend(dns_diff_t *diff, dns_difftuple_t **tuplep) { diff->size += 1; } +void +dns_diff_appendlist(dns_diff_t *dst, dns_diff_t *src) { + REQUIRE(DNS_DIFF_VALID(dst)); + REQUIRE(DNS_DIFF_VALID(src)); + + ISC_LIST_APPENDLIST(dst->tuples, src->tuples, link); + dst->size += src->size; + src->size = 0; + ENSURE(ISC_LIST_EMPTY(src->tuples)); +} + void dns_diff_unlink(dns_diff_t *diff, dns_difftuple_t *tuple) { REQUIRE(DNS_DIFF_VALID(diff)); diff --git a/lib/dns/include/dns/diff.h b/lib/dns/include/dns/diff.h index 1b76a6509d0..a0b9fca7107 100644 --- a/lib/dns/include/dns/diff.h +++ b/lib/dns/include/dns/diff.h @@ -201,6 +201,19 @@ dns_diff_prepend(dns_diff_t *diff, dns_difftuple_t **tuple); * \li The tuple has been freed, or will be freed when the diff is cleared. */ +void +dns_diff_appendlist(dns_diff_t *dst, dns_diff_t *src); +/*%< + * Move all tuples from 'src' to the end of 'dst'. + * + * Requires: + * \li 'dst' is a valid diff. + * \li 'src' is a valid diff. + * + * Ensures: + * \li 'src' is empty. + */ + void dns_diff_unlink(dns_diff_t *diff, dns_difftuple_t *tuple); /*%< diff --git a/lib/dns/journal.c b/lib/dns/journal.c index 603d6fffa6f..a0cb9034440 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -2262,10 +2262,7 @@ diff_namespace(dns_db_t *dba, dns_dbversion_t *dbvera, dns_db_t *dbb, for (i = 0; i < 2; i++) { if (!have[!i]) { - ISC_LIST_FOREACH(diff[i].tuples, tuple, link) { - dns_diff_unlink(&diff[i], tuple); - dns_diff_append(resultdiff, &tuple); - } + dns_diff_appendlist(resultdiff, &diff[i]); have[i] = false; goto next; } @@ -2274,18 +2271,12 @@ diff_namespace(dns_db_t *dba, dns_dbversion_t *dbvera, dns_db_t *dbb, t = dns_name_compare(dns_fixedname_name(&fixname[0]), dns_fixedname_name(&fixname[1])); if (t < 0) { - ISC_LIST_FOREACH(diff[0].tuples, tuple, link) { - dns_diff_unlink(&diff[0], tuple); - dns_diff_append(resultdiff, &tuple); - } + dns_diff_appendlist(resultdiff, &diff[0]); have[0] = false; continue; } if (t > 0) { - ISC_LIST_FOREACH(diff[1].tuples, tuple, link) { - dns_diff_unlink(&diff[1], tuple); - dns_diff_append(resultdiff, &tuple); - } + dns_diff_appendlist(resultdiff, &diff[1]); have[1] = false; continue; } diff --git a/lib/dns/update.c b/lib/dns/update.c index b0088d864ff..7ad3df8eabe 100644 --- a/lib/dns/update.c +++ b/lib/dns/update.c @@ -1543,10 +1543,7 @@ next_state: return DNS_R_CONTINUE; } } - ISC_LIST_FOREACH(state->work.tuples, t, link) { - dns_diff_unlink(&state->work, t); - dns_diff_append(diff, &t); - } + dns_diff_appendlist(diff, &state->work); update_log(log, zone, ISC_LOG_DEBUG(3), "updated data signatures"); @@ -1661,10 +1658,7 @@ next_state: CHECK(namelist_append_subdomain(db, &t->name, &state->affected)); } - ISC_LIST_FOREACH(state->diffnames.tuples, t, link) { - dns_diff_unlink(&state->diffnames, t); - dns_diff_append(&state->affected, &t); - } + dns_diff_appendlist(&state->affected, &state->diffnames); CHECK(uniqify_name_list(&state->affected)); @@ -1733,10 +1727,7 @@ next_state: return DNS_R_CONTINUE; } } - ISC_LIST_FOREACH(state->work.tuples, t, link) { - dns_diff_unlink(&state->work, t); - dns_diff_append(&state->affected, &t); - } + dns_diff_appendlist(&state->affected, &state->work); /* * Now we know which names are part of the NSEC chain. @@ -1811,10 +1802,7 @@ next_state: return DNS_R_CONTINUE; } } - ISC_LIST_FOREACH(state->work.tuples, t, link) { - dns_diff_unlink(&state->work, t); - dns_diff_append(&state->nsec_mindiff, &t); - } + dns_diff_appendlist(&state->nsec_mindiff, &state->work); FALLTHROUGH; case update_nsec3: state->state = update_nsec3; @@ -1944,10 +1932,7 @@ next_state: return DNS_R_CONTINUE; } } - ISC_LIST_FOREACH(state->work.tuples, t, link) { - dns_diff_unlink(&state->work, t); - dns_diff_append(&state->affected, &t); - } + dns_diff_appendlist(&state->affected, &state->work); /* * Minimize the set of NSEC3 updates so that we don't @@ -1989,10 +1974,7 @@ next_state: return DNS_R_CONTINUE; } } - ISC_LIST_FOREACH(state->work.tuples, t, link) { - dns_diff_unlink(&state->work, t); - dns_diff_append(&state->nsec_mindiff, &t); - } + dns_diff_appendlist(&state->nsec_mindiff, &state->work); /* Record our changes for the journal. */ ISC_LIST_FOREACH(state->sig_diff.tuples, t, link) { diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 2c55369d5b1..3ff1a41c7ba 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -698,10 +698,7 @@ ixfr_commit(dns_xfrin_t *xfr) { } dns_diff_init(xfr->mctx, &data->diff); - ISC_LIST_FOREACH(xfr->diff.tuples, tuple, link) { - dns_diff_unlink(&xfr->diff, tuple); - dns_diff_append(&data->diff, &tuple); - } + dns_diff_appendlist(&data->diff, &xfr->diff); (void)cds_wfcq_enqueue(&xfr->diff_head, &xfr->diff_tail, &data->wfcq_node); diff --git a/lib/ns/update.c b/lib/ns/update.c index 536fdc04505..2ddd32801b6 100644 --- a/lib/ns/update.c +++ b/lib/ns/update.c @@ -1173,14 +1173,8 @@ temp_check(isc_mem_t *mctx, dns_diff_t *temp, dns_db_t *db, * them yet because "name" still points into one * of them. Move them on a temporary list. */ - ISC_LIST_FOREACH(u_rrs.tuples, trash_tuple, link) { - dns_diff_unlink(&u_rrs, trash_tuple); - dns_diff_append(&trash, &trash_tuple); - } - ISC_LIST_FOREACH(d_rrs.tuples, trash_tuple, link) { - dns_diff_unlink(&d_rrs, trash_tuple); - dns_diff_append(&trash, &trash_tuple); - } + dns_diff_appendlist(&trash, &u_rrs); + dns_diff_appendlist(&trash, &d_rrs); dns_rdataset_disassociate(&rdataset); continue;