comparison src/share/vm/runtime/safepoint.cpp @ 5928:541c4a5e7b88

7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal Reviewed-by: dholmes, minqi, kvn, coleenp
author never
date Tue, 06 Mar 2012 16:32:23 -0800
parents 0382d2b469b2
children e9140bf80b4a
comparison
equal deleted inserted replaced
5927:b40ac3579043 5928:541c4a5e7b88
217 int ncpus = os::processor_count() ; 217 int ncpus = os::processor_count() ;
218 218
219 #ifdef ASSERT 219 #ifdef ASSERT
220 for (JavaThread *cur = Threads::first(); cur != NULL; cur = cur->next()) { 220 for (JavaThread *cur = Threads::first(); cur != NULL; cur = cur->next()) {
221 assert(cur->safepoint_state()->is_running(), "Illegal initial state"); 221 assert(cur->safepoint_state()->is_running(), "Illegal initial state");
222 // Clear the visited flag to ensure that the critical counts are collected properly.
223 cur->set_visited_for_critical_count(false);
222 } 224 }
223 #endif // ASSERT 225 #endif // ASSERT
224 226
225 if (SafepointTimeout) 227 if (SafepointTimeout)
226 safepoint_limit_time = os::javaTimeNanos() + (jlong)SafepointTimeoutDelay * MICROUNITS; 228 safepoint_limit_time = os::javaTimeNanos() + (jlong)SafepointTimeoutDelay * MICROUNITS;
376 // Record state 378 // Record state
377 _state = _synchronized; 379 _state = _synchronized;
378 380
379 OrderAccess::fence(); 381 OrderAccess::fence();
380 382
383 #ifdef ASSERT
384 for (JavaThread *cur = Threads::first(); cur != NULL; cur = cur->next()) {
385 // make sure all the threads were visited
386 assert(cur->was_visited_for_critical_count(), "missed a thread");
387 }
388 #endif // ASSERT
389
381 // Update the count of active JNI critical regions 390 // Update the count of active JNI critical regions
382 GC_locker::set_jni_lock_count(_current_jni_active_count); 391 GC_locker::set_jni_lock_count(_current_jni_active_count);
383 392
384 if (TraceSafepoint) { 393 if (TraceSafepoint) {
385 VM_Operation *op = VMThread::vm_operation(); 394 VM_Operation *op = VMThread::vm_operation();
624 // Decrement the number of threads to wait for and signal vm thread 633 // Decrement the number of threads to wait for and signal vm thread
625 assert(_waiting_to_block > 0, "sanity check"); 634 assert(_waiting_to_block > 0, "sanity check");
626 _waiting_to_block--; 635 _waiting_to_block--;
627 thread->safepoint_state()->set_has_called_back(true); 636 thread->safepoint_state()->set_has_called_back(true);
628 637
638 DEBUG_ONLY(thread->set_visited_for_critical_count(true));
629 if (thread->in_critical()) { 639 if (thread->in_critical()) {
630 // Notice that this thread is in a critical section 640 // Notice that this thread is in a critical section
631 increment_jni_active_count(); 641 increment_jni_active_count();
632 } 642 }
633 643
905 915
906 // Some JavaThread states have an initial safepoint state of 916 // Some JavaThread states have an initial safepoint state of
907 // running, but are actually at a safepoint. We will happily 917 // running, but are actually at a safepoint. We will happily
908 // agree and update the safepoint state here. 918 // agree and update the safepoint state here.
909 if (SafepointSynchronize::safepoint_safe(_thread, state)) { 919 if (SafepointSynchronize::safepoint_safe(_thread, state)) {
920 SafepointSynchronize::check_for_lazy_critical_native(_thread, state);
910 roll_forward(_at_safepoint); 921 roll_forward(_at_safepoint);
911 SafepointSynchronize::check_for_lazy_critical_native(_thread, state);
912 if (_thread->in_critical()) {
913 // Notice that this thread is in a critical section
914 SafepointSynchronize::increment_jni_active_count();
915 }
916 return; 922 return;
917 } 923 }
918 924
919 if (state == _thread_in_vm) { 925 if (state == _thread_in_vm) {
920 roll_forward(_call_back); 926 roll_forward(_call_back);
935 _type = type; 941 _type = type;
936 942
937 switch(_type) { 943 switch(_type) {
938 case _at_safepoint: 944 case _at_safepoint:
939 SafepointSynchronize::signal_thread_at_safepoint(); 945 SafepointSynchronize::signal_thread_at_safepoint();
946 DEBUG_ONLY(_thread->set_visited_for_critical_count(true));
947 if (_thread->in_critical()) {
948 // Notice that this thread is in a critical section
949 SafepointSynchronize::increment_jni_active_count();
950 }
940 break; 951 break;
941 952
942 case _call_back: 953 case _call_back:
943 set_has_called_back(false); 954 set_has_called_back(false);
944 break; 955 break;