From da692a539f6d128f8668cdaa4409d047b96edd62 Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Sun, 29 Jul 2007 19:27:42 -0600 Subject: [PATCH] inherit thread locals at thread creation time, not start time --- classpath/java/lang/Thread.java | 21 ++++++++++++--------- src/builtin.cpp | 14 +++++--------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/classpath/java/lang/Thread.java b/classpath/java/lang/Thread.java index a8c3d45b93..b9908e1298 100644 --- a/classpath/java/lang/Thread.java +++ b/classpath/java/lang/Thread.java @@ -12,12 +12,6 @@ public class Thread implements Runnable { public Thread(Runnable task) { this.task = task; - } - - public synchronized void start() { - if (peer != 0) { - throw new IllegalStateException("thread already started"); - } Map map = currentThread().locals; if (map != null) { @@ -28,11 +22,20 @@ public class Thread implements Runnable { } } } - - doStart(); } - private native void doStart(); + public synchronized void start() { + if (peer != 0) { + throw new IllegalStateException("thread already started"); + } + + peer = doStart(); + if (peer == 0) { + throw new RuntimeException("unable to start native thread"); + } + } + + private native long doStart(); public void run() { if (task != null) { diff --git a/src/builtin.cpp b/src/builtin.cpp index cd82c2e983..f1f7ff8df5 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -605,7 +605,7 @@ Thread_currentThread(Thread* t, jclass) return pushReference(t, t->javaThread); } -void +jlong Thread_doStart(Thread* t, jobject this_) { Thread* p = new (t->vm->system->allocate(sizeof(Thread))) @@ -613,15 +613,11 @@ Thread_doStart(Thread* t, jobject this_) enter(p, Thread::ActiveState); - threadPeer(t, *this_) = reinterpret_cast(p); - - if (not t->vm->system->success(t->vm->system->start(&(p->runnable)))) { - threadPeer(t, *this_) = -1; - + if (t->vm->system->success(t->vm->system->start(&(p->runnable)))) { + return reinterpret_cast(p); + } else { p->exit(); - - object message = makeString(t, "unable to start native thread"); - t->exception = makeRuntimeException(t, message); + return 0; } }