]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add dns_diff_appendlist
authorAlessio Podda <alessio@isc.org>
Mon, 11 May 2026 14:42:21 +0000 (16:42 +0200)
committerAlessio Podda <alessio@isc.org>
Tue, 2 Jun 2026 11:44:32 +0000 (13:44 +0200)
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.

lib/dns/diff.c
lib/dns/include/dns/diff.h
lib/dns/journal.c
lib/dns/update.c
lib/dns/xfrin.c
lib/ns/update.c

index 495bc53d8e9689eab818cb401413538d9488aec9..0a714b09d313cf9f41b61b0edf6d8d19b349503e 100644 (file)
@@ -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));
index 1b76a6509d07462a14e395ac4c35134016949e73..a0b9fca71074dd0c47729e91a21761c1fff8b4ef 100644 (file)
@@ -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);
 /*%<
index 603d6fffa6fc15fd9109634516a6f68bcb74ad19..a0cb90344401a4d68ec16ab103956bfc8a5bb367 100644 (file)
@@ -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;
                }
index b0088d864ff71eba754a70630c822c68691d5f6b..7ad3df8eabe1669a4cbdaa2088ea1f303e2df0cb 100644 (file)
@@ -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) {
index 2c55369d5b164fb75ad484c92a72f0dce18f1437..3ff1a41c7baf94e0d17ea8c8afd24546ecc6c74e 100644 (file)
@@ -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);
index 536fdc04505ebbea206524a4f669c35aaa63c343..2ddd32801b6bd2b5a22e667a86cb030cf0b80e90 100644 (file)
@@ -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;