#define NODE_LOCK(l, t) RWLOCK((l), (t))
#define NODE_UNLOCK(l, t) RWUNLOCK((l), (t))
#define NODE_TRYUPGRADE(l) isc_rwlock_tryupgrade(l)
-#define NODE_DOWNGRADE(l) isc_rwlock_downgrade(l)
+#define NODE_DOWNGRADE(l) isc_rwlock_downgrade(l)
/*%
* Whether to rate-limit updating the LRU to avoid possible thread contention.
* this is deferred until closeversion() is called.
*/
if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) {
- RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write);
- iszonesecure(db, rbtdb->current_version, rbtdb->origin_node);
- RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
+ RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read);
+ version = rbtdb->current_version;
+ RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read);
+ iszonesecure(db, version, rbtdb->origin_node);
}
return (result);
* this is deferred until closeversion() is called.
*/
if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) {
- RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write);
- iszonesecure(db, rbtdb->current_version, rbtdb->origin_node);
- RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
+ RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read);
+ version = rbtdb->current_version;
+ RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read);
+ iszonesecure(db, version, rbtdb->origin_node);
}
return (result);
* zone key, we consider the zone secure.
*/
if (! IS_CACHE(rbtdb) && rbtdb->origin_node != NULL) {
- iszonesecure(db, rbtdb->current_version, rbtdb->origin_node);
+ dns_dbversion_t *version = rbtdb->current_version;
+ RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
+ iszonesecure(db, version, rbtdb->origin_node);
+ } else {
+ RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
}
- RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
callbacks->add = NULL;
callbacks->add_private = NULL;