1508 |
1508 |
1509 void JavaThread::thread_main_inner() { |
1509 void JavaThread::thread_main_inner() { |
1510 assert(JavaThread::current() == this, "sanity check"); |
1510 assert(JavaThread::current() == this, "sanity check"); |
1511 assert(this->threadObj() != NULL, "just checking"); |
1511 assert(this->threadObj() != NULL, "just checking"); |
1512 |
1512 |
1513 // Execute thread entry point. If this thread is being asked to restart, |
1513 // Execute thread entry point unless this thread has a pending exception |
1514 // or has been stopped before starting, do not reexecute entry point. |
1514 // or has been stopped before starting. |
1515 // Note: Due to JVM_StopThread we can have pending exceptions already! |
1515 // Note: Due to JVM_StopThread we can have pending exceptions already! |
1516 if (!this->has_pending_exception() && !java_lang_Thread::is_stillborn(this->threadObj())) { |
1516 if (!this->has_pending_exception() && |
1517 // enter the thread's entry point only if we have no pending exceptions |
1517 !java_lang_Thread::is_stillborn(this->threadObj())) { |
1518 HandleMark hm(this); |
1518 HandleMark hm(this); |
1519 this->entry_point()(this, this); |
1519 this->entry_point()(this, this); |
1520 } |
1520 } |
1521 |
1521 |
1522 DTRACE_THREAD_PROBE(stop, this); |
1522 DTRACE_THREAD_PROBE(stop, this); |
1531 Handle threadObj(thread, thread->threadObj()); |
1531 Handle threadObj(thread, thread->threadObj()); |
1532 assert(threadObj.not_null(), "java thread object must exist"); |
1532 assert(threadObj.not_null(), "java thread object must exist"); |
1533 ObjectLocker lock(threadObj, thread); |
1533 ObjectLocker lock(threadObj, thread); |
1534 // Ignore pending exception (ThreadDeath), since we are exiting anyway |
1534 // Ignore pending exception (ThreadDeath), since we are exiting anyway |
1535 thread->clear_pending_exception(); |
1535 thread->clear_pending_exception(); |
1536 // It is of profound importance that we set the stillborn bit and reset the thread object, |
|
1537 // before we do the notify. Since, changing these two variable will make JVM_IsAlive return |
|
1538 // false. So in case another thread is doing a join on this thread , it will detect that the thread |
|
1539 // is dead when it gets notified. |
|
1540 java_lang_Thread::set_stillborn(threadObj()); |
|
1541 // Thread is exiting. So set thread_status field in java.lang.Thread class to TERMINATED. |
1536 // Thread is exiting. So set thread_status field in java.lang.Thread class to TERMINATED. |
1542 java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED); |
1537 java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED); |
|
1538 // Clear the native thread instance - this makes isAlive return false and allows the join() |
|
1539 // to complete once we've done the notify_all below |
1543 java_lang_Thread::set_thread(threadObj(), NULL); |
1540 java_lang_Thread::set_thread(threadObj(), NULL); |
1544 lock.notify_all(thread); |
1541 lock.notify_all(thread); |
1545 // Ignore pending exception (ThreadDeath), since we are exiting anyway |
1542 // Ignore pending exception (ThreadDeath), since we are exiting anyway |
1546 thread->clear_pending_exception(); |
1543 thread->clear_pending_exception(); |
1547 } |
1544 } |
1993 assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped"); |
1990 assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped"); |
1994 |
1991 |
1995 // Do not throw asynchronous exceptions against the compiler thread |
1992 // Do not throw asynchronous exceptions against the compiler thread |
1996 // (the compiler thread should not be a Java thread -- fix in 1.4.2) |
1993 // (the compiler thread should not be a Java thread -- fix in 1.4.2) |
1997 if (is_Compiler_thread()) return; |
1994 if (is_Compiler_thread()) return; |
1998 |
|
1999 // This is a change from JDK 1.1, but JDK 1.2 will also do it: |
|
2000 if (java_throwable->is_a(SystemDictionary::ThreadDeath_klass())) { |
|
2001 java_lang_Thread::set_stillborn(threadObj()); |
|
2002 } |
|
2003 |
1995 |
2004 { |
1996 { |
2005 // Actually throw the Throwable against the target Thread - however |
1997 // Actually throw the Throwable against the target Thread - however |
2006 // only if there is no thread death exception installed already. |
1998 // only if there is no thread death exception installed already. |
2007 if (_pending_async_exception == NULL || !_pending_async_exception->is_a(SystemDictionary::ThreadDeath_klass())) { |
1999 if (_pending_async_exception == NULL || !_pending_async_exception->is_a(SystemDictionary::ThreadDeath_klass())) { |