X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb%2Flock.c;h=bcd560d792231ff2defce3430cf6feb7117fa243;hp=2bb6ddb88385a56de4ca48d57ea4c5f07eb6317f;hb=f26355f247709f0150028ec48df7d3f2af463423;hpb=e1f11b7b1e39ceb092155ba742b34f0785d88d06 diff --git a/ccan/tdb/lock.c b/ccan/tdb/lock.c index 2bb6ddb8..bcd560d7 100644 --- a/ccan/tdb/lock.c +++ b/ccan/tdb/lock.c @@ -301,7 +301,11 @@ 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) { + if (tdb->global_lock.count) { + return 0; + } + if (tdb->have_transaction_lock) { + tdb->have_transaction_lock++; return 0; } if (tdb->methods->tdb_brlock(tdb, TRANSACTION_LOCK, ltype, @@ -310,7 +314,7 @@ int tdb_transaction_lock(struct tdb_context *tdb, int ltype) tdb->ecode = TDB_ERR_LOCK; return -1; } - tdb->have_transaction_lock = 1; + tdb->have_transaction_lock++; return 0; } @@ -319,15 +323,13 @@ int tdb_transaction_lock(struct tdb_context *tdb, int ltype) */ int tdb_transaction_unlock(struct tdb_context *tdb) { - int ret; - if (!tdb->have_transaction_lock) { + if (tdb->global_lock.count) { return 0; } - ret = tdb->methods->tdb_brlock(tdb, TRANSACTION_LOCK, F_UNLCK, F_SETLKW, 0, 1); - if (ret == 0) { - tdb->have_transaction_lock = 0; + if (--tdb->have_transaction_lock) { + return 0; } - return ret; + return tdb->methods->tdb_brlock(tdb, TRANSACTION_LOCK, F_UNLCK, F_SETLKW, 0, 1); } @@ -413,21 +415,21 @@ static int _tdb_unlockall(struct tdb_context *tdb, int ltype) /* lock entire database with write lock */ int tdb_lockall(struct tdb_context *tdb) { - tdb_trace(tdb, "tdb_lockall\n"); + tdb_trace(tdb, "tdb_lockall"); return _tdb_lockall(tdb, F_WRLCK, F_SETLKW); } /* lock entire database with write lock - mark only */ int tdb_lockall_mark(struct tdb_context *tdb) { - tdb_trace(tdb, "tdb_lockall_mark\n"); + tdb_trace(tdb, "tdb_lockall_mark"); return _tdb_lockall(tdb, F_WRLCK | TDB_MARK_LOCK, F_SETLKW); } /* unlock entire database with write lock - unmark only */ int tdb_lockall_unmark(struct tdb_context *tdb) { - tdb_trace(tdb, "tdb_lockall_unmark\n"); + tdb_trace(tdb, "tdb_lockall_unmark"); return _tdb_unlockall(tdb, F_WRLCK | TDB_MARK_LOCK); } @@ -435,21 +437,21 @@ int tdb_lockall_unmark(struct tdb_context *tdb) int tdb_lockall_nonblock(struct tdb_context *tdb) { int ret = _tdb_lockall(tdb, F_WRLCK, F_SETLK); - tdb_trace(tdb, "tdb_lockall_nonblock = %i\n", ret); + tdb_trace_ret(tdb, "tdb_lockall_nonblock", ret); return ret; } /* unlock entire database with write lock */ int tdb_unlockall(struct tdb_context *tdb) { - tdb_trace(tdb, "tdb_unlockall\n"); + tdb_trace(tdb, "tdb_unlockall"); return _tdb_unlockall(tdb, F_WRLCK); } /* lock entire database with read lock */ int tdb_lockall_read(struct tdb_context *tdb) { - tdb_trace(tdb, "tdb_lockall_read\n"); + tdb_trace(tdb, "tdb_lockall_read"); return _tdb_lockall(tdb, F_RDLCK, F_SETLKW); } @@ -457,14 +459,14 @@ int tdb_lockall_read(struct tdb_context *tdb) int tdb_lockall_read_nonblock(struct tdb_context *tdb) { int ret = _tdb_lockall(tdb, F_RDLCK, F_SETLK); - tdb_trace(tdb, "tdb_lockall_read_nonblock = %i\n", ret); + tdb_trace_ret(tdb, "tdb_lockall_read_nonblock", ret); return ret; } /* unlock entire database with read lock */ int tdb_unlockall_read(struct tdb_context *tdb) { - tdb_trace(tdb, "tdb_unlockall_read\n"); + tdb_trace(tdb, "tdb_unlockall_read"); return _tdb_unlockall(tdb, F_RDLCK); } @@ -472,10 +474,9 @@ int tdb_unlockall_read(struct tdb_context *tdb) contention - it cannot guarantee how many records will be locked */ int tdb_chainlock(struct tdb_context *tdb, TDB_DATA key) { - tdb_trace(tdb, "tdb_chainlock "); - tdb_trace_record(tdb, key); - tdb_trace(tdb, "\n"); - return tdb_lock(tdb, BUCKET(tdb->hash_fn(&key)), F_WRLCK); + int ret = tdb_lock(tdb, BUCKET(tdb->hash_fn(&key)), F_WRLCK); + tdb_trace_1rec(tdb, "tdb_chainlock", key); + return ret; } /* lock/unlock one hash chain, non-blocking. This is meant to be used @@ -484,56 +485,45 @@ int tdb_chainlock(struct tdb_context *tdb, TDB_DATA key) int tdb_chainlock_nonblock(struct tdb_context *tdb, TDB_DATA key) { int ret = tdb_lock_nonblock(tdb, BUCKET(tdb->hash_fn(&key)), F_WRLCK); - tdb_trace(tdb, "tdb_chainlock_nonblock "); - tdb_trace_record(tdb, key); - tdb_trace(tdb, "= %i\n", ret); + tdb_trace_1rec_ret(tdb, "tdb_chainlock_nonblock", key, ret); return ret; } /* mark a chain as locked without actually locking it. Warning! use with great caution! */ int tdb_chainlock_mark(struct tdb_context *tdb, TDB_DATA key) { - tdb_trace(tdb, "tdb_chainlock_mark "); - tdb_trace_record(tdb, key); - tdb_trace(tdb, "\n"); - return tdb_lock(tdb, BUCKET(tdb->hash_fn(&key)), F_WRLCK | TDB_MARK_LOCK); + int ret = tdb_lock(tdb, BUCKET(tdb->hash_fn(&key)), F_WRLCK | TDB_MARK_LOCK); + tdb_trace_1rec(tdb, "tdb_chainlock_mark", key); + return ret; } /* unmark a chain as locked without actually locking it. Warning! use with great caution! */ int tdb_chainlock_unmark(struct tdb_context *tdb, TDB_DATA key) { - tdb_trace(tdb, "tdb_chainlock_unmark "); - tdb_trace_record(tdb, key); - tdb_trace(tdb, "\n"); + tdb_trace_1rec(tdb, "tdb_chainlock_unmark", key); return tdb_unlock(tdb, BUCKET(tdb->hash_fn(&key)), F_WRLCK | TDB_MARK_LOCK); } int tdb_chainunlock(struct tdb_context *tdb, TDB_DATA key) { - tdb_trace(tdb, "tdb_chainunlock "); - tdb_trace_record(tdb, key); - tdb_trace(tdb, "\n"); + tdb_trace_1rec(tdb, "tdb_chainunlock", key); return tdb_unlock(tdb, BUCKET(tdb->hash_fn(&key)), F_WRLCK); } int tdb_chainlock_read(struct tdb_context *tdb, TDB_DATA key) { - tdb_trace(tdb, "tdb_chainlock_read "); - tdb_trace_record(tdb, key); - tdb_trace(tdb, "\n"); - return tdb_lock(tdb, BUCKET(tdb->hash_fn(&key)), F_RDLCK); + int ret; + ret = tdb_lock(tdb, BUCKET(tdb->hash_fn(&key)), F_RDLCK); + tdb_trace_1rec(tdb, "tdb_chainlock_read", key); + return ret; } int tdb_chainunlock_read(struct tdb_context *tdb, TDB_DATA key) { - tdb_trace(tdb, "tdb_chainunlock_read "); - tdb_trace_record(tdb, key); - tdb_trace(tdb, "\n"); + tdb_trace_1rec(tdb, "tdb_chainunlock_read", key); return tdb_unlock(tdb, BUCKET(tdb->hash_fn(&key)), F_RDLCK); } - - /* record lock stops delete underneath */ int tdb_lock_record(struct tdb_context *tdb, tdb_off_t off) {