From e618edafd3ad5387113b9593a6753bfba279274d Mon Sep 17 00:00:00 2001 From: Pavel Afremov Date: Fri, 11 May 2007 17:04:52 +0400 Subject: [PATCH] First version of class unloading support implementation in lazy stack creation. --- .../javasrc/java/lang/Throwable.java | 56 +++++++++++++++++++- 1 files changed, 54 insertions(+), 2 deletions(-) diff --git a/vm/vmcore/src/kernel_classes/javasrc/java/lang/Throwable.java b/vm/vmcore/src/kernel_classes/javasrc/java/lang/Throwable.java index fd418c5..aaa4782 100644 --- a/vm/vmcore/src/kernel_classes/javasrc/java/lang/Throwable.java +++ b/vm/vmcore/src/kernel_classes/javasrc/java/lang/Throwable.java @@ -26,6 +26,10 @@ import java.io.ObjectOutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.Serializable; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.WeakHashMap; import org.apache.harmony.vm.VMStack; @@ -44,6 +48,12 @@ public class Throwable implements Serializable { private transient Object state; + // Class Unloading support + private transient static final WeakHashMap exceptions_map = + new WeakHashMap(); + private transient Object stateLock = new Object(); + + /** * @com.intel.drl.spec_ref */ @@ -80,6 +90,11 @@ public class Throwable implements Serializable { */ public Throwable fillInStackTrace() { state = VMStack.getStackState(); + + // Class Unloading support + synchronized(exceptions_map) { + exceptions_map.put(this, stateLock); + } return this; } @@ -109,13 +124,50 @@ public class Throwable implements Serializable { */ public StackTraceElement[] getStackTrace() { if (stackTrace == null) { - stackTrace = VMStack.getStackTrace(state); - } + synchronized(stateLock) { + if (stackTrace == null) { + stackTrace = VMStack.getStackTrace(state); + state = null; + } + } + + // Class Unloading support + synchronized (exceptions_map) + { + exceptions_map.remove(this); + } + } StackTraceElement[] st = new StackTraceElement[stackTrace.length]; System.arraycopy(stackTrace, 0, st, 0, stackTrace.length); return st; } + // Class Unloading support + public static void createAllStackTraces() { + Set set; + + synchronized (exceptions_map) { + set = new HashSet(exceptions_map.keySet()); + } + + Iterator iterator = set.iterator(); + + while(iterator.hasNext()) { + Throwable exception = iterator.next(); + + synchronized(exception.stateLock) { + if (exception.stackTrace == null) { + exception.stackTrace = VMStack.getStackTrace(exception.state); + exception.state = null; + } + } + synchronized (exceptions_map) + { + exceptions_map.remove(exception); + } + } + } + /** * @com.intel.drl.spec_ref */ -- 1.5.0.3