X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Fprivate.h;h=c95c7e05e59181f9d67c8131c7d813353a4c99af;hb=94c8763345a51fe59e97daf4e29051f56331c63c;hp=9ae5bed2e6bc6cb8c397d32d1f7f6f6ef8574930;hpb=1ad66fedf81fdaf0f07a2b00d6787614c58a23ef;p=ccan diff --git a/ccan/tdb2/private.h b/ccan/tdb2/private.h index 9ae5bed2..c95c7e05 100644 --- a/ccan/tdb2/private.h +++ b/ccan/tdb2/private.h @@ -75,7 +75,7 @@ typedef uint64_t tdb_off_t; /* Packing errors into pointers and v.v. */ #define TDB_PTR_IS_ERR(ptr) \ - unlikely((void *)(ptr) >= (void *)(long)TDB_ERR_LAST) + unlikely((unsigned long)(ptr) >= (unsigned long)TDB_ERR_LAST) #define TDB_PTR_ERR(p) ((enum TDB_ERROR)(long)(p)) #define TDB_ERR_PTR(err) ((void *)(long)(err)) @@ -246,7 +246,9 @@ struct tdb_header { uint64_t features_used; /* Features all writers understand */ uint64_t features_offered; /* Features offered */ - tdb_off_t reserved[24]; + uint64_t seqnum; /* Sequence number for TDB_SEQNUM */ + + tdb_off_t reserved[23]; /* Top level hash table. */ tdb_off_t hashtable[1ULL << TDB_TOPLEVEL_HASH_BITS]; @@ -300,7 +302,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 +322,23 @@ 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; + pid_t locker; + 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 +349,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; @@ -384,6 +391,9 @@ struct tdb_context { /* Direct access information */ struct tdb_access_hdr *access; + /* Last error we returned. */ + enum TDB_ERROR last_error; + /* The actual file information */ struct tdb_file *file; }; @@ -474,7 +484,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. */ @@ -519,6 +529,9 @@ enum TDB_ERROR tdb_write_convert(struct tdb_context *tdb, tdb_off_t off, enum TDB_ERROR tdb_read_convert(struct tdb_context *tdb, tdb_off_t off, void *rec, size_t len); +/* Bump the seqnum (caller checks for tdb->flags & TDB_SEQNUM) */ +void tdb_inc_seqnum(struct tdb_context *tdb); + /* Adds a stat, if it's in range. */ void add_stat_(struct tdb_context *tdb, uint64_t *stat, size_t val); #define add_stat(tdb, statname, val) \ @@ -536,6 +549,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_lock_cleanup(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);