]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/io.c
tdb2: clarify locking heirarchy; hashes, freelist, then expand lock.
[ccan] / ccan / tdb2 / io.c
index 6cb1bdda6d5e68646dfe81976b73477f47445902..2bcee8a29a17665edf3a08a6b6264bdb7c446322 100644 (file)
@@ -48,8 +48,7 @@ void tdb_mmap(struct tdb_context *tdb)
        if (tdb->flags & TDB_NOMMAP)
                return;
 
-       tdb->map_ptr = mmap(NULL, tdb->map_size, 
-                           PROT_READ|(tdb->read_only? 0:PROT_WRITE), 
+       tdb->map_ptr = mmap(NULL, tdb->map_size, tdb->mmap_flags,
                            MAP_SHARED, tdb->fd, 0);
 
        /*
@@ -73,9 +72,10 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t len, bool probe)
        struct stat st;
        int ret;
 
-       /* FIXME: We can't hold pointers during this: we could unmap! */
-       /* (We currently do this in traverse!) */
-//     assert(!tdb->direct_access || tdb_has_expansion_lock(tdb));
+       /* We can't hold pointers during this: we could unmap! */
+       assert(!tdb->direct_access
+              || (tdb->flags & TDB_NOLOCK)
+              || tdb_has_expansion_lock(tdb));
 
        if (len <= tdb->map_size)
                return 0;
@@ -161,25 +161,25 @@ void *tdb_convert(const struct tdb_context *tdb, void *buf, tdb_len_t size)
        return buf;
 }
 
-/* Return first non-zero offset in num offset array, or num. */
 /* FIXME: Return the off? */
-uint64_t tdb_find_nonzero_off(struct tdb_context *tdb, tdb_off_t off,
-                             uint64_t num)
+uint64_t tdb_find_nonzero_off(struct tdb_context *tdb,
+                             tdb_off_t base, uint64_t start, uint64_t end)
 {
        uint64_t i;
        const uint64_t *val;
 
        /* Zero vs non-zero is the same unconverted: minor optimization. */
-       val = tdb_access_read(tdb, off, num * sizeof(tdb_off_t), false);
+       val = tdb_access_read(tdb, base + start * sizeof(tdb_off_t),
+                             (end - start) * sizeof(tdb_off_t), false);
        if (!val)
-               return num;
+               return end;
 
-       for (i = 0; i < num; i++) {
+       for (i = 0; i < (end - start); i++) {
                if (val[i])
                        break;
        }
        tdb_access_release(tdb, val);
-       return i;
+       return start + i;
 }
 
 /* Return first zero offset in num offset array, or num. */