};
static void
-rpz_detach(dns_rpz_zone_t **rpzp, dns_rpz_zones_t *rpzs);
+rpz_detach(dns_rpz_zone_t **rpzp);
+
+static void
+rpz_detach_rpzs(dns_rpz_zones_t **rpzsp);
#if 0
/*
isc_mutex_init(&zones->maint_lock);
isc_refcount_init(&zones->refs, 1);
+ isc_refcount_init(&zones->irefs, 1);
zones->rps_cstr = rps_cstr;
zones->rps_cstr_size = rps_cstr_size;
dns_rbt_destroy(&zones->rbt);
cleanup_rbt:
- INSIST(isc_refcount_decrement(&zones->refs) > 0);
+ INSIST(isc_refcount_decrement(&zones->irefs) == 1);
+ isc_refcount_destroy(&zones->irefs);
+ INSIST(isc_refcount_decrement(&zones->refs) == 1);
isc_refcount_destroy(&zones->refs);
isc_mutex_destroy(&zones->maint_lock);
zone->updb = NULL;
zone->updbversion = NULL;
zone->updbit = NULL;
+ isc_refcount_increment(&rpzs->irefs);
zone->rpzs = rpzs;
zone->db_registered = false;
zone->addsoa = true;
INSIST(isc_refcount_decrement(&zone->refs) > 0);
isc_refcount_destroy(&zone->refs);
- isc_mem_put(zone->rpzs->mctx, zone, sizeof(*zone));
+ isc_mem_put(rpzs->mctx, zone, sizeof(*zone));
return (result);
}
isc_ht_destroy(&rpz->newnodes);
dns_db_closeversion(rpz->updb, &rpz->updbversion, false);
dns_db_detach(&rpz->updb);
- rpz_detach(&rpz, rpz->rpzs);
+ rpz_detach(&rpz);
}
static void
isc_ht_destroy(&rpz->newnodes);
dns_db_closeversion(rpz->updb, &rpz->updbversion, false);
dns_db_detach(&rpz->updb);
- rpz_detach(&rpz, rpz->rpzs);
+ rpz_detach(&rpz);
}
/*
* before discarding the overall rpz structure.
*/
static void
-rpz_detach(dns_rpz_zone_t **rpzp, dns_rpz_zones_t *rpzs) {
+rpz_detach(dns_rpz_zone_t **rpzp) {
dns_rpz_zone_t *rpz;
+ dns_rpz_zones_t *rpzs;
REQUIRE(rpzp != NULL && *rpzp != NULL);
isc_refcount_destroy(&rpz->refs);
+ rpzs = rpz->rpzs;
+ rpz->rpzs = NULL;
+
if (dns_name_dynamic(&rpz->origin)) {
dns_name_free(&rpz->origin, rpzs->mctx);
}
isc_timer_detach(&rpz->updatetimer);
isc_ht_destroy(&rpz->nodes);
+
isc_mem_put(rpzs->mctx, rpz, sizeof(*rpz));
+ rpz_detach_rpzs(&rpzs);
}
void
dns_rpz_zone_t *rpz = rpzs->zones[rpz_num];
rpzs->zones[rpz_num] = NULL;
if (rpz != NULL) {
- rpz_detach(&rpz, rpzs);
+ rpz_detach(&rpz);
}
}
+ rpz_detach_rpzs(&rpzs);
+ }
+}
+
+static void
+rpz_detach_rpzs(dns_rpz_zones_t **rpzsp) {
+ REQUIRE(rpzsp != NULL && *rpzsp != NULL);
+ dns_rpz_zones_t *rpzs = *rpzsp;
+ *rpzsp = NULL;
+ if (isc_refcount_decrement(&rpzs->irefs) == 1) {
if (rpzs->rps_cstr_size != 0) {
#ifdef USE_DNSRPS
librpz->client_detach(&rpzs->rps_client);