}; \
_result; \
})
+#define NODE_FORCEUPGRADE(l, tp) \
+ { \
+ if (NODE_TRYUPGRADE(l, tp) != ISC_R_SUCCESS) { \
+ NODE_UNLOCK(l, tp); \
+ NODE_WRLOCK(l, tp); \
+ } \
+ }
typedef isc_rwlock_t treelock_t;
}; \
_result; \
})
+#define TREE_FORCEUPGRADE(l, tp) \
+ { \
+ if (TREE_TRYUPGRADE(l, tp) != ISC_R_SUCCESS) { \
+ TREE_UNLOCK(l, tp); \
+ TREE_WRLOCK(l, tp); \
+ } \
+ }
#else /* DNS_RBTDB_STRONG_RWLOCK_CHECK */
}; \
_result; \
})
+#define NODE_FORCEUPGRADE(l, tp) \
+ { \
+ if (NODE_TRYUPGRADE(l, tp) != ISC_R_SUCCESS) { \
+ NODE_UNLOCK(l, tp); \
+ NODE_WRLOCK(l, tp); \
+ } \
+ }
typedef isc_rwlock_t treelock_t;
}; \
_result; \
})
+#define TREE_FORCEUPGRADE(l, tp) \
+ { \
+ if (TREE_TRYUPGRADE(l, tp) != ISC_R_SUCCESS) { \
+ TREE_UNLOCK(l, tp); \
+ TREE_WRLOCK(l, tp); \
+ } \
+ }
#endif
/*
* Upgrade the lock and test if we still need to unlink.
*/
- if (NODE_TRYUPGRADE(nodelock, &nlocktype) != ISC_R_SUCCESS) {
- NODE_UNLOCK(nodelock, &nlocktype);
- NODE_WRLOCK(nodelock, &nlocktype);
- }
+ NODE_FORCEUPGRADE(nodelock, &nlocktype);
POST(nlocktype);
if (ISC_LINK_LINKED(node, deadlink)) {
ISC_LIST_UNLINK(rbtdb->deadnodes[node->locknum], node,
/* Upgrade the lock? */
if (*nlocktypep == isc_rwlocktype_read) {
- if (NODE_TRYUPGRADE(&nodelock->lock, nlocktypep) !=
- ISC_R_SUCCESS)
- {
- NODE_UNLOCK(&nodelock->lock, nlocktypep);
- NODE_WRLOCK(&nodelock->lock, nlocktypep);
- }
+ NODE_FORCEUPGRADE(&nodelock->lock, nlocktypep);
}
if (isc_refcount_decrement(&node->references) > 1) {
/*
* Try to upgrade the lock and if that fails unlock then relock.
*/
- if (TREE_TRYUPGRADE(&rbtdb->tree_lock, &tlocktype) !=
- ISC_R_SUCCESS)
- {
- TREE_UNLOCK(&rbtdb->tree_lock, &tlocktype);
- TREE_WRLOCK(&rbtdb->tree_lock, &tlocktype);
- }
+ TREE_FORCEUPGRADE(&rbtdb->tree_lock, &tlocktype);
node = NULL;
result = dns_rbt_addnode(tree, name, &node);
if (result == ISC_R_SUCCESS) {
need_headerupdate(foundsig, search->now)))
{
if (nlocktype != isc_rwlocktype_write) {
- if (NODE_TRYUPGRADE(lock, &nlocktype) !=
- ISC_R_SUCCESS)
- {
- NODE_UNLOCK(lock, &nlocktype);
- NODE_WRLOCK(lock, &nlocktype);
- }
+ NODE_FORCEUPGRADE(lock, &nlocktype);
POST(nlocktype);
}
if (need_headerupdate(found, search->now)) {
if ((update != NULL || updatesig != NULL) &&
nlocktype != isc_rwlocktype_write)
{
- if (NODE_TRYUPGRADE(lock, &nlocktype) != ISC_R_SUCCESS) {
- NODE_UNLOCK(lock, &nlocktype);
- NODE_WRLOCK(lock, &nlocktype);
- }
+ NODE_FORCEUPGRADE(lock, &nlocktype);
POST(nlocktype);
}
if (update != NULL && need_headerupdate(update, search.now)) {
(foundsig != NULL && need_headerupdate(foundsig, search.now)))
{
if (nlocktype != isc_rwlocktype_write) {
- if (NODE_TRYUPGRADE(lock, &nlocktype) != ISC_R_SUCCESS)
- {
- NODE_UNLOCK(lock, &nlocktype);
- NODE_WRLOCK(lock, &nlocktype);
- }
+ NODE_FORCEUPGRADE(lock, &nlocktype);
POST(nlocktype);
}
if (need_headerupdate(found, search.now)) {