mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-29 13:38:26 +00:00
Partial fix for RT #2053. The potential for deadlock still exists,
but it is much less likely to occur because we now only take the ADB lock when the external reference count reaches zero, not every time it is decremented. Althought this does not actually fix the bug, it at least lets us make progress on testing fixes for other bugs affecting shutdown of multithreaded servers.
This commit is contained in:
parent
08e4f1ac94
commit
ca50fa0230
@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: adb.c,v 1.191 2001/11/12 19:05:10 gson Exp $ */
|
/* $Id: adb.c,v 1.192 2001/11/14 22:32:10 gson Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Implementation notes
|
* Implementation notes
|
||||||
@ -1239,27 +1239,6 @@ inc_adb_erefcnt(dns_adb_t *adb) {
|
|||||||
UNLOCK(&adb->reflock);
|
UNLOCK(&adb->reflock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
dec_adb_erefcnt(dns_adb_t *adb, isc_boolean_t lock) {
|
|
||||||
isc_boolean_t zeroerefcnt;
|
|
||||||
|
|
||||||
if (lock)
|
|
||||||
LOCK(&adb->lock);
|
|
||||||
|
|
||||||
INSIST(adb->erefcnt > 0);
|
|
||||||
|
|
||||||
LOCK(&adb->reflock);
|
|
||||||
adb->erefcnt--;
|
|
||||||
zeroerefcnt = ISC_TF(adb->erefcnt == 0);
|
|
||||||
UNLOCK(&adb->reflock);
|
|
||||||
|
|
||||||
if (zeroerefcnt)
|
|
||||||
check_exit(adb);
|
|
||||||
|
|
||||||
if (lock)
|
|
||||||
UNLOCK(&adb->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
inc_entry_refcnt(dns_adb_t *adb, dns_adbentry_t *entry, isc_boolean_t lock) {
|
inc_entry_refcnt(dns_adb_t *adb, dns_adbentry_t *entry, isc_boolean_t lock) {
|
||||||
int bucket;
|
int bucket;
|
||||||
@ -2367,17 +2346,26 @@ dns_adb_attach(dns_adb_t *adb, dns_adb_t **adbx) {
|
|||||||
void
|
void
|
||||||
dns_adb_detach(dns_adb_t **adbx) {
|
dns_adb_detach(dns_adb_t **adbx) {
|
||||||
dns_adb_t *adb;
|
dns_adb_t *adb;
|
||||||
|
isc_boolean_t zeroerefcnt;
|
||||||
|
|
||||||
REQUIRE(adbx != NULL && DNS_ADB_VALID(*adbx));
|
REQUIRE(adbx != NULL && DNS_ADB_VALID(*adbx));
|
||||||
|
|
||||||
adb = *adbx;
|
adb = *adbx;
|
||||||
*adbx = NULL;
|
*adbx = NULL;
|
||||||
|
|
||||||
LOCK(&adb->lock);
|
INSIST(adb->erefcnt > 0);
|
||||||
dec_adb_erefcnt(adb, ISC_FALSE);
|
|
||||||
if (adb->erefcnt == 0)
|
LOCK(&adb->reflock);
|
||||||
|
adb->erefcnt--;
|
||||||
|
zeroerefcnt = ISC_TF(adb->erefcnt == 0);
|
||||||
|
UNLOCK(&adb->reflock);
|
||||||
|
|
||||||
|
if (zeroerefcnt) {
|
||||||
|
LOCK(&adb->lock);
|
||||||
|
check_exit(adb);
|
||||||
INSIST(adb->shutting_down);
|
INSIST(adb->shutting_down);
|
||||||
UNLOCK(&adb->lock);
|
UNLOCK(&adb->lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user