Update delayed check sum on WriteLock.unlock(), and close stages only if unlocking actually done

This commit is contained in:
leventov
2015-12-23 18:37:14 +03:00
parent 9ff159987e
commit 263e366ee8
3 changed files with 10 additions and 5 deletions
@@ -101,10 +101,12 @@ public class ReadLock implements InterProcessLock {
@Override
public void unlock() {
checkOnEachPublicOperation.checkOnEachLockOperation();
// TODO what should close here?
hlp.closeHashLookupPos();
entry.closePos();
entry.closeKeyOffset();
if (s.localLockState != UNLOCKED) {
// TODO what should close here?
hlp.closeHashLookupPos();
entry.closePos();
entry.closeKeyOffset();
}
s.readUnlockAndDecrementCount();
s.setLocalLockState(UNLOCKED);
}
@@ -172,18 +172,19 @@ public class UpdateLock implements InterProcessLock {
@Override
public void unlock() {
checkOnEachPublicOperation.checkOnEachLockOperation();
entry.closeDelayedUpdateChecksum();
switch (s.localLockState) {
case UNLOCKED:
case READ_LOCKED:
return;
case UPDATE_LOCKED:
entry.closeDelayedUpdateChecksum();
if (s.decrementUpdate() == 0) {
if (s.writeZero())
s.segmentHeader.downgradeUpdateToReadLock(s.segmentHeaderAddress);
}
break;
case WRITE_LOCKED:
entry.closeDelayedUpdateChecksum();
if (s.decrementWrite() == 0) {
if (!s.updateZero()) {
s.segmentHeader.downgradeWriteToUpdateLock(s.segmentHeaderAddress);
@@ -32,6 +32,7 @@ public class WriteLock implements InterProcessLock {
@StageRef CheckOnEachPublicOperation checkOnEachPublicOperation;
@StageRef SegmentStages s;
@StageRef HashEntryStages<?> entry;
@Override
public boolean isHeldByCurrentThread() {
@@ -247,6 +248,7 @@ public class WriteLock implements InterProcessLock {
case UPDATE_LOCKED:
return;
case WRITE_LOCKED:
entry.closeDelayedUpdateChecksum();
if (s.decrementWrite() == 0)
s.segmentHeader.downgradeWriteToUpdateLock(s.segmentHeaderAddress);
s.incrementUpdate();