Thread.java (Thread(ThreadGroup, Runnable, String)): Pass new parameter constructor.
authorDavid Daney <ddaney@avtrex.com>
Fri, 16 Feb 2007 21:23:10 +0000 (21:23 +0000)
committerDavid Daney <daney@gcc.gnu.org>
Fri, 16 Feb 2007 21:23:10 +0000 (21:23 +0000)
* 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

libjava/ChangeLog
libjava/classpath/lib/java/lang/PosixProcess$EOFInputStream.class
libjava/classpath/lib/java/lang/PosixProcess$ProcessManager.class
libjava/classpath/lib/java/lang/PosixProcess.class
libjava/classpath/lib/java/lang/Thread$State.class
libjava/classpath/lib/java/lang/Thread.class
libjava/java/lang/PosixProcess.java
libjava/java/lang/Thread.h
libjava/java/lang/Thread.java
libjava/java/lang/natThread.cc

index f6c0ed0004f1ba2ced563b74219b24b15b9f714c..06b507e10533ec14aa8170fe7feea51521a0ba98 100644 (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
index b9e9c72bafbb6c5dc5aff08739b99a2f788471e3..951dbfa9872cb703db1f5ba779f7ce16a1e3f3ba 100644 (file)
Binary files a/libjava/classpath/lib/java/lang/PosixProcess$EOFInputStream.class and b/libjava/classpath/lib/java/lang/PosixProcess$EOFInputStream.class differ
index 4c4024141a7285496fdc0dff81e0e39a821f5d09..2e260c358139b799d71989a1dd56997f891cc715 100644 (file)
Binary files a/libjava/classpath/lib/java/lang/PosixProcess$ProcessManager.class and b/libjava/classpath/lib/java/lang/PosixProcess$ProcessManager.class differ
index f7c52649fb9918c6e6ae6728ce39d9a12ac308f0..dc237fc1149bd48d930b90333dacbce2a3e88feb 100644 (file)
Binary files a/libjava/classpath/lib/java/lang/PosixProcess.class and b/libjava/classpath/lib/java/lang/PosixProcess.class differ
index e5ddca2eab821f912c4502fc617c9b0d33b73ab4..687bc9ff40abbc51c518446baf4714493954539c 100644 (file)
Binary files a/libjava/classpath/lib/java/lang/Thread$State.class and b/libjava/classpath/lib/java/lang/Thread$State.class differ
index 09315799f1e09e2cad34ab5932bb8a6a963be5d0..25ff6448cc9e92f65f71eb8f9c2e8619a1ed5969 100644 (file)
Binary files a/libjava/classpath/lib/java/lang/Thread.class and b/libjava/classpath/lib/java/lang/Thread.class differ
index 23e1da9d6980e05ee1fcab81e0eb05b90f283f77..517e6f33f9256e254cb084e04500d3dba76648e7 100644 (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);
     }
index bef9dd8d5f76dfbeb6dead6c832df3c33a237f8d..b9116b1aad296017cc4acb8c1a0d774980e61dd1 100644 (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();
index 84682f3fb831d1ef4d0722c8efdd6f5d6c2cb5b0..1e1e860cea00bcde59632a1f6851df46188c0859 100644 (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
       {
index 8a09f4f1a0f8ee15f828842566138d60bbba0555..42f18c4eb3a9c6d7fb3b08d7912092c7980331bf 100644 (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);