tdb-compat: Add tdb_chainlock_nonblock
authorVolker Lendecke <vl@samba.org>
Mon, 16 Apr 2012 13:23:06 +0000 (15:23 +0200)
committerVolker Lendecke <vl@samba.org>
Tue, 17 Apr 2012 08:20:59 +0000 (10:20 +0200)
lib/tdb_compat/tdb_compat.c
lib/tdb_compat/tdb_compat.h

index 0406eff55e4d0b33d798d41c11fb218a18bef451..7fd3caf6b5acc53a930b3a1471efaea45b4cabb1 100644 (file)
@@ -38,6 +38,30 @@ enum TDB_ERROR tdb_transaction_start_nonblock(struct tdb_context *tdb)
        return ecode;
 }
 
+enum TDB_ERROR tdb_chainlock_nonblock(struct tdb_context *tdb, TDB_DATA key)
+{
+       union tdb_attribute locking, orig;
+       enum TDB_ERROR ecode;
+
+       orig.base.attr = TDB_ATTRIBUTE_FLOCK;
+       ecode = tdb_get_attribute(tdb, &orig);
+       if (ecode != TDB_SUCCESS)
+               return ecode;
+
+       /* Replace locking function with our own. */
+       locking = orig;
+       locking.flock.data = &orig;
+       locking.flock.lock = lock_nonblock;
+
+       ecode = tdb_set_attribute(tdb, &locking);
+       if (ecode != TDB_SUCCESS)
+               return ecode;
+
+       ecode = tdb_chainlock(tdb, key);
+       tdb_unset_attribute(tdb, TDB_ATTRIBUTE_FLOCK);
+       return ecode;
+}
+
 /* For TDB1 tdbs, read traverse vs normal matters: write traverse
    locks the entire thing! */
 int64_t tdb_traverse_read_(struct tdb_context *tdb,
index 0d58075c80f5a34d75f47bcb9fbc9207cbb1bdb5..e0a2bf8e5e99f991618474989eb75b8e3a83769b 100644 (file)
@@ -87,6 +87,8 @@ int tdb_reopen_all(int parent_longlived);
 
 /* tdb2 does nonblocking functions via attibutes. */
 enum TDB_ERROR tdb_transaction_start_nonblock(struct tdb_context *tdb);
+enum TDB_ERROR tdb_chainlock_nonblock(struct tdb_context *tdb, TDB_DATA key);
+
 
 /* Convenient (typesafe) wrapper for tdb open with logging */
 #define tdb_open_compat(name, hsize, tdb_fl, open_fl, mode, log_fn, log_data) \