return;
}
- if (tdb_brlock(tdb, TDB_SEQNUM_OFS, F_WRLCK, F_SETLKW, 1, 1) != 0) {
+ if (tdb_brlock(tdb, F_WRLCK, TDB_SEQNUM_OFS, 1,
+ TDB_LOCK_WAIT|TDB_LOCK_PROBE) != 0) {
return;
}
tdb_increment_seqnum_nonblock(tdb);
- tdb_brlock(tdb, TDB_SEQNUM_OFS, F_UNLCK, F_SETLKW, 1, 1);
+ tdb_brunlock(tdb, F_WRLCK, TDB_SEQNUM_OFS, 1);
}
static int tdb_key_compare(TDB_DATA key, TDB_DATA data, void *private_data)
}
/* detect tight infinite loop */
if (rec_ptr == r->next) {
+ tdb->ecode = TDB_ERR_CORRUPT;
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_find: loop detected.\n"));
- return TDB_ERRCODE(TDB_ERR_CORRUPT, 0);
+ return 0;
}
rec_ptr = r->next;
}
- return TDB_ERRCODE(TDB_ERR_NOEXIST, 0);
+ tdb->ecode = TDB_ERR_NOEXIST;
+ return 0;
}
/* As tdb_find, but if you succeed, keep the lock */
* then the TDB_DATA will have zero length but
* a non-zero pointer
*/
-static TDB_DATA do_tdb_fetch(struct tdb_context *tdb, TDB_DATA key)
+static TDB_DATA _tdb_fetch(struct tdb_context *tdb, TDB_DATA key)
{
tdb_off_t rec_ptr;
struct list_struct rec;
TDB_DATA tdb_fetch(struct tdb_context *tdb, TDB_DATA key)
{
- TDB_DATA ret = do_tdb_fetch(tdb, key);
+ TDB_DATA ret = _tdb_fetch(tdb, key);
tdb_trace_1rec_retrec(tdb, "tdb_fetch", key, ret);
return ret;
if (!(rec_ptr = tdb_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) {
tdb_trace_1rec_ret(tdb, "tdb_parse_record", key,
-TDB_ERR_NOEXIST);
- return TDB_ERRCODE(TDB_ERR_NOEXIST, 0);
+ tdb->ecode = TDB_ERR_NOEXIST;
+ return 0;
}
tdb_trace_1rec_ret(tdb, "tdb_parse_record", key, 0);
return 0;
}
-static int _tdb_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf,
- int flag, uint32_t hash)
+static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
+ TDB_DATA dbuf, int flag, uint32_t hash)
{
struct list_struct rec;
tdb_off_t rec_ptr;
if (tdb_lock(tdb, BUCKET(hash), F_WRLCK) == -1)
return -1;
- dbuf = do_tdb_fetch(tdb, key);
+ dbuf = _tdb_fetch(tdb, key);
if (dbuf.dptr == NULL) {
dbuf.dptr = (unsigned char *)malloc(new_dbuf.dsize);