+1129. [bug] Multithreaded servers could crash under heavy
+ resolution load due to a race condition. [RT #2018]
+
1126. [bug] The server could access a freed event if shut
down while a client start event was pending
delivery. [RT #2061]
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rbtdb.c,v 1.168 2001/08/27 03:58:44 marka Exp $ */
+/* $Id: rbtdb.c,v 1.168.2.1 2001/11/16 11:04:38 marka Exp $ */
/*
* Principal Author: Bob Halley
{
isc_result_t result;
isc_boolean_t write_locked;
- isc_boolean_t reacquire;
unsigned int locknum;
/*
/*
* 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);
result == ISC_R_LOCKBUSY);
write_locked = ISC_TF(result == ISC_R_SUCCESS);
-
} else
write_locked = ISC_TRUE;
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