hotspot/src/share/vm/utilities/vmError.cpp
changeset 8114 340b5b8b544b
parent 7901 ea3d83447861
child 8119 81eef1b06988
--- a/hotspot/src/share/vm/utilities/vmError.cpp	Thu Feb 03 20:30:19 2011 -0800
+++ b/hotspot/src/share/vm/utilities/vmError.cpp	Tue Feb 08 17:20:45 2011 -0500
@@ -35,6 +35,7 @@
 #include "utilities/debug.hpp"
 #include "utilities/decoder.hpp"
 #include "utilities/defaultStream.hpp"
+#include "utilities/errorReporter.hpp"
 #include "utilities/top.hpp"
 #include "utilities/vmError.hpp"
 
@@ -769,6 +770,7 @@
   // then save detailed information in log file (verbose = true).
   static bool out_done = false;         // done printing to standard out
   static bool log_done = false;         // done saving error log
+  static bool transmit_report_done = false; // done error reporting
   static fdStream log;                  // error log
 
   if (SuppressFatalErrorMessage) {
@@ -859,7 +861,7 @@
         bool copy_ok =
           Arguments::copy_expand_pid(ErrorFile, strlen(ErrorFile), buffer, sizeof(buffer));
         if (copy_ok) {
-          fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+          fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
         }
       }
 
@@ -870,7 +872,7 @@
         // so use the default name in the current directory
         jio_snprintf(&buffer[len], sizeof(buffer)-len, "%shs_err_pid%u.log",
                      os::file_separator(), os::current_process_id());
-        fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+        fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
       }
 
       if (fd == -1) {
@@ -879,7 +881,7 @@
         if (tmpdir != NULL && tmpdir[0] != '\0') {
           jio_snprintf(buffer, sizeof(buffer), "%s%shs_err_pid%u.log",
                        tmpdir, os::file_separator(), os::current_process_id());
-          fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+          fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
         }
       }
 
@@ -892,6 +894,9 @@
       } else {
         out.print_raw_cr("# Can not save log file, dump to screen..");
         log.set_fd(defaultStream::output_fd());
+        /* Error reporting currently needs dumpfile.
+         * Maybe implement direct streaming in the future.*/
+        transmit_report_done = true;
       }
     }
 
@@ -900,6 +905,16 @@
     first_error->_current_step = 0;         // reset current_step
     first_error->_current_step_info = "";   // reset current_step string
 
+    // Run error reporting to determine whether or not to report the crash.
+    if (!transmit_report_done && should_report_bug(first_error->_id)) {
+      transmit_report_done = true;
+      FILE* hs_err = ::fdopen(log.fd(), "r");
+      if (NULL != hs_err) {
+        ErrorReporter er;
+        er.call(hs_err, buffer, O_BUFLEN);
+      }
+    }
+
     if (log.fd() != defaultStream::output_fd()) {
       close(log.fd());
     }