X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb%2Flock.c;h=b1153b2e6f72b20f81e65f135d1d56f051036727;hb=bbf2f9cef4bdbb3841869e9b87f234886985f7e8;hp=6f5799a8198f13dd06851aae03869c635035200e;hpb=e9989ef0758b3b660abf444d014c5b51a3a7c1b4;p=ccan diff --git a/ccan/tdb/lock.c b/ccan/tdb/lock.c index 6f5799a8..b1153b2e 100644 --- a/ccan/tdb/lock.c +++ b/ccan/tdb/lock.c @@ -277,12 +277,10 @@ int tdb_nest_lock(struct tdb_context *tdb, uint32_t offset, int ltype, return -1; } - tdb->num_locks++; - tdb->lockrecs[tdb->num_lockrecs].off = offset; tdb->lockrecs[tdb->num_lockrecs].count = 1; tdb->lockrecs[tdb->num_lockrecs].ltype = ltype; - tdb->num_lockrecs += 1; + tdb->num_lockrecs++; return 0; } @@ -368,17 +366,12 @@ int tdb_nest_unlock(struct tdb_context *tdb, uint32_t offset, int ltype, } else { ret = tdb->methods->brunlock(tdb, ltype, offset, 1); } - tdb->num_locks--; /* * Shrink the array by overwriting the element just unlocked with the * last array element. */ - - if (tdb->num_lockrecs > 1) { - *lck = tdb->lockrecs[tdb->num_lockrecs-1]; - } - tdb->num_lockrecs -= 1; + *lck = tdb->lockrecs[--tdb->num_lockrecs]; /* * We don't bother with realloc when the array shrinks, but if we have @@ -456,9 +449,7 @@ static int _tdb_lockall(struct tdb_context *tdb, int ltype, 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))); } @@ -493,8 +484,7 @@ static int _tdb_unlockall(struct tdb_context *tdb, int ltype, bool mark_lock) } 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; } @@ -675,6 +665,11 @@ bool tdb_have_extra_locks(struct tdb_context *tdb) return true; } + /* We always hold the active lock if CLEAR_IF_FIRST. */ + if (find_nestlock(tdb, ACTIVE_LOCK)) { + extra--; + } + /* In a transaction, we expect to hold the transaction lock */ if (tdb->transaction && find_nestlock(tdb, TRANSACTION_LOCK)) { extra--; @@ -690,21 +685,22 @@ void tdb_release_extra_locks(struct tdb_context *tdb) 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; } for (i=0;inum_lockrecs;i++) { struct tdb_lock_type *lck = &tdb->lockrecs[i]; + /* Don't release transaction or active locks! */ if (tdb->transaction && lck->off == TRANSACTION_LOCK) { tdb->lockrecs[extra++] = *lck; + } else if (lck->off == ACTIVE_LOCK) { + tdb->lockrecs[extra++] = *lck; } else { tdb_brunlock(tdb, lck->ltype, lck->off, 1); } } - tdb->num_locks = extra; tdb->num_lockrecs = extra; if (tdb->num_lockrecs == 0) { SAFE_FREE(tdb->lockrecs);