mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
Support for off-loop read-ony qp-trie transactions
It is sometimes necessary to access a qp-trie outside an isc_loop, such as in tests or an isc_work callback. The best option was to use a `dns_qpmulti_write()` transaction, but that has overheads that are not necessary for read-only access, such as committing a new version of the trie even when nothing changed. So this commit adds a `dns_qpmulti_read()` transaction, which is nearly as lightweight as a query transaction, but it takes the mutex like a write transaction.
This commit is contained in:
30
lib/dns/qp.c
30
lib/dns/qp.c
@@ -1282,12 +1282,31 @@ dns_qpmulti_query(dns_qpmulti_t *multi, dns_qpread_t *qp) {
|
||||
REQUIRE(QPMULTI_VALID(multi));
|
||||
REQUIRE(qp != NULL);
|
||||
|
||||
dns_qpmulti_t *whence = reader_open(multi, qp);
|
||||
INSIST(whence == multi);
|
||||
|
||||
/* we must be in an isc_loop thread */
|
||||
/* we MUST be in an isc_loop thread */
|
||||
qp->tid = isc_tid();
|
||||
REQUIRE(qp->tid != ISC_TID_UNKNOWN);
|
||||
|
||||
dns_qpmulti_t *whence = reader_open(multi, qp);
|
||||
INSIST(whence == multi);
|
||||
}
|
||||
|
||||
/*
|
||||
* a locked read takes the mutex
|
||||
*/
|
||||
|
||||
void
|
||||
dns_qpmulti_lockedread(dns_qpmulti_t *multi, dns_qpread_t *qp) {
|
||||
REQUIRE(QPMULTI_VALID(multi));
|
||||
REQUIRE(qp != NULL);
|
||||
|
||||
/* we MUST NOT be in an isc_loop thread */
|
||||
qp->tid = isc_tid();
|
||||
REQUIRE(qp->tid == ISC_TID_UNKNOWN);
|
||||
|
||||
LOCK(&multi->mutex);
|
||||
|
||||
dns_qpmulti_t *whence = reader_open(multi, qp);
|
||||
INSIST(whence == multi);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1295,6 +1314,9 @@ dns_qpread_destroy(dns_qpmulti_t *multi, dns_qpread_t *qp) {
|
||||
REQUIRE(QPMULTI_VALID(multi));
|
||||
REQUIRE(QP_VALID(qp));
|
||||
REQUIRE(qp->tid == isc_tid());
|
||||
if (qp->tid == ISC_TID_UNKNOWN) {
|
||||
UNLOCK(&multi->mutex);
|
||||
}
|
||||
*qp = (dns_qpread_t){};
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user