]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/private.h
tdb2: implement tdb_exists and tdb_parse_record
[ccan] / ccan / tdb2 / private.h
index 9ae5bed2e6bc6cb8c397d32d1f7f6f6ef8574930..4e7fc8ffeccaba5e2ab13348cf02a23bcbbb15bf 100644 (file)
@@ -300,7 +300,8 @@ enum tdb_lock_flags {
        TDB_LOCK_NOCHECK = 4,
 };
 
-struct tdb_lock_type {
+struct tdb_lock {
+       struct tdb_context *owner;
        uint32_t off;
        uint32_t count;
        uint32_t ltype;
@@ -319,13 +320,22 @@ struct tdb_file {
        /* Single list of all TDBs, to detect multiple opens. */
        struct tdb_file *next;
 
-       /* The file descriptor. */
+       /* How many are sharing us? */
+       unsigned int refcnt;
+
+       /* Mmap (if any), or malloc (for TDB_INTERNAL). */
+       void *map_ptr;
+
+       /* How much space has been mapped (<= current file size) */
+       tdb_len_t map_size;
+
+       /* The file descriptor (-1 for TDB_INTERNAL). */
        int fd;
 
        /* Lock information */
-       struct tdb_lock_type allrecord_lock;
+       struct tdb_lock allrecord_lock;
        size_t num_lockrecs;
-       struct tdb_lock_type *lockrecs;
+       struct tdb_lock *lockrecs;
 
        /* Identity of this file. */
        dev_t device;
@@ -336,15 +346,9 @@ struct tdb_context {
        /* Filename of the database. */
        const char *name;
 
-       /* Mmap (if any), or malloc (for TDB_INTERNAL). */
-       void *map_ptr;
-
        /* Are we accessing directly? (debugging check). */
        int direct_access;
 
-       /* How much space has been mapped (<= current file size) */
-       tdb_len_t map_size;
-
        /* Operating read-only? (Opened O_RDONLY, or in traverse_read) */
        bool read_only;
 
@@ -474,7 +478,7 @@ void tdb_io_init(struct tdb_context *tdb);
 void *tdb_convert(const struct tdb_context *tdb, void *buf, tdb_len_t size);
 
 /* Unmap and try to map the tdb. */
-void tdb_munmap(struct tdb_context *tdb);
+void tdb_munmap(struct tdb_file *file);
 void tdb_mmap(struct tdb_context *tdb);
 
 /* Either alloc a copy, or give direct access.  Release frees or noop. */
@@ -536,6 +540,9 @@ enum TDB_ERROR tdb_unlock_hashes(struct tdb_context *tdb,
                                 tdb_off_t hash_lock,
                                 tdb_len_t hash_range, int ltype);
 
+/* For closing the file. */
+void tdb_unlock_all(struct tdb_context *tdb);
+
 /* Lock/unlock a particular free bucket. */
 enum TDB_ERROR tdb_lock_free_bucket(struct tdb_context *tdb, tdb_off_t b_off,
                                    enum tdb_lock_flags waitflag);