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; |