7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
Reviewed-by: dholmes, minqi, kvn, coleenp
--- a/hotspot/src/share/vm/runtime/safepoint.cpp Mon Mar 05 18:10:31 2012 -0800
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp Tue Mar 06 16:32:23 2012 -0800
@@ -219,6 +219,8 @@
#ifdef ASSERT
for (JavaThread *cur = Threads::first(); cur != NULL; cur = cur->next()) {
assert(cur->safepoint_state()->is_running(), "Illegal initial state");
+ // Clear the visited flag to ensure that the critical counts are collected properly.
+ cur->set_visited_for_critical_count(false);
}
#endif // ASSERT
@@ -378,6 +380,13 @@
OrderAccess::fence();
+#ifdef ASSERT
+ for (JavaThread *cur = Threads::first(); cur != NULL; cur = cur->next()) {
+ // make sure all the threads were visited
+ assert(cur->was_visited_for_critical_count(), "missed a thread");
+ }
+#endif // ASSERT
+
// Update the count of active JNI critical regions
GC_locker::set_jni_lock_count(_current_jni_active_count);
@@ -626,6 +635,7 @@
_waiting_to_block--;
thread->safepoint_state()->set_has_called_back(true);
+ DEBUG_ONLY(thread->set_visited_for_critical_count(true));
if (thread->in_critical()) {
// Notice that this thread is in a critical section
increment_jni_active_count();
@@ -907,12 +917,8 @@
// running, but are actually at a safepoint. We will happily
// agree and update the safepoint state here.
if (SafepointSynchronize::safepoint_safe(_thread, state)) {
+ SafepointSynchronize::check_for_lazy_critical_native(_thread, state);
roll_forward(_at_safepoint);
- SafepointSynchronize::check_for_lazy_critical_native(_thread, state);
- if (_thread->in_critical()) {
- // Notice that this thread is in a critical section
- SafepointSynchronize::increment_jni_active_count();
- }
return;
}
@@ -937,6 +943,11 @@
switch(_type) {
case _at_safepoint:
SafepointSynchronize::signal_thread_at_safepoint();
+ DEBUG_ONLY(_thread->set_visited_for_critical_count(true));
+ if (_thread->in_critical()) {
+ // Notice that this thread is in a critical section
+ SafepointSynchronize::increment_jni_active_count();
+ }
break;
case _call_back:
--- a/hotspot/src/share/vm/runtime/thread.cpp Mon Mar 05 18:10:31 2012 -0800
+++ b/hotspot/src/share/vm/runtime/thread.cpp Tue Mar 06 16:32:23 2012 -0800
@@ -247,6 +247,10 @@
omInUseList = NULL ;
omInUseCount = 0 ;
+#ifdef ASSERT
+ _visited_for_critical_count = false;
+#endif
+
_SR_lock = new Monitor(Mutex::suspend_resume, "SR_lock", true);
_suspend_flags = 0;
--- a/hotspot/src/share/vm/runtime/thread.hpp Mon Mar 05 18:10:31 2012 -0800
+++ b/hotspot/src/share/vm/runtime/thread.hpp Tue Mar 06 16:32:23 2012 -0800
@@ -268,6 +268,15 @@
ObjectMonitor* omInUseList; // SLL to track monitors in circulation
int omInUseCount; // length of omInUseList
+#ifdef ASSERT
+ private:
+ bool _visited_for_critical_count;
+
+ public:
+ void set_visited_for_critical_count(bool z) { _visited_for_critical_count = z; }
+ bool was_visited_for_critical_count() const { return _visited_for_critical_count; }
+#endif
+
public:
enum {
is_definitely_current_thread = true