Part1: make zt->references an isc_refcount_t

This commit is contained in:
Witold Kręcicki
2019-05-16 18:14:55 +02:00
parent 9be6f98c13
commit d31fcfbbad
+9 -30
View File
@@ -47,7 +47,7 @@ struct dns_zt {
struct zt_load_params *loadparams;
/* Locked by lock. */
bool flush;
uint32_t references;
isc_refcount_t references;
unsigned int loads_pending;
dns_rbt_t *table;
};
@@ -93,7 +93,7 @@ dns_zt_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, dns_zt_t **ztp) {
zt->mctx = NULL;
isc_mem_attach(mctx, &zt->mctx);
zt->references = 1;
isc_refcount_init(&zt->references, 1);
zt->flush = false;
zt->rdclass = rdclass;
zt->magic = ZTMAGIC;
@@ -209,14 +209,8 @@ dns_zt_attach(dns_zt_t *zt, dns_zt_t **ztp) {
REQUIRE(VALID_ZT(zt));
REQUIRE(ztp != NULL && *ztp == NULL);
RWLOCK(&zt->rwlock, isc_rwlocktype_write);
INSIST(zt->references > 0);
zt->references++;
INSIST(zt->references != 0);
RWUNLOCK(&zt->rwlock, isc_rwlocktype_write);
isc_refcount_increment(&zt->references);
*ztp = zt;
}
@@ -244,20 +238,9 @@ zt_flushanddetach(dns_zt_t **ztp, bool need_flush) {
REQUIRE(ztp != NULL && VALID_ZT(*ztp));
zt = *ztp;
RWLOCK(&zt->rwlock, isc_rwlocktype_write);
INSIST(zt->references > 0);
zt->references--;
if (zt->references == 0)
destroy = true;
if (need_flush)
zt->flush = true;
RWUNLOCK(&zt->rwlock, isc_rwlocktype_write);
if (destroy)
if (isc_refcount_decrement(&zt->references) == 1) {
zt_destroy(zt);
}
*ztp = NULL;
}
@@ -340,15 +323,13 @@ asyncload(dns_zone_t *zone, void *zt_) {
isc_result_t result;
struct dns_zt *zt = (dns_zt_t*) zt_;
REQUIRE(zone != NULL);
INSIST(zt->references > 0);
zt->references++;
isc_refcount_increment(&zt->references);
zt->loads_pending++;
result = dns_zone_asyncload(zone, zt->loadparams->newonly, *zt->loadparams->dl, zt);
if (result != ISC_R_SUCCESS) {
zt->references--;
isc_refcount_decrement(&zt->references);
zt->loads_pending--;
INSIST(zt->references > 0);
}
return (ISC_R_SUCCESS);
}
@@ -548,9 +529,7 @@ doneloading(dns_zt_t *zt, dns_zone_t *zone, isc_task_t *task) {
RWLOCK(&zt->rwlock, isc_rwlocktype_write);
INSIST(zt->loads_pending != 0);
INSIST(zt->references != 0);
zt->references--;
if (zt->references == 0)
if (isc_refcount_decrement(&zt->references) == 1)
destroy = true;
zt->loads_pending--;
if (zt->loads_pending == 0) {