mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-10 09:49:59 -04:00
Extract heap deregistration
This commit changes the deregistration of vecheaders from the heap to go through a private api instead of the dyndb public one. This is safe since vecheader is only used by qpzone. This is done in order to facilitate further refactoring.
This commit is contained in:
parent
f6e9998c3c
commit
0683d76025
2 changed files with 15 additions and 1 deletions
|
|
@ -68,6 +68,9 @@
|
|||
|
||||
#define HEADERNODE(h) ((qpznode_t *)((h)->node))
|
||||
|
||||
/* Forward declaration */
|
||||
static void deletedata(dns_dbnode_t *node, void *data);
|
||||
|
||||
#define QPDB_ATTR_LOADED 0x01
|
||||
#define QPDB_ATTR_LOADING 0x02
|
||||
|
||||
|
|
@ -832,6 +835,7 @@ clean_multiple_headers(dns_vectop_t *top) {
|
|||
|
||||
if (header->serial == parent_serial || IGNORE(header)) {
|
||||
ISC_SLIST_PTR_REMOVE(p, header, next_header);
|
||||
deletedata(header->node, header);
|
||||
dns_vecheader_destroy(&header);
|
||||
} else {
|
||||
parent_serial = header->serial;
|
||||
|
|
@ -855,6 +859,7 @@ clean_multiple_versions(dns_vectop_t *top, uint32_t least_serial) {
|
|||
dns_vecheader_t *header = *p;
|
||||
if (header->serial < least_serial) {
|
||||
ISC_SLIST_PTR_REMOVE(p, header, next_header);
|
||||
deletedata(header->node, header);
|
||||
dns_vecheader_destroy(&header);
|
||||
} else {
|
||||
multiple = true;
|
||||
|
|
@ -1846,6 +1851,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename,
|
|||
* alone. It will get cleaned up when
|
||||
* clean_zone_node() runs.
|
||||
*/
|
||||
deletedata(newheader->node, newheader);
|
||||
dns_vecheader_destroy(&newheader);
|
||||
newheader = merged;
|
||||
dns_vecheader_reset(newheader,
|
||||
|
|
@ -1870,6 +1876,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename,
|
|||
header->typepair),
|
||||
"updating", qpdb->maxrrperset);
|
||||
}
|
||||
deletedata(newheader->node, newheader);
|
||||
dns_vecheader_destroy(&newheader);
|
||||
return result;
|
||||
}
|
||||
|
|
@ -1896,6 +1903,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename,
|
|||
maybe_update_recordsandsize(false, version, header,
|
||||
nodename->length);
|
||||
|
||||
deletedata(header->node, header);
|
||||
dns_vecheader_destroy(&header);
|
||||
} else {
|
||||
if (RESIGN(newheader)) {
|
||||
|
|
@ -1922,6 +1930,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename,
|
|||
* If we're trying to delete the type, don't bother.
|
||||
*/
|
||||
if (!EXISTS(newheader)) {
|
||||
deletedata(newheader->node, newheader);
|
||||
dns_vecheader_destroy(&newheader);
|
||||
return DNS_R_UNCHANGED;
|
||||
}
|
||||
|
|
@ -1957,6 +1966,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename,
|
|||
if (qpdb->maxtypepername > 0 &&
|
||||
ntypes >= qpdb->maxtypepername)
|
||||
{
|
||||
deletedata(newheader->node, newheader);
|
||||
dns_vecheader_destroy(&newheader);
|
||||
return DNS_R_TOOMANYRECORDS;
|
||||
}
|
||||
|
|
@ -4920,6 +4930,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
|
|||
&subresult);
|
||||
}
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
deletedata(newheader->node, newheader);
|
||||
dns_vecheader_destroy(&newheader);
|
||||
newheader = subresult;
|
||||
dns_vecheader_reset(newheader, (dns_dbnode_t *)node);
|
||||
|
|
@ -4952,6 +4963,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
|
|||
* This subtraction would remove all of the rdata;
|
||||
* add a nonexistent header instead.
|
||||
*/
|
||||
deletedata(newheader->node, newheader);
|
||||
dns_vecheader_destroy(&newheader);
|
||||
newheader = dns_vecheader_new(db->mctx,
|
||||
(dns_dbnode_t *)node);
|
||||
|
|
@ -4961,6 +4973,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
|
|||
DNS_VECHEADERATTR_NONEXISTENT);
|
||||
newheader->serial = version->serial;
|
||||
} else {
|
||||
deletedata(newheader->node, newheader);
|
||||
dns_vecheader_destroy(&newheader);
|
||||
goto unlock;
|
||||
}
|
||||
|
|
@ -4981,6 +4994,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
|
|||
* The rdataset doesn't exist, so we don't need to do anything
|
||||
* to satisfy the deletion request.
|
||||
*/
|
||||
deletedata(newheader->node, newheader);
|
||||
dns_vecheader_destroy(&newheader);
|
||||
if ((options & DNS_DBSUB_EXACT) != 0) {
|
||||
result = DNS_R_NOTEXACT;
|
||||
|
|
@ -5575,6 +5589,7 @@ static void
|
|||
destroy_qpznode(qpznode_t *node) {
|
||||
ISC_SLIST_FOREACH(top, node->next_type, next_type) {
|
||||
ISC_SLIST_FOREACH(header, top->headers, next_header) {
|
||||
deletedata(header->node, header);
|
||||
dns_vecheader_destroy(&header);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -821,7 +821,6 @@ dns_vecheader_destroy(dns_vecheader_t **headerp) {
|
|||
*headerp = NULL;
|
||||
|
||||
isc_mem_t *mctx = header->node->mctx;
|
||||
dns_db_deletedata(header->node, header);
|
||||
|
||||
if (EXISTS(header)) {
|
||||
size = dns_rdatavec_size(header);
|
||||
|
|
|
|||
Loading…
Reference in a new issue