aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>2001-05-21 23:47:48 -0700
committerPer Bothner <bothner@gcc.gnu.org>2001-05-21 23:47:48 -0700
commitc93d7fae7b9825449c023d42eb40641c0ad80be2 (patch)
treeecfc0fb5d915f5f6596ef061114d1b6b7ec5270a /libjava/java
parentb4fbaca7cb5c6ff5fb5e24e554d510257cb488eb (diff)
downloadgcc-c93d7fae7b9825449c023d42eb40641c0ad80be2.zip
gcc-c93d7fae7b9825449c023d42eb40641c0ad80be2.tar.gz
gcc-c93d7fae7b9825449c023d42eb40641c0ad80be2.tar.bz2
Implement invocation interface; don't create new thread for main.
From-SVN: r42428
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/lang/Thread.java42
-rw-r--r--libjava/java/lang/natThread.cc62
2 files changed, 78 insertions, 26 deletions
diff --git a/libjava/java/lang/Thread.java b/libjava/java/lang/Thread.java
index 30fb4cd..8cc9cff 100644
--- a/libjava/java/lang/Thread.java
+++ b/libjava/java/lang/Thread.java
@@ -1,6 +1,6 @@
// Thread.java - Thread class.
-/* Copyright (C) 1998, 1999, 2000 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
This file is part of libgcj.
@@ -209,18 +209,20 @@ public class Thread implements Runnable
private final native void initialize_native ();
- private final synchronized static String gen_name ()
+ private final native static String gen_name ();
+
+ public Thread (ThreadGroup g, Runnable r, String n)
{
- String n;
- n = "Thread-" + nextThreadNumber;
- ++nextThreadNumber;
- return n;
+ this (currentThread (), g, r, n);
+
+ // The Class Libraries book says ``threadName cannot be null''. I
+ // take this to mean NullPointerException.
+ if (n == null)
+ throw new NullPointerException ();
}
- public Thread (ThreadGroup g, Runnable r, String n)
+ private Thread (Thread current, ThreadGroup g, Runnable r, String n)
{
- Thread current = currentThread ();
-
if (g == null)
{
// If CURRENT is null, then we are bootstrapping the first thread.
@@ -233,17 +235,6 @@ public class Thread implements Runnable
else
group = g;
- group.checkAccess();
-
- // The Class Libraries book says ``threadName cannot be null''. I
- // take this to mean NullPointerException.
- if (n == null)
- throw new NullPointerException ();
-
- name = n;
- group.addThread(this);
- runnable = r;
-
data = null;
interrupt_flag = false;
alive_flag = false;
@@ -251,6 +242,8 @@ public class Thread implements Runnable
if (current != null)
{
+ group.checkAccess();
+
daemon_flag = current.isDaemon();
int gmax = group.getMaxPriority();
int pri = current.getPriority();
@@ -263,6 +256,10 @@ public class Thread implements Runnable
priority = NORM_PRIORITY;
}
+ name = n;
+ group.addThread(this);
+ runnable = r;
+
initialize_native ();
}
@@ -315,9 +312,6 @@ public class Thread implements Runnable
private boolean startable_flag;
private ClassLoader context_class_loader;
- // Our native data.
+ // Our native data - points to an instance of struct natThread.
private Object data;
-
- // Next thread number to assign.
- private static int nextThreadNumber = 0;
}
diff --git a/libjava/java/lang/natThread.cc b/libjava/java/lang/natThread.cc
index 042ec36..66ce7d2 100644
--- a/libjava/java/lang/natThread.cc
+++ b/libjava/java/lang/natThread.cc
@@ -1,6 +1,6 @@
// natThread.cc - Native part of Thread class.
-/* Copyright (C) 1998, 1999, 2000 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
This file is part of libgcj.
@@ -59,7 +59,7 @@ java::lang::Thread::initialize_native (void)
{
natThread *nt = (natThread *) _Jv_AllocBytes (sizeof (natThread));
- // The native thread data is kept in a Object field, not a rawdata, so that
+ // The native thread data is kept in a Object field, not a RawData, so that
// the GC allocator can be used and a finalizer run after the thread becomes
// unreachable. Note that this relies on the GC's ability to finalize
// non-Java objects. FIXME?
@@ -322,6 +322,34 @@ java::lang::Thread::suspend (void)
(JvNewStringLatin1 ("java::lang::Thread::suspend unimplemented"));
}
+static int nextThreadNumber = 0;
+
+jstring
+java::lang::Thread::gen_name (void)
+{
+ jint i;
+ jclass sync = &java::lang::Thread::class$;
+ {
+ JvSynchronize dummy(sync);
+ i = ++nextThreadNumber;
+ }
+
+ // Use an array large enough for "-2147483648"; i.e. 11 chars, + "Thread-".
+ jchar buffer[7+11];
+ jchar *bufend = (jchar *) ((char *) buffer + sizeof(buffer));
+ i = _Jv_FormatInt (bufend, i);
+ jchar *ptr = bufend - i;
+ // Prepend "Thread-".
+ *--ptr = '-';
+ *--ptr = 'd';
+ *--ptr = 'a';
+ *--ptr = 'e';
+ *--ptr = 'r';
+ *--ptr = 'h';
+ *--ptr = 'T';
+ return JvNewString (ptr, bufend - ptr);
+}
+
void
java::lang::Thread::yield (void)
{
@@ -344,3 +372,33 @@ _Jv_SetCurrentJNIEnv (JNIEnv *env)
JvAssert (t != NULL);
((natThread *) t->data)->jni_env = env;
}
+
+java::lang::Thread*
+_Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group)
+{
+ java::lang::Thread *thread = _Jv_ThreadCurrent ();
+ if (thread != NULL)
+ return thread;
+ if (name == NULL)
+ name = java::lang::Thread::gen_name ();
+ thread = new java::lang::Thread (NULL, group, NULL, name);
+ thread->startable_flag = false;
+ thread->alive_flag = true;
+ natThread *nt = (natThread *) thread->data;
+ _Jv_ThreadRegister (nt->thread);
+ return thread;
+}
+
+jint
+_Jv_DetachCurrentThread (void)
+{
+ java::lang::Thread *t = _Jv_ThreadCurrent ();
+ if (t == NULL)
+ return -1;
+
+ _Jv_ThreadUnRegister ();
+ // Release the monitors.
+ t->finish_ ();
+
+ return 0;
+}