aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/natThread.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/lang/natThread.cc')
-rw-r--r--libjava/java/lang/natThread.cc51
1 files changed, 36 insertions, 15 deletions
diff --git a/libjava/java/lang/natThread.cc b/libjava/java/lang/natThread.cc
index 66ce7d2..4c0d978 100644
--- a/libjava/java/lang/natThread.cc
+++ b/libjava/java/lang/natThread.cc
@@ -87,7 +87,8 @@ jint
java::lang::Thread::countStackFrames (void)
{
// NOTE: This is deprecated in JDK 1.2.
- JvFail ("java::lang::Thread::countStackFrames unimplemented");
+ throw new UnsupportedOperationException
+ (JvNewStringLatin1 ("Thread.countStackFrames unimplemented"));
return 0;
}
@@ -102,7 +103,8 @@ java::lang::Thread::destroy (void)
{
// NOTE: This is marked as unimplemented in the JDK 1.2
// documentation.
- JvFail ("java::lang::Thread::destroy unimplemented");
+ throw new UnsupportedOperationException
+ (JvNewStringLatin1 ("Thread.destroy unimplemented"));
}
void
@@ -142,7 +144,8 @@ void
java::lang::Thread::resume (void)
{
checkAccess ();
- JvFail ("java::lang::Thread::resume unimplemented");
+ throw new UnsupportedOperationException
+ (JvNewStringLatin1 ("Thread.resume unimplemented"));
}
void
@@ -213,12 +216,11 @@ java::lang::Thread::finish_ ()
_Jv_MutexUnlock (&nt->join_mutex);
}
-void
-java::lang::Thread::run_ (jobject obj)
+// Run once at thread startup, either when thread is attached or when
+// _Jv_ThreadRun is called.
+static void
+_Jv_NotifyThreadStart (java::lang::Thread* thread)
{
- java::lang::Thread *thread = (java::lang::Thread *) obj;
- try
- {
#ifdef ENABLE_JVMPI
if (_Jv_JVMPI_Notify_THREAD_START)
{
@@ -272,7 +274,14 @@ java::lang::Thread::run_ (jobject obj)
_Jv_EnableGC ();
}
#endif
+}
+void
+_Jv_ThreadRun (java::lang::Thread* thread)
+{
+ try
+ {
+ _Jv_NotifyThreadStart (thread);
thread->run ();
}
catch (java::lang::Throwable *t)
@@ -304,14 +313,14 @@ java::lang::Thread::start (void)
alive_flag = true;
startable_flag = false;
natThread *nt = (natThread *) data;
- _Jv_ThreadStart (this, nt->thread, (_Jv_ThreadStartFunc *) &run_);
+ _Jv_ThreadStart (this, nt->thread, (_Jv_ThreadStartFunc *) &_Jv_ThreadRun);
}
void
java::lang::Thread::stop (java::lang::Throwable *)
{
throw new UnsupportedOperationException
- (JvNewStringLatin1 ("java::lang::Thread::stop unimplemented"));
+ (JvNewStringLatin1 ("Thread.stop unimplemented"));
}
void
@@ -319,7 +328,7 @@ java::lang::Thread::suspend (void)
{
checkAccess ();
throw new UnsupportedOperationException
- (JvNewStringLatin1 ("java::lang::Thread::suspend unimplemented"));
+ (JvNewStringLatin1 ("Thread.suspend unimplemented"));
}
static int nextThreadNumber = 0;
@@ -373,6 +382,20 @@ _Jv_SetCurrentJNIEnv (JNIEnv *env)
((natThread *) t->data)->jni_env = env;
}
+// Attach the current native thread to an existing (but unstarted) Thread
+// object. Returns -1 on failure, 0 upon success.
+jint
+_Jv_AttachCurrentThread(java::lang::Thread* thread)
+{
+ if (thread == NULL || thread->startable_flag == false)
+ return -1;
+ thread->startable_flag = false;
+ thread->alive_flag = true;
+ natThread *nt = (natThread *) thread->data;
+ _Jv_ThreadRegister (nt->thread);
+ return 0;
+}
+
java::lang::Thread*
_Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group)
{
@@ -382,10 +405,8 @@ _Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group)
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);
+ _Jv_AttachCurrentThread (thread);
+ _Jv_NotifyThreadStart (thread);
return thread;
}