allow dbiterators to be paused at any time

This commit is contained in:
Andreas Gustafsson
2001-01-12 18:56:42 +00:00
parent a51f77a70b
commit 7cdd0b6ade
2 changed files with 12 additions and 8 deletions

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: dbiterator.h,v 1.15 2001/01/09 21:52:44 bwelling Exp $ */
/* $Id: dbiterator.h,v 1.16 2001/01/12 18:56:42 gson Exp $ */
#ifndef DNS_DBITERATOR_H
#define DNS_DBITERATOR_H 1
@@ -251,8 +251,6 @@ dns_dbiterator_pause(dns_dbiterator_t *iterator);
* Requires:
* 'iterator' is a valid iterator.
*
* 'iterator' has not been paused already.
*
* Ensures:
* Any database locks being held for efficiency of iterator access are
* released.

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: rbtdb.c,v 1.141 2001/01/09 21:51:14 bwelling Exp $ */
/* $Id: rbtdb.c,v 1.142 2001/01/12 18:56:40 gson Exp $ */
/*
* Principal Author: Bob Halley
@@ -260,6 +260,10 @@ static dns_dbiteratormethods_t dbiterator_methods = {
dbiterator_origin
};
/*
* If 'paused' is ISC_TRUE, we are holding a reference to 'node',
* and we are not holding any locks.
*/
typedef struct rbtdb_dbiterator {
dns_dbiterator_t common;
isc_boolean_t paused;
@@ -4659,8 +4663,8 @@ dbiterator_pause(dns_dbiterator_t *iterator) {
rbtdbiter->result != ISC_R_NOMORE)
return (rbtdbiter->result);
REQUIRE(!rbtdbiter->paused);
REQUIRE(rbtdbiter->tree_locked);
if (rbtdbiter->paused)
return (ISC_R_SUCCESS);
if (node != NULL) {
LOCK(&rbtdb->node_locks[node->locknum].lock);
@@ -4670,8 +4674,10 @@ dbiterator_pause(dns_dbiterator_t *iterator) {
rbtdbiter->paused = ISC_TRUE;
}
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
rbtdbiter->tree_locked = ISC_FALSE;
if (rbtdbiter->tree_locked) {
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
rbtdbiter->tree_locked = ISC_FALSE;
}
return (ISC_R_SUCCESS);
}