summaryrefslogtreecommitdiff
path: root/lib/tdb/common/transaction.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2010-03-26 13:18:33 +0100
committerSimo Sorce <idra@samba.org>2010-03-26 14:27:47 -0400
commit261c3b4f1beed820647061bacbee3acccbcbb089 (patch)
tree224c955ab144d8114f0405c2545d95239e122fbe /lib/tdb/common/transaction.c
parentd570a0af0be442d6d1e253309d9bbae9562669cf (diff)
downloadsamba-261c3b4f1beed820647061bacbee3acccbcbb089.tar.gz
samba-261c3b4f1beed820647061bacbee3acccbcbb089.tar.bz2
samba-261c3b4f1beed820647061bacbee3acccbcbb089.zip
tdb: Add a non-blocking version of tdb_transaction_start
Diffstat (limited to 'lib/tdb/common/transaction.c')
-rw-r--r--lib/tdb/common/transaction.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/tdb/common/transaction.c b/lib/tdb/common/transaction.c
index 504d0f681a..304a03fa38 100644
--- a/lib/tdb/common/transaction.c
+++ b/lib/tdb/common/transaction.c
@@ -421,7 +421,8 @@ static const struct tdb_methods transaction_methods = {
start a tdb transaction. No token is returned, as only a single
transaction is allowed to be pending per tdb_context
*/
-int tdb_transaction_start(struct tdb_context *tdb)
+static int _tdb_transaction_start(struct tdb_context *tdb,
+ enum tdb_lock_flags lockflags)
{
/* some sanity checks */
if (tdb->read_only || (tdb->flags & TDB_INTERNAL) || tdb->traverse_read) {
@@ -473,9 +474,12 @@ int tdb_transaction_start(struct tdb_context *tdb)
/* get the transaction write lock. This is a blocking lock. As
discussed with Volker, there are a number of ways we could
make this async, which we will probably do in the future */
- if (tdb_transaction_lock(tdb, F_WRLCK) == -1) {
+ if (tdb_transaction_lock(tdb, F_WRLCK, lockflags) == -1) {
SAFE_FREE(tdb->transaction->blocks);
SAFE_FREE(tdb->transaction);
+ if ((lockflags & TDB_LOCK_WAIT) == 0) {
+ tdb->ecode = TDB_ERR_NOLOCK;
+ }
return -1;
}
@@ -525,6 +529,15 @@ fail_allrecord_lock:
return -1;
}
+int tdb_transaction_start(struct tdb_context *tdb)
+{
+ return _tdb_transaction_start(tdb, TDB_LOCK_WAIT);
+}
+
+int tdb_transaction_start_nonblock(struct tdb_context *tdb)
+{
+ return _tdb_transaction_start(tdb, TDB_LOCK_NOWAIT|TDB_LOCK_PROBE);
+}
/*
sync to disk