tdb: cleanup: tdb_release_extra_locks() helper
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 22 Feb 2010 03:04:29 +0000 (13:34 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 22 Feb 2010 03:04:29 +0000 (13:34 +1030)
Move locking intelligence back into lock.c.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/tdb/lock.c
ccan/tdb/tdb_private.h
ccan/tdb/transaction.c

index 4f8970fd34bc4e7766e2748e2bbf077ad76a5f97..3013b06af6ec855477b0991422a2948bf7b69359 100644 (file)
@@ -702,3 +702,23 @@ bool tdb_have_extra_locks(struct tdb_context *tdb)
        }
        return false;
 }
+
+/* The transaction code uses this to remove all locks. */
+void tdb_release_extra_locks(struct tdb_context *tdb)
+{
+       unsigned int i;
+
+       if (tdb->allrecord_lock.count != 0) {
+               tdb_brunlock(tdb, tdb->allrecord_lock.ltype,
+                            FREELIST_TOP, 4*tdb->header.hash_size);
+               tdb->allrecord_lock.count = 0;
+       }
+
+       for (i=0;i<tdb->num_lockrecs;i++) {
+               tdb_brunlock(tdb, tdb->lockrecs[i].ltype,
+                            tdb->lockrecs[i].off, 1);
+       }
+       tdb->num_locks = 0;
+       tdb->num_lockrecs = 0;
+       SAFE_FREE(tdb->lockrecs);
+}
index ed88723c99e5d4307bbdc8d0864b6f94dd68b455..0661ceff3af03d061534d93a814cef00d7a33371 100644 (file)
@@ -267,6 +267,7 @@ int tdb_brlock(struct tdb_context *tdb,
 int tdb_brunlock(struct tdb_context *tdb,
                 int rw_type, tdb_off_t offset, size_t len);
 bool tdb_have_extra_locks(struct tdb_context *tdb);
+void tdb_release_extra_locks(struct tdb_context *tdb);
 int tdb_transaction_lock(struct tdb_context *tdb, int ltype);
 int tdb_transaction_unlock(struct tdb_context *tdb, int ltype);
 int tdb_brlock_upgrade(struct tdb_context *tdb, tdb_off_t offset, size_t len);
index 04e4bbcd2e574820cf2edbde0e0c2233a2952960..81103ed8a019bf441a7b85353c23db61c7489744 100644 (file)
@@ -509,23 +509,7 @@ int _tdb_transaction_cancel(struct tdb_context *tdb, int ltype)
                tdb->transaction->open_lock_taken = false;
        }
 
-       /* remove any global lock created during the transaction */
-       if (tdb->allrecord_lock.count != 0) {
-               tdb_brunlock(tdb, tdb->allrecord_lock.ltype,
-                            FREELIST_TOP, 4*tdb->header.hash_size);
-               tdb->allrecord_lock.count = 0;
-       }
-
-       /* remove any locks created during the transaction */
-       if (tdb->num_locks != 0) {
-               for (i=0;i<tdb->num_lockrecs;i++) {
-                       tdb_brunlock(tdb, tdb->lockrecs[i].ltype,
-                                    tdb->lockrecs[i].off, 1);
-               }
-               tdb->num_locks = 0;
-               tdb->num_lockrecs = 0;
-               SAFE_FREE(tdb->lockrecs);
-       }
+       tdb_release_extra_locks(tdb);
 
        /* restore the normal io methods */
        tdb->methods = tdb->transaction->io_methods;