changeset 5589:5cc2d82aa82a

8024943: ciReplay: fails to dump replay data during safepointing Reviewed-by: kvn, twisti
author vlivanov
date Mon, 07 Oct 2013 14:11:49 +0400
parents bf8a21c3ab3b
children f478c98e8114
files src/share/vm/ci/ciEnv.cpp src/share/vm/ci/ciEnv.hpp src/share/vm/ci/ciInstanceKlass.cpp src/share/vm/ci/ciMethod.cpp src/share/vm/ci/ciMethodData.cpp src/share/vm/utilities/vmError.cpp
diffstat 6 files changed, 15 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/ci/ciEnv.cpp	Mon Oct 07 14:10:29 2013 +0400
+++ b/src/share/vm/ci/ciEnv.cpp	Mon Oct 07 14:11:49 2013 +0400
@@ -1154,9 +1154,12 @@
   GUARDED_VM_ENTRY(return _factory->get_unloaded_object_constant();)
 }
 
-void ciEnv::dump_replay_data(outputStream* out) {
-  VM_ENTRY_MARK;
-  MutexLocker ml(Compile_lock);
+// ------------------------------------------------------------------
+// ciEnv::dump_replay_data*
+
+// Don't change thread state and acquire any locks.
+// Safe to call from VM error reporter.
+void ciEnv::dump_replay_data_unsafe(outputStream* out) {
   ResourceMark rm;
 #if INCLUDE_JVMTI
   out->print_cr("JvmtiExport can_access_local_variables %d",     _jvmti_can_access_local_variables);
@@ -1181,3 +1184,10 @@
                 entry_bci, comp_level);
   out->flush();
 }
+
+void ciEnv::dump_replay_data(outputStream* out) {
+  GUARDED_VM_ENTRY(
+    MutexLocker ml(Compile_lock);
+    dump_replay_data_unsafe(out);
+  )
+}
--- a/src/share/vm/ci/ciEnv.hpp	Mon Oct 07 14:10:29 2013 +0400
+++ b/src/share/vm/ci/ciEnv.hpp	Mon Oct 07 14:11:49 2013 +0400
@@ -452,6 +452,7 @@
 
   // Dump the compilation replay data for the ciEnv to the stream.
   void dump_replay_data(outputStream* out);
+  void dump_replay_data_unsafe(outputStream* out);
 };
 
 #endif // SHARE_VM_CI_CIENV_HPP
--- a/src/share/vm/ci/ciInstanceKlass.cpp	Mon Oct 07 14:10:29 2013 +0400
+++ b/src/share/vm/ci/ciInstanceKlass.cpp	Mon Oct 07 14:11:49 2013 +0400
@@ -671,7 +671,6 @@
 
 
 void ciInstanceKlass::dump_replay_data(outputStream* out) {
-  ASSERT_IN_VM;
   ResourceMark rm;
 
   InstanceKlass* ik = get_instanceKlass();
--- a/src/share/vm/ci/ciMethod.cpp	Mon Oct 07 14:10:29 2013 +0400
+++ b/src/share/vm/ci/ciMethod.cpp	Mon Oct 07 14:11:49 2013 +0400
@@ -1247,7 +1247,6 @@
 #undef FETCH_FLAG_FROM_VM
 
 void ciMethod::dump_replay_data(outputStream* st) {
-  ASSERT_IN_VM;
   ResourceMark rm;
   Method* method = get_Method();
   MethodCounters* mcs = method->method_counters();
--- a/src/share/vm/ci/ciMethodData.cpp	Mon Oct 07 14:10:29 2013 +0400
+++ b/src/share/vm/ci/ciMethodData.cpp	Mon Oct 07 14:11:49 2013 +0400
@@ -373,7 +373,6 @@
 }
 
 void ciMethodData::dump_replay_data(outputStream* out) {
-  ASSERT_IN_VM;
   ResourceMark rm;
   MethodData* mdo = get_MethodData();
   Method* method = mdo->method();
--- a/src/share/vm/utilities/vmError.cpp	Mon Oct 07 14:10:29 2013 +0400
+++ b/src/share/vm/utilities/vmError.cpp	Mon Oct 07 14:11:49 2013 +0400
@@ -1050,7 +1050,7 @@
         FILE* replay_data_file = os::open(fd, "w");
         if (replay_data_file != NULL) {
           fileStream replay_data_stream(replay_data_file, /*need_close=*/true);
-          env->dump_replay_data(&replay_data_stream);
+          env->dump_replay_data_unsafe(&replay_data_stream);
           out.print_raw("#\n# Compiler replay data is saved as:\n# ");
           out.print_raw_cr(buffer);
         } else {