X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Fio.c;h=0e27e1d0faea07a2d8640e46db187a0298afcfb8;hb=d5bb8e8d1c6731a3db234393c8d196b3b50084f2;hp=7e5dcb73160f4a441e6e978349e04c2bca5cbaa4;hpb=41e027e11e0b15100e50c14e49aaa4c2b418f431;p=ccan diff --git a/ccan/tdb2/io.c b/ccan/tdb2/io.c index 7e5dcb73..0e27e1d0 100644 --- a/ccan/tdb2/io.c +++ b/ccan/tdb2/io.c @@ -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)