]> git.ozlabs.org Git - ccan/commitdiff
tdb2: make internal coalesce() function return length coalesced.
authorRusty Russell <rusty@rustcorp.com.au>
Fri, 25 Mar 2011 04:23:23 +0000 (14:53 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Fri, 25 Mar 2011 04:23:23 +0000 (14:53 +1030)
This makes life easier for the next patch.

ccan/tdb2/free.c
ccan/tdb2/test/run-03-coalesce.c

index c03680cfd943557d883daeee50b5ede41b707e75..eaaeb3cf2bca594d8294ac9a25b533d45d671eea 100644 (file)
@@ -333,10 +333,10 @@ static tdb_off_t ftable_offset(struct tdb_context *tdb, unsigned int ftable)
        return off;
 }
 
-/* Note: we unlock the current bucket if we coalesce or fail. */
-static tdb_bool_err coalesce(struct tdb_context *tdb,
-                            tdb_off_t off, tdb_off_t b_off,
-                            tdb_len_t data_len)
+/* Note: we unlock the current bucket if we coalesce (> 0) or fail (-ve). */
+static tdb_len_t coalesce(struct tdb_context *tdb,
+                         tdb_off_t off, tdb_off_t b_off,
+                         tdb_len_t data_len)
 {
        tdb_off_t end;
        struct tdb_free_record rec;
@@ -414,7 +414,7 @@ static tdb_bool_err coalesce(struct tdb_context *tdb,
 
        /* Didn't find any adjacent free? */
        if (end == off + sizeof(struct tdb_used_record) + data_len)
-               return false;
+               return 0;
 
        /* OK, expand initial record */
        ecode = tdb_read_convert(tdb, off, &rec, sizeof(rec));
@@ -453,7 +453,8 @@ static tdb_bool_err coalesce(struct tdb_context *tdb,
        if (ecode != TDB_SUCCESS) {
                return ecode;
        }
-       return true;
+       /* Return usable length. */
+       return end - off - sizeof(struct tdb_used_record);
 
 err:
        /* To unify error paths, we *always* unlock bucket on error. */
@@ -506,9 +507,8 @@ again:
 
        while (off) {
                const struct tdb_free_record *r;
-               tdb_len_t len;
+               tdb_len_t len, coal;
                tdb_off_t next;
-               int coal;
 
                r = tdb_access_read(tdb, off, sizeof(*r), true);
                if (TDB_PTR_IS_ERR(r)) {
@@ -544,14 +544,14 @@ again:
 
                /* Since we're going slow anyway, try coalescing here. */
                coal = coalesce(tdb, off, b_off, len);
-               if (coal == 1) {
-                       /* This has unlocked list, restart. */
-                       goto again;
-               }
-               if (coal < 0) {
+               if (TDB_OFF_IS_ERR(coal)) {
                        /* This has already unlocked on error. */
                        return coal;
                }
+               if (coal > 0) {
+                       /* This has unlocked list, restart. */
+                       goto again;
+               }
                off = next;
        }
 
index 0b544f8c1f758f286b0e7a5fd90862e7e47d94a8..cecd7eb2c250359db9c0dd8727e340cc8b6dbdac 100644 (file)
@@ -91,7 +91,8 @@ int main(int argc, char *argv[])
        b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024));
        /* Lock and coalesce. */
        ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0);
-       ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024) == 1);
+       ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024)
+           == 1024 + sizeof(struct tdb_used_record) + 2048);
        ok1(tdb->file->allrecord_lock.count == 0 && tdb->file->num_lockrecs == 0);
        ok1(free_record_length(tdb, layout->elem[1].base.off)
            == 1024 + sizeof(struct tdb_used_record) + 2048);
@@ -114,7 +115,8 @@ int main(int argc, char *argv[])
        b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024));
        /* Lock and coalesce. */
        ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0);
-       ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024) == 1);
+       ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024)
+           == 1024 + sizeof(struct tdb_used_record) + 512);
        ok1(tdb->file->allrecord_lock.count == 0 && tdb->file->num_lockrecs == 0);
        ok1(free_record_length(tdb, layout->elem[1].base.off)
            == 1024 + sizeof(struct tdb_used_record) + 512);
@@ -138,7 +140,9 @@ int main(int argc, char *argv[])
        b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024));
        /* Lock and coalesce. */
        ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0);
-       ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024) == 1);
+       ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024) ==
+           1024 + sizeof(struct tdb_used_record) + 512
+           + sizeof(struct tdb_used_record) + 256);
        ok1(tdb->file->allrecord_lock.count == 0
            && tdb->file->num_lockrecs == 0);
        ok1(free_record_length(tdb, layout->elem[1].base.off)