diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2010-02-17 15:42:15 +1030 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2010-02-17 15:42:15 +1030 |
commit | fca1621965c547e2d076eca2a2599e9629f91266 (patch) | |
tree | 94abacb92dfa97c70e2137e9a2a6b63f2c73938c /lib/tdb/common/tdb_private.h | |
parent | caaf5c6baa1a4f340c1f38edd99b3a8b56621b8b (diff) | |
download | samba-fca1621965c547e2d076eca2a2599e9629f91266.tar.gz samba-fca1621965c547e2d076eca2a2599e9629f91266.tar.bz2 samba-fca1621965c547e2d076eca2a2599e9629f91266.zip |
tdb: tdb_allrecord_lock/tdb_allrecord_unlock/tdb_allrecord_upgrade
Centralize locking of all chains of the tdb; rename _tdb_lockall to
tdb_allrecord_lock and _tdb_unlockall to tdb_allrecord_unlock, and
tdb_brlock_upgrade to tdb_allrecord_upgrade.
Then we use this in the transaction code. Unfortunately, if the transaction
code records that it has grabbed the allrecord lock read-only, write locks
will fail, so we treat this upgradable lock as a write lock, and mark it
as upgradable using the otherwise-unused offset field.
One subtlety: now the transaction code is using the allrecord_lock, the
tdb_release_extra_locks() function drops it for us, so we no longer need
to do it manually in _tdb_transaction_cancel.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'lib/tdb/common/tdb_private.h')
-rw-r--r-- | lib/tdb/common/tdb_private.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/tdb/common/tdb_private.h b/lib/tdb/common/tdb_private.h index 0ac37dfa5d..013c2f022e 100644 --- a/lib/tdb/common/tdb_private.h +++ b/lib/tdb/common/tdb_private.h @@ -191,7 +191,7 @@ struct tdb_context { int read_only; /* opened read-only */ int traverse_read; /* read-only traversal */ int traverse_write; /* read-write traversal */ - struct tdb_lock_type allrecord_lock; + struct tdb_lock_type allrecord_lock; /* .offset == upgradable */ int num_lockrecs; struct tdb_lock_type *lockrecs; /* only real locks, all with count>0 */ enum TDB_ERROR ecode; /* error code for last tdb error */ @@ -236,7 +236,10 @@ bool tdb_have_extra_locks(struct tdb_context *tdb); void tdb_release_extra_locks(struct tdb_context *tdb); int tdb_transaction_lock(struct tdb_context *tdb, int ltype); int tdb_transaction_unlock(struct tdb_context *tdb, int ltype); -int tdb_brlock_upgrade(struct tdb_context *tdb, tdb_off_t offset, size_t len); +int tdb_allrecord_lock(struct tdb_context *tdb, int ltype, + enum tdb_lock_flags flags, bool upgradable); +int tdb_allrecord_unlock(struct tdb_context *tdb, int ltype, bool mark_lock); +int tdb_allrecord_upgrade(struct tdb_context *tdb); int tdb_write_lock_record(struct tdb_context *tdb, tdb_off_t off); int tdb_write_unlock_record(struct tdb_context *tdb, tdb_off_t off); int tdb_ofs_read(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d); |