X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Fio.c;h=bb3d2192829dc504a885e06176f6a2e275c2bcd8;hp=7e5dcb73160f4a441e6e978349e04c2bca5cbaa4;hb=703cea0c78a896c658272af06306218fc0bb23cc;hpb=41e027e11e0b15100e50c14e49aaa4c2b418f431 diff --git a/ccan/tdb2/io.c b/ccan/tdb2/io.c index 7e5dcb73..bb3d2192 100644 --- a/ccan/tdb2/io.c +++ b/ccan/tdb2/io.c @@ -342,7 +342,7 @@ enum TDB_ERROR tdb_write_off(struct tdb_context *tdb, static void *_tdb_alloc_read(struct tdb_context *tdb, tdb_off_t offset, tdb_len_t len, unsigned int prefix) { - void *buf; + unsigned char *buf; enum TDB_ERROR ecode; /* some systems don't like zero length malloc */ @@ -439,7 +439,7 @@ static enum TDB_ERROR tdb_expand_file(struct tdb_context *tdb, const void *tdb_access_read(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, bool convert) { - const void *ret = NULL; + void *ret = NULL; if (likely(!(tdb->flags & TDB_CONVERT))) { ret = tdb->methods->direct(tdb, off, len, false); @@ -563,6 +563,35 @@ static void *tdb_direct(struct tdb_context *tdb, tdb_off_t off, size_t len, return (char *)tdb->file->map_ptr + off; } +void tdb_inc_seqnum(struct tdb_context *tdb) +{ + tdb_off_t seq; + + if (likely(!(tdb->flags & TDB_CONVERT))) { + int64_t *direct; + + direct = tdb->methods->direct(tdb, + offsetof(struct tdb_header, + seqnum), + sizeof(*direct), true); + if (likely(direct)) { + /* Don't let it go negative, even briefly */ + if (unlikely((*direct) + 1) < 0) + *direct = 0; + (*direct)++; + return; + } + } + + seq = tdb_read_off(tdb, offsetof(struct tdb_header, seqnum)); + if (!TDB_OFF_IS_ERR(seq)) { + seq++; + if (unlikely((int64_t)seq < 0)) + seq = 0; + tdb_write_off(tdb, offsetof(struct tdb_header, seqnum), seq); + } +} + void add_stat_(struct tdb_context *tdb, uint64_t *s, size_t val) { if ((uintptr_t)s < (uintptr_t)tdb->stats + tdb->stats->size)