hotspot/src/share/vm/runtime/safepoint.cpp
changeset 11637 030466036615
parent 11631 33813f69207b
child 12108 b2ee55606008
equal deleted inserted replaced
11636:3c07b54482a5 11637:030466036615
   134     tty->print_cr("Safepoint synchronization initiated. (%d)", nof_threads);
   134     tty->print_cr("Safepoint synchronization initiated. (%d)", nof_threads);
   135   }
   135   }
   136 
   136 
   137   RuntimeService::record_safepoint_begin();
   137   RuntimeService::record_safepoint_begin();
   138 
   138 
   139   {
       
   140   MutexLocker mu(Safepoint_lock);
   139   MutexLocker mu(Safepoint_lock);
   141 
   140 
   142   // Reset the count of active JNI critical threads
   141   // Reset the count of active JNI critical threads
   143   _current_jni_active_count = 0;
   142   _current_jni_active_count = 0;
   144 
   143 
   397 
   396 
   398   if (PrintSafepointStatistics) {
   397   if (PrintSafepointStatistics) {
   399     // Record how much time spend on the above cleanup tasks
   398     // Record how much time spend on the above cleanup tasks
   400     update_statistics_on_cleanup_end(os::javaTimeNanos());
   399     update_statistics_on_cleanup_end(os::javaTimeNanos());
   401   }
   400   }
   402   }
       
   403 }
   401 }
   404 
   402 
   405 // Wake up all threads, so they are ready to resume execution after the safepoint
   403 // Wake up all threads, so they are ready to resume execution after the safepoint
   406 // operation has been carried out
   404 // operation has been carried out
   407 void SafepointSynchronize::end() {
   405 void SafepointSynchronize::end() {
   542 
   540 
   543   default:
   541   default:
   544     return false;
   542     return false;
   545   }
   543   }
   546 }
   544 }
       
   545 
       
   546 
       
   547 // See if the thread is running inside a lazy critical native and
       
   548 // update the thread critical count if so.  Also set a suspend flag to
       
   549 // cause the native wrapper to return into the JVM to do the unlock
       
   550 // once the native finishes.
       
   551 void SafepointSynchronize::check_for_lazy_critical_native(JavaThread *thread, JavaThreadState state) {
       
   552   if (state == _thread_in_native &&
       
   553       thread->has_last_Java_frame() &&
       
   554       thread->frame_anchor()->walkable()) {
       
   555     // This thread might be in a critical native nmethod so look at
       
   556     // the top of the stack and increment the critical count if it
       
   557     // is.
       
   558     frame wrapper_frame = thread->last_frame();
       
   559     CodeBlob* stub_cb = wrapper_frame.cb();
       
   560     if (stub_cb != NULL &&
       
   561         stub_cb->is_nmethod() &&
       
   562         stub_cb->as_nmethod_or_null()->is_lazy_critical_native()) {
       
   563       // A thread could potentially be in a critical native across
       
   564       // more than one safepoint, so only update the critical state on
       
   565       // the first one.  When it returns it will perform the unlock.
       
   566       if (!thread->do_critical_native_unlock()) {
       
   567 #ifdef ASSERT
       
   568         if (!thread->in_critical()) {
       
   569           GC_locker::increment_debug_jni_lock_count();
       
   570         }
       
   571 #endif
       
   572         thread->enter_critical();
       
   573         // Make sure the native wrapper calls back on return to
       
   574         // perform the needed critical unlock.
       
   575         thread->set_critical_native_unlock();
       
   576       }
       
   577     }
       
   578   }
       
   579 }
       
   580 
   547 
   581 
   548 
   582 
   549 // -------------------------------------------------------------------------------------------------------
   583 // -------------------------------------------------------------------------------------------------------
   550 // Implementation of Safepoint callback point
   584 // Implementation of Safepoint callback point
   551 
   585 
   872   // Some JavaThread states have an initial safepoint state of
   906   // Some JavaThread states have an initial safepoint state of
   873   // running, but are actually at a safepoint. We will happily
   907   // running, but are actually at a safepoint. We will happily
   874   // agree and update the safepoint state here.
   908   // agree and update the safepoint state here.
   875   if (SafepointSynchronize::safepoint_safe(_thread, state)) {
   909   if (SafepointSynchronize::safepoint_safe(_thread, state)) {
   876     roll_forward(_at_safepoint);
   910     roll_forward(_at_safepoint);
       
   911     SafepointSynchronize::check_for_lazy_critical_native(_thread, state);
   877     if (_thread->in_critical()) {
   912     if (_thread->in_critical()) {
   878       // Notice that this thread is in a critical section
   913       // Notice that this thread is in a critical section
   879       SafepointSynchronize::increment_jni_active_count();
   914       SafepointSynchronize::increment_jni_active_count();
   880     }
   915     }
   881     return;
   916     return;