From 263e366ee8945855d8655528cd483ffcd6879cd5 Mon Sep 17 00:00:00 2001 From: leventov Date: Wed, 23 Dec 2015 18:37:14 +0300 Subject: [PATCH] Update delayed check sum on WriteLock.unlock(), and close stages only if unlocking actually done --- .../chronicle/hash/impl/stage/entry/ReadLock.java | 10 ++++++---- .../chronicle/hash/impl/stage/entry/UpdateLock.java | 3 ++- .../chronicle/hash/impl/stage/entry/WriteLock.java | 2 ++ 3 files changed, 10 insertions(+), 5 deletions(-) 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();