From 0ef5fd0ac9900491c2ecff2ac17ac9bdcbfb53f6 Mon Sep 17 00:00:00 2001 From: chegar Date: Fri, 5 Nov 2010 09:07:02 +0000 Subject: [PATCH] 6988618: JCK test setDaemon0101 hangs on specific machine Reviewed-by: dholmes, alanb --- src/share/classes/java/lang/Thread.java | 13 ++++++---- src/share/classes/java/lang/ThreadGroup.java | 27 ++++++++++---------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/share/classes/java/lang/Thread.java b/src/share/classes/java/lang/Thread.java index c3592cf5c..52b57dde4 100644 --- a/src/share/classes/java/lang/Thread.java +++ b/src/share/classes/java/lang/Thread.java @@ -229,7 +229,7 @@ class Thread implements Runnable { * after setting this thread's interrupt status. */ private volatile Interruptible blocker; - private Object blockerLock = new Object(); + private final Object blockerLock = new Object(); /* Set the blocker field; invoked via sun.misc.SharedSecrets from java.nio code */ @@ -688,16 +688,19 @@ class Thread implements Runnable { throw new IllegalThreadStateException(); /* Notify the group that this thread is about to be started - * so that it can be added to the group's list of threads. */ + * so that it can be added to the group's list of threads + * and the group's unstarted count can be decremented. */ group.threadStarting(this); - boolean failed = true; + boolean started = false; try { start0(); - failed = false; + started = true; } finally { try { - group.threadStarted(this, failed); + if (!started) { + group.threadStartFailed(this); + } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ diff --git a/src/share/classes/java/lang/ThreadGroup.java b/src/share/classes/java/lang/ThreadGroup.java index 1b14570ce..8bfc3bc48 100644 --- a/src/share/classes/java/lang/ThreadGroup.java +++ b/src/share/classes/java/lang/ThreadGroup.java @@ -870,9 +870,16 @@ class ThreadGroup implements Thread.UncaughtExceptionHandler { /** * Notifies the group that the thread {@code t} is about to be * started and adds the thread to this thread group. + * + * The thread is now a fully fledged member of the group, even though + * it hasn't been started yet. It will prevent the group from being + * destroyed so the unstarted Threads count is decremented. */ void threadStarting(Thread t) { - add(t); + synchronized (this) { + add(t); + nUnstartedThreads--; + } } /** @@ -907,12 +914,10 @@ class ThreadGroup implements Thread.UncaughtExceptionHandler { } /** - * Notifies the group that the thread {@code t} has completed + * Notifies the group that the thread {@code t} has failed * an attempt to start. * - *

If the thread has been started successfully - * then the group has its unstarted Threads count decremented. - * Otherwise the state of this thread group is rolled back as if the + *

The state of this thread group is rolled back as if the * attempt to start the thread has never occurred. The thread is again * considered an unstarted member of the thread group, and a subsequent * attempt to start the thread is permitted. @@ -923,16 +928,10 @@ class ThreadGroup implements Thread.UncaughtExceptionHandler { * @param failed * true if the thread could not be started successfully */ - void threadStarted(Thread t, boolean failed) { + void threadStartFailed(Thread t) { synchronized(this) { - if (failed) { - remove(t); - } else { - if (destroyed) { - return; - } - nUnstartedThreads--; - } + remove(t); + nUnstartedThreads++; } } -- GitLab