X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Fprivate.h;h=b709ee95b97375845a06814998b37a5b711bbfb1;hb=2960e90f2d036935273d163593839d3777be7980;hp=8e7df501b716a139c77e8de2ff673fe1afa55266;hpb=2b5cb9bd6be4e61870ba7a400d1a9d91c5933371;p=ccan diff --git a/ccan/tdb2/private.h b/ccan/tdb2/private.h index 8e7df501..b709ee95 100644 --- a/ccan/tdb2/private.h +++ b/ccan/tdb2/private.h @@ -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; @@ -315,21 +316,35 @@ struct tdb_access_hdr { bool convert; }; -struct tdb_context { - /* Filename of the database. */ - const char *name; +struct tdb_file { + /* Single list of all TDBs, to detect multiple opens. */ + struct tdb_file *next; /* 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; - /* Open file descriptor (undefined for TDB_INTERNAL). */ + /* The file descriptor (-1 for TDB_INTERNAL). */ int fd; - /* How much space has been mapped (<= current file size) */ - tdb_len_t map_size; + /* Lock information */ + struct tdb_lock allrecord_lock; + size_t num_lockrecs; + struct tdb_lock *lockrecs; + + /* Identity of this file. */ + dev_t device; + ino_t inode; +}; + +struct tdb_context { + /* Filename of the database. */ + const char *name; + + /* Are we accessing directly? (debugging check). */ + int direct_access; /* Operating read-only? (Opened O_RDONLY, or in traverse_read) */ bool read_only; @@ -365,20 +380,13 @@ struct tdb_context { /* IO methods: changes for transactions. */ const struct tdb_methods *methods; - /* Lock information */ - struct tdb_lock_type allrecord_lock; - size_t num_lockrecs; - struct tdb_lock_type *lockrecs; - struct tdb_attribute_stats *stats; /* Direct access information */ struct tdb_access_hdr *access; - /* Single list of all TDBs, to avoid multiple opens. */ - struct tdb_context *next; - dev_t device; - ino_t inode; + /* The actual file information */ + struct tdb_file *file; }; struct tdb_methods { @@ -467,7 +475,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. */ @@ -521,8 +529,6 @@ void add_stat_(struct tdb_context *tdb, uint64_t *stat, size_t val); } while (0) /* lock.c: */ -void tdb_lock_init(struct tdb_context *tdb); - /* Lock/unlock a range of hashes. */ enum TDB_ERROR tdb_lock_hashes(struct tdb_context *tdb, tdb_off_t hash_lock, tdb_len_t hash_range, @@ -531,6 +537,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);