aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/utilities
diff options
context:
space:
mode:
authorvlivanov <none@none>2013-04-25 11:02:32 -0700
committervlivanov <none@none>2013-04-25 11:02:32 -0700
commit112d7b32298fe0e5f8effea4971fddebc4dea4ca (patch)
tree08f3104092665a14f360c243c9590547a1758b60 /src/share/vm/utilities
parent1783031bac298ca569475613421c460ae4aa15d5 (diff)
8012260: ciReplay: Include PID into the name of replay data file
Reviewed-by: kvn, twisti
Diffstat (limited to 'src/share/vm/utilities')
-rw-r--r--src/share/vm/utilities/ostream.hpp2
-rw-r--r--src/share/vm/utilities/vmError.cpp97
2 files changed, 66 insertions, 33 deletions
diff --git a/src/share/vm/utilities/ostream.hpp b/src/share/vm/utilities/ostream.hpp
index 6acb889fc..6b154184b 100644
--- a/src/share/vm/utilities/ostream.hpp
+++ b/src/share/vm/utilities/ostream.hpp
@@ -196,7 +196,7 @@ class fileStream : public outputStream {
fileStream() { _file = NULL; _need_close = false; }
fileStream(const char* file_name);
fileStream(const char* file_name, const char* opentype);
- fileStream(FILE* file) { _file = file; _need_close = false; }
+ fileStream(FILE* file, bool need_close = false) { _file = file; _need_close = need_close; }
~fileStream();
bool is_open() const { return _file != NULL; }
void set_need_close(bool b) { _need_close = b;}
diff --git a/src/share/vm/utilities/vmError.cpp b/src/share/vm/utilities/vmError.cpp
index e1608cae9..433718603 100644
--- a/src/share/vm/utilities/vmError.cpp
+++ b/src/share/vm/utilities/vmError.cpp
@@ -796,6 +796,56 @@ void VMError::report(outputStream* st) {
VMError* volatile VMError::first_error = NULL;
volatile jlong VMError::first_error_tid = -1;
+/** Expand a pattern into a buffer starting at pos and open a file using constructed path */
+static int expand_and_open(const char* pattern, char* buf, size_t buflen, size_t pos) {
+ int fd = -1;
+ if (Arguments::copy_expand_pid(pattern, strlen(pattern), &buf[pos], buflen - pos)) {
+ fd = open(buf, O_RDWR | O_CREAT | O_TRUNC, 0666);
+ }
+ return fd;
+}
+
+/**
+ * Construct file name for a log file and return it's file descriptor.
+ * Name and location depends on pattern, default_pattern params and access
+ * permissions.
+ */
+static int prepare_log_file(const char* pattern, const char* default_pattern, char* buf, size_t buflen) {
+ int fd = -1;
+
+ // If possible, use specified pattern to construct log file name
+ if (pattern != NULL) {
+ fd = expand_and_open(pattern, buf, buflen, 0);
+ }
+
+ // Either user didn't specify, or the user's location failed,
+ // so use the default name in the current directory
+ if (fd == -1) {
+ const char* cwd = os::get_current_directory(buf, buflen);
+ if (cwd != NULL) {
+ size_t pos = strlen(cwd);
+ int fsep_len = jio_snprintf(&buf[pos], buflen-pos, "%s", os::file_separator());
+ pos += fsep_len;
+ if (fsep_len > 0) {
+ fd = expand_and_open(default_pattern, buf, buflen, pos);
+ }
+ }
+ }
+
+ // try temp directory if it exists.
+ if (fd == -1) {
+ const char* tmpdir = os::get_temp_directory();
+ if (tmpdir != NULL && strlen(tmpdir) > 0) {
+ int pos = jio_snprintf(buf, buflen, "%s%s", tmpdir, os::file_separator());
+ if (pos > 0) {
+ fd = expand_and_open(default_pattern, buf, buflen, pos);
+ }
+ }
+ }
+
+ return fd;
+}
+
void VMError::report_and_die() {
// Don't allocate large buffer on stack
static char buffer[O_BUFLEN];
@@ -905,36 +955,7 @@ void VMError::report_and_die() {
// see if log file is already open
if (!log.is_open()) {
// open log file
- int fd = -1;
-
- if (ErrorFile != NULL) {
- bool copy_ok =
- Arguments::copy_expand_pid(ErrorFile, strlen(ErrorFile), buffer, sizeof(buffer));
- if (copy_ok) {
- fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
- }
- }
-
- if (fd == -1) {
- const char *cwd = os::get_current_directory(buffer, sizeof(buffer));
- size_t len = strlen(cwd);
- // either user didn't specify, or the user's location failed,
- // 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_RDWR | O_CREAT | O_TRUNC, 0666);
- }
-
- if (fd == -1) {
- const char * tmpdir = os::get_temp_directory();
- // try temp directory if it exists.
- 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_RDWR | O_CREAT | O_TRUNC, 0666);
- }
- }
-
+ int fd = prepare_log_file(ErrorFile, "hs_err_pid%p.log", buffer, sizeof(buffer));
if (fd != -1) {
out.print_raw("# An error report file with more information is saved as:\n# ");
out.print_raw_cr(buffer);
@@ -958,7 +979,7 @@ void VMError::report_and_die() {
// 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");
+ FILE* hs_err = os::open(log.fd(), "r");
if (NULL != hs_err) {
ErrorReporter er;
er.call(hs_err, buffer, O_BUFLEN);
@@ -1008,7 +1029,19 @@ void VMError::report_and_die() {
skip_replay = true;
ciEnv* env = ciEnv::current();
if (env != NULL) {
- env->dump_replay_data();
+ int fd = prepare_log_file(ReplayDataFile, "replay_pid%p.log", buffer, sizeof(buffer));
+ if (fd != -1) {
+ 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);
+ out.print_raw("#\n# Compiler replay data is saved as:\n# ");
+ out.print_raw_cr(buffer);
+ } else {
+ out.print_raw("#\n# Can't open file to dump replay data. Error: ");
+ out.print_raw_cr(strerror(os::get_last_error()));
+ }
+ }
}
}