X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftdb1_traverse.c;h=d9d3649fd96c9e8de53c4eb207119e8c33c46f2d;hp=87e233b47fe3fa4551b11db6adee922fc242978e;hb=818ed29730b030ce79855fc35c212b51adff3180;hpb=bbeb528e74c0e234e1f724ac8d54be404cfc6f9a diff --git a/ccan/tdb2/tdb1_traverse.c b/ccan/tdb2/tdb1_traverse.c index 87e233b4..d9d3649f 100644 --- a/ccan/tdb2/tdb1_traverse.c +++ b/ccan/tdb2/tdb1_traverse.c @@ -29,6 +29,8 @@ #define TDB1_NEXT_LOCK_ERR ((tdb1_off_t)-1) +static TDB_DATA tdb1_null; + /* Uses traverse lock: 0 = finish, TDB1_NEXT_LOCK_ERR = error, other = record offset */ static tdb1_off_t tdb1_next_lock(struct tdb_context *tdb, struct tdb1_traverse_lock *tlock, @@ -144,8 +146,10 @@ static tdb1_off_t tdb1_next_lock(struct tdb_context *tdb, struct tdb1_traverse_l a non-zero return value from fn() indicates that the traversal should stop */ static int tdb1_traverse_internal(struct tdb_context *tdb, - tdb1_traverse_func fn, void *private_data, - struct tdb1_traverse_lock *tl) + int (*fn)(struct tdb_context *, + TDB_DATA, TDB_DATA, void *), + void *private_data, + struct tdb1_traverse_lock *tl) { TDB_DATA key, dbuf; struct tdb1_record rec; @@ -213,10 +217,12 @@ out: /* - a write style traverse - temporarily marks the db read only + a read style traverse - only if db read only */ -int tdb1_traverse_read(struct tdb_context *tdb, - tdb1_traverse_func fn, void *private_data) +static int tdb1_traverse_read(struct tdb_context *tdb, + int (*fn)(struct tdb_context *, + TDB_DATA, TDB_DATA, void *), + void *private_data) { struct tdb1_traverse_lock tl = { NULL, 0, 0, F_RDLCK }; int ret; @@ -244,12 +250,14 @@ int tdb1_traverse_read(struct tdb_context *tdb, alignment restrictions malloc gives you. */ int tdb1_traverse(struct tdb_context *tdb, - tdb1_traverse_func fn, void *private_data) + int (*fn)(struct tdb_context *, TDB_DATA, TDB_DATA, void *), + void *private_data) { struct tdb1_traverse_lock tl = { NULL, 0, 0, F_WRLCK }; int ret; - if ((tdb->flags & TDB_RDONLY) || tdb->tdb1.traverse_read) { + /* If we're read-only, we don't have to write-lock whole db. */ + if (tdb->flags & TDB_RDONLY) { return tdb1_traverse_read(tdb, fn, private_data); }