if (tdb->global_lock.count) {
return 0;
}
- if (tdb->have_transaction_lock) {
- tdb->have_transaction_lock++;
+ if (tdb->transaction_lock_count > 0) {
+ tdb->transaction_lock_count++;
return 0;
}
+
if (tdb->methods->tdb_brlock(tdb, TRANSACTION_LOCK, ltype,
F_SETLKW, 0, 1) == -1) {
TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_transaction_lock: failed to get transaction lock\n"));
tdb->ecode = TDB_ERR_LOCK;
return -1;
}
- tdb->have_transaction_lock++;
+ tdb->transaction_lock_count++;
return 0;
}
*/
int tdb_transaction_unlock(struct tdb_context *tdb)
{
+ int ret;
if (tdb->global_lock.count) {
return 0;
}
- if (--tdb->have_transaction_lock) {
+ if (tdb->transaction_lock_count > 1) {
+ tdb->transaction_lock_count--;
return 0;
}
- return tdb->methods->tdb_brlock(tdb, TRANSACTION_LOCK, F_UNLCK, F_SETLKW, 0, 1);
+ ret = tdb->methods->tdb_brlock(tdb, TRANSACTION_LOCK, F_UNLCK, F_SETLKW, 0, 1);
+ if (ret == 0) {
+ tdb->transaction_lock_count = 0;
+ }
+ return ret;
}