Thread.java (Thread(ThreadGroup, Runnable, String)): Pass new parameter constructor.

* java/lang/Thread.java (Thread(ThreadGroup, Runnable, String)): Pass
	new parameter constructor.
	(Thread(ThreadGroup, Runnable, String, long)): Same.
	(Thread(String, boolean)): New constructor.
	(Thread(Thread, ThreadGroup, Runnable, String): Add parameter
	noInheritableThreadLocal, don't call
	InheritableThreadLocal.newChildThread if set.
	* java/lang/PosixProcess.java(ProcessManager()): Set
	noInheritableThreadLocal in super.
	* java/lang/natThread.cc (_Jv_AttachCurrentThread): Pass new
	parameter to Thread constructor.
	(_Jv_AttachCurrentThreadAsDaemon): Same.
	* java/lang/Thread.h: Regenerate.
	* classpath/lib/java/lang/Thread.class: Same.
	* classpath/lib/java/lang/PosixProcess$EOFInputStream.class: Same.
	* classpath/lib/java/lang/PosixProcess.class: Same.
	* classpath/lib/java/lang/Thread$State.class: Same.
	* classpath/lib/java/lang/PosixProcess$ProcessManager.class: Same.

From-SVN: r122054
This commit is contained in:
David Daney 2007-02-16 21:23:10 +00:00 committed by David Daney
parent d16c4b1a16
commit 599b39ce9d
10 changed files with 55 additions and 8 deletions

View File

@ -1,3 +1,24 @@
2007-02-16 David Daney <ddaney@avtrex.com>
* java/lang/Thread.java (Thread(ThreadGroup, Runnable, String)): Pass
new parameter constructor.
(Thread(ThreadGroup, Runnable, String, long)): Same.
(Thread(String, boolean)): New constructor.
(Thread(Thread, ThreadGroup, Runnable, String): Add parameter
noInheritableThreadLocal, don't call
InheritableThreadLocal.newChildThread if set.
* java/lang/PosixProcess.java(ProcessManager()): Set
noInheritableThreadLocal in super.
* java/lang/natThread.cc (_Jv_AttachCurrentThread): Pass new
parameter to Thread constructor.
(_Jv_AttachCurrentThreadAsDaemon): Same.
* java/lang/Thread.h: Regenerate.
* classpath/lib/java/lang/Thread.class: Same.
* classpath/lib/java/lang/PosixProcess$EOFInputStream.class: Same.
* classpath/lib/java/lang/PosixProcess.class: Same.
* classpath/lib/java/lang/Thread$State.class: Same.
* classpath/lib/java/lang/PosixProcess$ProcessManager.class: Same.
2007-02-16 Kyle Galloway <kgallowa@redhat.com>
* interpret.cc: Add extra DEBUG_LOCALS_INSN calls for multi-slot

View File

@ -42,7 +42,12 @@ final class PosixProcess extends Process
ProcessManager()
{
super("ProcessManager");
// Use package private Thread constructor to place us in the
// root ThreadGroup with no InheritableThreadLocal. If the
// InheritableThreadLocals were allowed to initialize, they could
// cause a Runtime.exec() to be called causing infinite
// recursion.
super("ProcessManager", true);
// Don't keep the (main) process from exiting on our account.
this.setDaemon(true);
}

View File

@ -53,8 +53,10 @@ public:
Thread(::java::lang::Runnable *, ::java::lang::String *);
Thread(::java::lang::ThreadGroup *, ::java::lang::Runnable *, ::java::lang::String *);
Thread(::java::lang::ThreadGroup *, ::java::lang::Runnable *, ::java::lang::String *, jlong);
public: // actually package-private
Thread(::java::lang::String *, jboolean);
private:
Thread(::java::lang::Thread *, ::java::lang::ThreadGroup *, ::java::lang::Runnable *, ::java::lang::String *);
Thread(::java::lang::Thread *, ::java::lang::ThreadGroup *, ::java::lang::Runnable *, ::java::lang::String *, jboolean);
public:
static jint activeCount();
virtual void checkAccess();

View File

@ -355,7 +355,7 @@ public class Thread implements Runnable
*/
public Thread(ThreadGroup group, Runnable target, String name)
{
this(currentThread(), group, target, name);
this(currentThread(), group, target, name, false);
}
/**
@ -381,10 +381,26 @@ public class Thread implements Runnable
public Thread(ThreadGroup group, Runnable target, String name, long size)
{
// Just ignore stackSize for now.
this(currentThread(), group, target, name);
this(currentThread(), group, target, name, false);
}
private Thread (Thread current, ThreadGroup g, Runnable r, String n)
/**
* Allocate a new Thread object for threads used internally to the
* run time. Runtime threads should not be members of an
* application ThreadGroup, nor should they execute arbitrary user
* code as part of the InheritableThreadLocal protocol.
*
* @param name the name for the Thread
* @param noInheritableThreadLocal if true, do not initialize
* InheritableThreadLocal variables for this thread.
* @throws IllegalThreadStateException if group is destroyed
*/
Thread(String name, boolean noInheritableThreadLocal)
{
this(null, null, null, name, noInheritableThreadLocal);
}
private Thread (Thread current, ThreadGroup g, Runnable r, String n, boolean noInheritableThreadLocal)
{
// Make sure the current thread may create a new thread.
checkAccess();
@ -424,7 +440,10 @@ public class Thread implements Runnable
int pri = current.getPriority();
priority = (gmax < pri ? gmax : pri);
contextClassLoader = current.contextClassLoader;
InheritableThreadLocal.newChildThread(this);
// InheritableThreadLocal allows arbitrary user code to be
// executed, only do this if our caller desires it.
if (!noInheritableThreadLocal)
InheritableThreadLocal.newChildThread(this);
}
else
{

View File

@ -490,7 +490,7 @@ _Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group)
return thread;
if (name == NULL)
name = java::lang::Thread::gen_name ();
thread = new java::lang::Thread (NULL, group, NULL, name);
thread = new java::lang::Thread (NULL, group, NULL, name, false);
_Jv_AttachCurrentThread (thread);
_Jv_NotifyThreadStart (thread);
return thread;
@ -504,7 +504,7 @@ _Jv_AttachCurrentThreadAsDaemon(jstring name, java::lang::ThreadGroup* group)
return thread;
if (name == NULL)
name = java::lang::Thread::gen_name ();
thread = new java::lang::Thread (NULL, group, NULL, name);
thread = new java::lang::Thread (NULL, group, NULL, name, false);
thread->setDaemon (true);
_Jv_AttachCurrentThread (thread);
_Jv_NotifyThreadStart (thread);