Clean serializers and ThreadLocal fields of VanillaChronicleMap on close()

This commit is contained in:
leventov
2016-12-27 15:50:24 +08:00
parent fa70e216bd
commit 842064dca5
3 changed files with 31 additions and 23 deletions
@@ -657,15 +657,20 @@ public abstract class VanillaChronicleHash<K,
@Override
public final void close() {
if (resources.releaseManually()) {
// Don't try to execute cleaner.clean() and ChronicleHashCloseOnExitHook.remove() from
// finally section of try block wrapping resources.releaseManually(), because
// Releases nothing after resources.releaseManually(), only removes the cleaner
// from the internal linked list of all cleaners.
cleaner.clean();
ChronicleHashCloseOnExitHook.remove(this);
cleanupOnClose();
}
}
protected void cleanupOnClose() {
// Releases nothing after resources.releaseManually(), only removes the cleaner
// from the internal linked list of all cleaners.
cleaner.clean();
ChronicleHashCloseOnExitHook.remove(this);
// Make GC life easier
keyReader = null;
keyDataAccess = null;
}
@Override
public boolean isOpen() {
return !resources.closed();
@@ -174,6 +174,15 @@ public class VanillaChronicleMap<K, V, R>
cxt = new ThreadLocal<>();
}
@Override
protected void cleanupOnClose() {
super.cleanupOnClose();
// Make GC life easier
valueReader = null;
valueDataAccess = null;
cxt = null;
}
public final V checkValue(Object value) {
if (!valueClass.isInstance(value)) {
throw new ClassCastException(toIdentityString() + ": Value must be a " +
@@ -297,6 +306,9 @@ public class VanillaChronicleMap<K, V, R>
}
final ChainingInterface q() {
ThreadLocal<ContextHolder> cxt = this.cxt;
if (cxt == null)
throw new ChronicleHashClosedException(this);
ContextHolder contextHolder = cxt.get();
if (contextHolder == null) {
ChainingInterface queryContext = newQueryContext();
@@ -327,6 +339,9 @@ public class VanillaChronicleMap<K, V, R>
}
final ChainingInterface i() {
ThreadLocal<ContextHolder> cxt = this.cxt;
if (cxt == null)
throw new ChronicleHashClosedException(this);
ContextHolder contextHolder = cxt.get();
if (contextHolder == null) {
ChainingInterface iterationContext = newIterationContext();