hotspot/src/share/vm/runtime/thread.cpp
changeset 8061 07585870d15f
parent 7900 4c7fc6332f7e
child 8076 96d498ec7ae1
equal deleted inserted replaced
7928:c2f2ee35ff81 8061:07585870d15f
  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())) {