--- jsr166/src/jsr166e/ForkJoinTask.java 2013/07/22 16:52:31 1.15 +++ jsr166/src/jsr166e/ForkJoinTask.java 2013/09/20 10:52:13 1.16 @@ -411,11 +411,13 @@ public abstract class ForkJoinTask im final Throwable ex; ExceptionNode next; final long thrower; // use id not ref to avoid weak cycles + final int hashCode; // store task hashCode before weak ref disappears ExceptionNode(ForkJoinTask task, Throwable ex, ExceptionNode next) { super(task, exceptionTableRefQueue); this.ex = ex; this.next = next; this.thrower = Thread.currentThread().getId(); + this.hashCode = System.identityHashCode(task); } } @@ -574,12 +576,15 @@ public abstract class ForkJoinTask im /** * Poll stale refs and remove them. Call only while holding lock. */ + /** + * Poll stale refs and remove them. Call only while holding lock. + */ private static void expungeStaleExceptions() { for (Object x; (x = exceptionTableRefQueue.poll()) != null;) { if (x instanceof ExceptionNode) { - ForkJoinTask key = ((ExceptionNode)x).get(); + int hashCode = ((ExceptionNode)x).hashCode; ExceptionNode[] t = exceptionTable; - int i = System.identityHashCode(key) & (t.length - 1); + int i = hashCode & (t.length - 1); ExceptionNode e = t[i]; ExceptionNode pred = null; while (e != null) {