dns_dbnode_t **targetp DNS__DB_FLARG);
void (*detachnode)(dns_dbnode_t **targetp DNS__DB_FLARG);
- void (*deletedata)(dns_dbnode_t *node, void *data);
void (*expiredata)(dns_dbnode_t *node, void *data);
} dns_dbnode_methods_t;
* node 'node' as expired.
*/
-void
-dns_db_deletedata(dns_dbnode_t *node, void *data);
-/*%<
- * Tell the database to prepare to delete the block of data 'data'
- * stored at node 'node. This may include, for example, removing the
- * data from an LRU list or a heap.
- */
-
void
dns_db_setmaxrrperset(dns_db_t *db, uint32_t value);
/*%<
static void
qpcnode_detachnode(dns_dbnode_t **nodep DNS__DB_FLARG);
static void
-qpcnode_deletedata(dns_dbnode_t *node, void *data);
-static void
qpcnode_expiredata(dns_dbnode_t *node, void *data);
static dns_dbnode_methods_t qpcnode_methods = (dns_dbnode_methods_t){
.attachnode = qpcnode_attachnode,
.detachnode = qpcnode_detachnode,
- .deletedata = qpcnode_deletedata,
.expiredata = qpcnode_expiredata,
};
* DB Routines
*/
+static void
+header_cleanup(dns_dbnode_t *node ISC_ATTR_UNUSED, void *data);
+
static void
clean_cache_headers(dns_slabtop_t *top) {
dns_slabheader_t *parent = first_header(top);
dns_slabheader_t *header = next_header(parent), *header_next = NULL;
cds_list_for_each_entry_safe_from(header, header_next, &top->headers,
headers_link) {
- cds_list_del(&header->headers_link);
+ header_cleanup(header->node, header);
dns_slabheader_detach(&header);
}
}
if (!EXISTS(header) || ANCIENT(header) ||
(STALE(header) && !KEEPSTALE(qpdb)))
{
- cds_list_del(&header->headers_link);
+ header_cleanup(header->node, header);
dns_slabheader_detach(&header);
}
DNS_SLABHEADER_SETATTR(newheader, DNS_SLABHEADERATTR_OPTOUT);
}
if (rdataset->attributes.noqname) {
- CHECK(addnoqname(qpnode->mctx, newheader, qpdb->maxrrperset,
+ CHECK(addnoqname(newheader->mctx, newheader, qpdb->maxrrperset,
rdataset));
}
if (rdataset->attributes.closest) {
- CHECK(addclosest(qpnode->mctx, newheader, qpdb->maxrrperset,
+ CHECK(addclosest(newheader->mctx, newheader, qpdb->maxrrperset,
rdataset));
}
}
static void
-qpcnode_deletedata(dns_dbnode_t *node ISC_ATTR_UNUSED, void *data) {
+header_cleanup(dns_dbnode_t *node ISC_ATTR_UNUSED, void *data) {
dns_slabheader_t *header = data;
qpcache_t *qpdb = HEADERNODE(header)->qpdb;
+ cds_list_del(&header->headers_link);
+
if (ISC_LINK_LINKED(header, dirtylink)) {
ISC_LIST_UNLINK(HEADERNODE(header)->dirty, header, dirtylink);
}
*/
update_rrsetstats(qpdb->rrsetstats, header->typepair,
atomic_load_acquire(&header->attributes), false);
-
- if (header->noqname != NULL) {
- dns_slabheader_freeproof(qpdb->common.mctx, &header->noqname);
- }
- if (header->closest != NULL) {
- dns_slabheader_freeproof(qpdb->common.mctx, &header->closest);
- }
}
static void
cds_list_for_each_entry_safe(header, header_next, &top->headers,
headers_link)
{
- cds_list_del(&header->headers_link);
+ header_cleanup(header->node, header);
dns_slabheader_detach(&header);
}