X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb%2Flock.c;h=326d38e70713443f86aa45e821b20e883d3df44a;hb=059678ec4216112f96d8ad992ec7c0b8a6e3b80b;hp=117596a3f203814daa9e4611d96b1216de050643;hpb=83a1386b50966eb9667478c7cef9154dbd622541;p=ccan diff --git a/ccan/tdb/lock.c b/ccan/tdb/lock.c index 117596a3..326d38e7 100644 --- a/ccan/tdb/lock.c +++ b/ccan/tdb/lock.c @@ -301,17 +301,21 @@ int tdb_unlock(struct tdb_context *tdb, int list, int ltype) */ int tdb_transaction_lock(struct tdb_context *tdb, int ltype) { - if (tdb->have_transaction_lock || tdb->global_lock.count) { - tdb->have_transaction_lock++; + if (tdb->global_lock.count) { + return 0; + } + 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; } @@ -320,10 +324,19 @@ int tdb_transaction_lock(struct tdb_context *tdb, int ltype) */ int tdb_transaction_unlock(struct tdb_context *tdb) { - if (--tdb->have_transaction_lock) { + int ret; + if (tdb->global_lock.count) { + return 0; + } + 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; }