inherit thread locals at thread creation time, not start time

This commit is contained in:
Joel Dice 2007-07-29 19:27:42 -06:00
parent 73155c6196
commit da692a539f
2 changed files with 17 additions and 18 deletions

View File

@ -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<ThreadLocal, Object> 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) {

View File

@ -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<jlong>(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<jlong>(p);
} else {
p->exit();
object message = makeString(t, "unable to start native thread");
t->exception = makeRuntimeException(t, message);
return 0;
}
}