return -1;
}
- if (tdb->methods->brlock(tdb, ltype,
- FREELIST_TOP, 4*tdb->header.hash_size,
- flags)) {
+ if (tdb->methods->brlock(tdb, ltype, FREELIST_TOP, 0, flags)) {
if (flags & TDB_LOCK_WAIT) {
TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_lockall failed (%s)\n", strerror(errno)));
}
}
if (!mark_lock &&
- tdb->methods->brunlock(tdb, ltype,
- FREELIST_TOP, 4*tdb->header.hash_size)) {
+ tdb->methods->brunlock(tdb, ltype, FREELIST_TOP, 0)) {
TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_unlockall failed (%s)\n", strerror(errno)));
return -1;
}
for (i = &tdb->travlocks; i; i = i->next)
if (i->off == off)
return -1;
+ if (tdb->allrecord_lock.count) {
+ if (tdb->allrecord_lock.ltype == F_WRLCK) {
+ return 0;
+ }
+ return -1;
+ }
return tdb->methods->brlock(tdb, F_WRLCK, off, 1, TDB_LOCK_NOWAIT|TDB_LOCK_PROBE);
}
int tdb_write_unlock_record(struct tdb_context *tdb, tdb_off_t off)
{
+ if (tdb->allrecord_lock.count) {
+ return 0;
+ }
return tdb->methods->brunlock(tdb, F_WRLCK, off, 1);
}
unsigned int i, extra = 0;
if (tdb->allrecord_lock.count != 0) {
- tdb_brunlock(tdb, tdb->allrecord_lock.ltype,
- FREELIST_TOP, 4*tdb->header.hash_size);
+ tdb_brunlock(tdb, tdb->allrecord_lock.ltype, FREELIST_TOP, 0);
tdb->allrecord_lock.count = 0;
}