X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftdb2.h;h=0731503b874ce130649f1bb64964460b1c7ad9f1;hp=52c234f1c8b77ea7b542c09219e412f99db5b872;hb=6ce40d6ab4dbd63bd76979b8491351708c3df892;hpb=f513c5701b184fd1c0a6f03431c7fdda3ab6d2cf diff --git a/ccan/tdb2/tdb2.h b/ccan/tdb2/tdb2.h index 52c234f1..0731503b 100644 --- a/ccan/tdb2/tdb2.h +++ b/ccan/tdb2/tdb2.h @@ -311,7 +311,7 @@ enum TDB_ERROR tdb_transaction_prepare_commit(struct tdb_context *tdb); * a negative enum TDB_ERROR value. */ #define tdb_traverse(tdb, fn, p) \ - tdb_traverse_(tdb, typesafe_cb_preargs(int, (fn), (p), \ + tdb_traverse_(tdb, typesafe_cb_preargs(int, void *, (fn), (p), \ struct tdb_context *, \ TDB_DATA, TDB_DATA), (p)) @@ -324,7 +324,7 @@ int64_t tdb_traverse_(struct tdb_context *tdb, * @tdb: the tdb context returned from tdb_open() * @key: the key whose record we should hand to @parse * @parse: the function to call for the data - * @p: the private pointer to hand to @parse (types must match). + * @data: the private pointer to hand to @parse (types must match). * * This avoids a copy for many cases, by handing you a pointer into * the memory-mapped database. It also locks the record to prevent @@ -332,17 +332,18 @@ int64_t tdb_traverse_(struct tdb_context *tdb, * * Do not alter the data handed to parse()! */ -#define tdb_parse_record(tdb, key, parse, p) \ +#define tdb_parse_record(tdb, key, parse, data) \ tdb_parse_record_((tdb), (key), \ - typesafe_cb_preargs(enum TDB_ERROR, (parse), (p), \ - TDB_DATA, TDB_DATA), (p)) + typesafe_cb_preargs(enum TDB_ERROR, void *, \ + (parse), (data), \ + TDB_DATA, TDB_DATA), (data)) enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb, TDB_DATA key, - enum TDB_ERROR (*parse)(TDB_DATA key, - TDB_DATA data, - void *p), - void *p); + enum TDB_ERROR (*parse)(TDB_DATA k, + TDB_DATA d, + void *data), + void *data); /** * tdb_get_seqnum - get a database sequence number @@ -394,7 +395,7 @@ enum TDB_ERROR tdb_nextkey(struct tdb_context *tdb, struct tdb_data *key); * @tdb: the tdb context returned from tdb_open() * @key: the key to lock. * - * This prevents any changes from occurring to a group of keys including @key, + * This prevents any access occurring to a group of keys including @key, * even if @key does not exist. This allows primitive atomic updates of * records without using transactions. * @@ -416,6 +417,33 @@ enum TDB_ERROR tdb_chainlock(struct tdb_context *tdb, TDB_DATA key); */ void tdb_chainunlock(struct tdb_context *tdb, TDB_DATA key); +/** + * tdb_chainlock_read - lock a record in the TDB, for reading + * @tdb: the tdb context returned from tdb_open() + * @key: the key to lock. + * + * This prevents any changes from occurring to a group of keys including @key, + * even if @key does not exist. This allows primitive atomic updates of + * records without using transactions. + * + * You cannot begin a transaction while holding a tdb_chainlock_read(), nor can + * you do any operations on any other keys in the database. This also means + * that you cannot hold more than one tdb_chainlock()/read() at a time. + * + * See Also: + * tdb_chainlock() + */ +enum TDB_ERROR tdb_chainlock_read(struct tdb_context *tdb, TDB_DATA key); + +/** + * tdb_chainunlock_read - unlock a record in the TDB for reading + * @tdb: the tdb context returned from tdb_open() + * @key: the key to unlock. + * + * The key must have previously been locked by tdb_chainlock_read(). + */ +void tdb_chainunlock_read(struct tdb_context *tdb, TDB_DATA key); + /** * tdb_lockall - lock the entire TDB * @tdb: the tdb context returned from tdb_open() @@ -462,7 +490,7 @@ enum TDB_ERROR tdb_wipe_all(struct tdb_context *tdb); * tdb_check - check a TDB for consistency * @tdb: the tdb context returned from tdb_open() * @check: function to check each key/data pair (or NULL) - * @private: argument for @check, must match type. + * @data: argument for @check, must match type. * * This performs a consistency check of the open database, optionally calling * a check() function on each record so you can do your own data consistency @@ -471,18 +499,18 @@ enum TDB_ERROR tdb_wipe_all(struct tdb_context *tdb); * * Returns TDB_SUCCESS or an error. */ -#define tdb_check(tdb, check, private) \ - tdb_check_((tdb), typesafe_cb_preargs(enum TDB_ERROR, \ - (check), (private), \ +#define tdb_check(tdb, check, data) \ + tdb_check_((tdb), typesafe_cb_preargs(enum TDB_ERROR, void *, \ + (check), (data), \ struct tdb_data, \ struct tdb_data), \ - (private)) + (data)) enum TDB_ERROR tdb_check_(struct tdb_context *tdb, - enum TDB_ERROR (*check)(struct tdb_data key, - struct tdb_data data, - void *private), - void *private); + enum TDB_ERROR (*check)(struct tdb_data k, + struct tdb_data d, + void *data), + void *data); /** * tdb_error - get the last error (not threadsafe) @@ -612,11 +640,11 @@ enum tdb_log_level { */ struct tdb_attribute_log { struct tdb_attribute_base base; /* .attr = TDB_ATTRIBUTE_LOG */ - void (*log_fn)(struct tdb_context *tdb, - enum tdb_log_level level, - void *log_private, - const char *message); - void *log_private; + void (*fn)(struct tdb_context *tdb, + enum tdb_log_level level, + const char *message, + void *data); + void *data; }; /** @@ -633,9 +661,9 @@ struct tdb_attribute_log { */ struct tdb_attribute_hash { struct tdb_attribute_base base; /* .attr = TDB_ATTRIBUTE_HASH */ - uint64_t (*hash_fn)(const void *key, size_t len, uint64_t seed, - void *priv); - void *hash_private; + uint64_t (*fn)(const void *key, size_t len, uint64_t seed, + void *data); + void *data; }; /**