diff --git a/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/ReadLock.java b/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/ReadLock.java index e7b498a26..9241b99d2 100644 --- a/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/ReadLock.java +++ b/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/ReadLock.java @@ -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); } diff --git a/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/UpdateLock.java b/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/UpdateLock.java index f5484c17e..fa6e35d93 100644 --- a/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/UpdateLock.java +++ b/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/UpdateLock.java @@ -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); diff --git a/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/WriteLock.java b/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/WriteLock.java index 364815d1a..e70312f4d 100644 --- a/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/WriteLock.java +++ b/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/WriteLock.java @@ -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();