From db40c6bfdf7af9fdad106285467a412b1758b1a3 Mon Sep 17 00:00:00 2001 From: Andreas Gustafsson Date: Fri, 16 Nov 2001 00:17:07 +0000 Subject: [PATCH] don't unlock the node lock in no_references() [RT #2018] --- lib/dns/rbtdb.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index bfecdf78b7..54ee6fd51e 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.172 2001/11/12 19:05:27 gson Exp $ */ +/* $Id: rbtdb.c,v 1.173 2001/11/16 00:17:07 gson Exp $ */ /* * Principal Author: Bob Halley @@ -766,7 +766,6 @@ no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, { isc_result_t result; isc_boolean_t write_locked; - isc_boolean_t reacquire; unsigned int locknum; /* @@ -806,15 +805,12 @@ no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, /* * XXXDCL need to add a deferred delete method for ISC_R_LOCKBUSY. */ - reacquire = ISC_FALSE; if (lock != isc_rwlocktype_write) { /* - * Free the node lock before acquiring a tree write lock, per - * the lock hierarchy rules stated at the start of this file. + * Locking hierarchy notwithstanding, we don't need to free + * the node lock before acquiring the tree write lock because + * we only do a trylock. */ - UNLOCK(&rbtdb->node_locks[locknum].lock); - reacquire = ISC_TRUE; - if (lock == isc_rwlocktype_read) RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); @@ -824,7 +820,6 @@ no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, result == ISC_R_LOCKBUSY); write_locked = ISC_TF(result == ISC_R_SUCCESS); - } else write_locked = ISC_TRUE; @@ -857,12 +852,6 @@ no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, if (lock == isc_rwlocktype_read) RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - - /* - * Reacquire the node lock that the caller held if necessary. - */ - if (reacquire) - LOCK(&rbtdb->node_locks[locknum].lock); } static inline void