diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2010-02-24 10:44:40 +1030 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2010-02-24 10:44:40 +1030 |
commit | 4738d474c412cc59d26fcea64007e99094e8b675 (patch) | |
tree | 55aa258bf0407202be6f8ba0e5d387cb7f9d1a2c /lib/tdb/common/lock.c | |
parent | 9136818df30c7179e1cffa18201cdfc990ebd7b7 (diff) | |
download | samba-4738d474c412cc59d26fcea64007e99094e8b675.tar.gz samba-4738d474c412cc59d26fcea64007e99094e8b675.tar.bz2 samba-4738d474c412cc59d26fcea64007e99094e8b675.zip |
tdb: use tdb_nest_lock() for active lock.
Use our newly-generic nested lock tracking for the active lock.
Note that the tdb_have_extra_locks() and tdb_release_extra_locks()
functions have to skip over this lock now it is tracked.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'lib/tdb/common/lock.c')
-rw-r--r-- | lib/tdb/common/lock.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/tdb/common/lock.c b/lib/tdb/common/lock.c index 6f5799a819..19b92d9ae0 100644 --- a/lib/tdb/common/lock.c +++ b/lib/tdb/common/lock.c @@ -675,6 +675,11 @@ bool tdb_have_extra_locks(struct tdb_context *tdb) return true; } + /* We always hold the active lock if CLEAR_IF_FIRST. */ + if (find_nestlock(tdb, ACTIVE_LOCK)) { + extra--; + } + /* In a transaction, we expect to hold the transaction lock */ if (tdb->transaction && find_nestlock(tdb, TRANSACTION_LOCK)) { extra--; @@ -698,8 +703,11 @@ void tdb_release_extra_locks(struct tdb_context *tdb) for (i=0;i<tdb->num_lockrecs;i++) { struct tdb_lock_type *lck = &tdb->lockrecs[i]; + /* Don't release transaction or active locks! */ if (tdb->transaction && lck->off == TRANSACTION_LOCK) { tdb->lockrecs[extra++] = *lck; + } else if (lck->off == ACTIVE_LOCK) { + tdb->lockrecs[extra++] = *lck; } else { tdb_brunlock(tdb, lck->ltype, lck->off, 1); } |