From 406bd59848e2b569e52c9650d2fccbb03da4cb4e Mon Sep 17 00:00:00 2001 From: leventov Date: Sat, 5 Nov 2016 16:29:35 -0600 Subject: [PATCH] Remove VanillaChronicleHash from OnExitHook on close() --- .../impl/ChronicleHashCloseOnExitHook.java} | 21 ++++++++++++------- .../hash/impl/VanillaChronicleHash.java | 10 ++++++--- .../chronicle/map/ChronicleMapBuilder.java | 4 +--- 3 files changed, 21 insertions(+), 14 deletions(-) rename src/main/java/net/openhft/chronicle/{map/ChronicleMapCloseOnExitHook.java => hash/impl/ChronicleHashCloseOnExitHook.java} (80%) diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapCloseOnExitHook.java b/src/main/java/net/openhft/chronicle/hash/impl/ChronicleHashCloseOnExitHook.java similarity index 80% rename from src/main/java/net/openhft/chronicle/map/ChronicleMapCloseOnExitHook.java rename to src/main/java/net/openhft/chronicle/hash/impl/ChronicleHashCloseOnExitHook.java index cff5813f7..8b730f493 100644 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapCloseOnExitHook.java +++ b/src/main/java/net/openhft/chronicle/hash/impl/ChronicleHashCloseOnExitHook.java @@ -14,18 +14,17 @@ * along with this program. If not, see . */ -package net.openhft.chronicle.map; +package net.openhft.chronicle.hash.impl; -import net.openhft.chronicle.hash.impl.VanillaChronicleHash; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.TreeMap; import java.util.WeakHashMap; -final class ChronicleMapCloseOnExitHook { - private static final Logger LOG = LoggerFactory.getLogger(ChronicleMapCloseOnExitHook.class); +final class ChronicleHashCloseOnExitHook { + private static final Logger LOG = LoggerFactory.getLogger(ChronicleHashCloseOnExitHook.class); private static WeakHashMap maps = new WeakHashMap<>(); private static long order = 0; @@ -45,12 +44,18 @@ final class ChronicleMapCloseOnExitHook { maps.put(hash.identity, order++); } + static synchronized void remove(VanillaChronicleHash hash) { + if (maps == null) + return; // we are already in shutdown + maps.remove(hash.identity); + } + private static void closeAll() { try { WeakHashMap maps; - synchronized (ChronicleMapCloseOnExitHook.class) { - maps = ChronicleMapCloseOnExitHook.maps; - ChronicleMapCloseOnExitHook.maps = null; + synchronized (ChronicleHashCloseOnExitHook.class) { + maps = ChronicleHashCloseOnExitHook.maps; + ChronicleHashCloseOnExitHook.maps = null; } TreeMap orderedMaps = new TreeMap<>(); @@ -69,5 +74,5 @@ final class ChronicleMapCloseOnExitHook { } } - private ChronicleMapCloseOnExitHook() {} + private ChronicleHashCloseOnExitHook() {} } diff --git a/src/main/java/net/openhft/chronicle/hash/impl/VanillaChronicleHash.java b/src/main/java/net/openhft/chronicle/hash/impl/VanillaChronicleHash.java index 8f0ca78eb..899db8da0 100644 --- a/src/main/java/net/openhft/chronicle/hash/impl/VanillaChronicleHash.java +++ b/src/main/java/net/openhft/chronicle/hash/impl/VanillaChronicleHash.java @@ -164,9 +164,8 @@ public abstract class VanillaChronicleHash> allContexts; /** - * {@link net.openhft.chronicle.map.ChronicleMapCloseOnExitHook} needs to use - * {@code VanillaChronicleHash}es as WeakHashMap keys, but with identity comparison, not Map's - * equals() and hashCode(). + * {@link ChronicleHashCloseOnExitHook} needs to use {@code VanillaChronicleHash}es as + * WeakHashMap keys, but with identity comparison, not Map's equals() and hashCode(). */ public class Identity { public VanillaChronicleHash hash() { @@ -489,6 +488,10 @@ public abstract class VanillaChronicleHash implements map.registerCleaner(); // Ensure safe publication of a ChronicleMap OS.memory().storeFence(); - ChronicleMapCloseOnExitHook.add(map); + map.addToOnExitHook(); } /**