6880029: JDK 1.6.0_u14p Application crashed very early
authorxlu
Thu, 24 Sep 2009 12:10:46 -0700
changeset 4006 7be2d5b3b15c
parent 3826 67b89f5a5cac
child 4007 bd61a7ea1907
6880029: JDK 1.6.0_u14p Application crashed very early Reviewed-by: never, ysr, acorn
hotspot/src/share/vm/runtime/safepoint.cpp
--- a/hotspot/src/share/vm/runtime/safepoint.cpp	Tue Sep 22 21:12:37 2009 -0600
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp	Thu Sep 24 12:10:46 2009 -0700
@@ -81,6 +81,14 @@
   jlong safepoint_limit_time;
   timeout_error_printed = false;
 
+  // PrintSafepointStatisticsTimeout can be specified separately. When
+  // specified, PrintSafepointStatistics will be set to true in
+  // deferred_initialize_stat method. The initialization has to be done
+  // early enough to avoid any races. See bug 6880029 for details.
+  if (PrintSafepointStatistics || PrintSafepointStatisticsTimeout > 0) {
+    deferred_initialize_stat();
+  }
+
   // Begin the process of bringing the system to a safepoint.
   // Java threads can be in several different states and are
   // stopped by different mechanisms:
@@ -169,8 +177,7 @@
       }
     }
 
-    if ( (PrintSafepointStatistics || (PrintSafepointStatisticsTimeout > 0))
-         && iterations == 0) {
+    if (PrintSafepointStatistics && iterations == 0) {
       begin_statistics(nof_threads, still_running);
     }
 
@@ -1026,8 +1033,7 @@
 }
 
 void SafepointSynchronize::begin_statistics(int nof_threads, int nof_running) {
-  deferred_initialize_stat();
-
+  assert(init_done, "safepoint statistics array hasn't been initialized");
   SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
 
   VM_Operation *op = VMThread::vm_operation();