mirror of
https://github.com/isc-projects/bind9.git
synced 2026-02-25 10:59:35 -05: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
1 changed files with 14 additions and 26 deletions
|
|
@ -15,7 +15,7 @@
|
|||
* 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
|
||||
|
|
@ -1239,27 +1239,6 @@ inc_adb_erefcnt(dns_adb_t *adb) {
|
|||
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
|
||||
inc_entry_refcnt(dns_adb_t *adb, dns_adbentry_t *entry, isc_boolean_t lock) {
|
||||
int bucket;
|
||||
|
|
@ -2367,17 +2346,26 @@ dns_adb_attach(dns_adb_t *adb, dns_adb_t **adbx) {
|
|||
void
|
||||
dns_adb_detach(dns_adb_t **adbx) {
|
||||
dns_adb_t *adb;
|
||||
isc_boolean_t zeroerefcnt;
|
||||
|
||||
REQUIRE(adbx != NULL && DNS_ADB_VALID(*adbx));
|
||||
|
||||
adb = *adbx;
|
||||
*adbx = NULL;
|
||||
|
||||
LOCK(&adb->lock);
|
||||
dec_adb_erefcnt(adb, ISC_FALSE);
|
||||
if (adb->erefcnt == 0)
|
||||
INSIST(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);
|
||||
UNLOCK(&adb->lock);
|
||||
UNLOCK(&adb->lock);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Reference in a new issue