< prev index next >

src/hotspot/share/jfr/recorder/repository/jfrEmergencyDump.cpp

Print this page

        

@@ -44,10 +44,12 @@
 static const char vm_oom_filename_fmt[] = "hs_oom_pid%p.jfr";
 static const char vm_soe_filename_fmt[] = "hs_soe_pid%p.jfr";
 static const char chunk_file_jfr_ext[] = ".jfr";
 static const size_t iso8601_len = 19; // "YYYY-MM-DDTHH:MM:SS"
 
+char JfrEmergencyDump::_dump_path[JVM_MAXPATHLEN] = {0};
+
 static fio_fd open_exclusivly(const char* path) {
   return os::open(path, O_CREAT | O_RDWR, S_IREAD | S_IWRITE);
 }
 
 static int file_sort(const char** const file1, const char** file2) {

@@ -245,21 +247,21 @@
       }
     }
   }
 }
 
-static const char* create_emergency_dump_path() {
-  char* buffer = NEW_RESOURCE_ARRAY_RETURN_NULL(char, JVM_MAXPATHLEN);
-  if (NULL == buffer) {
-    return NULL;
+const char* JfrEmergencyDump::create_emergency_dump_path() {
+  if (*_dump_path != '\0') {
+    return _dump_path;
   }
-  const char* const cwd = os::get_current_directory(buffer, JVM_MAXPATHLEN);
+
+  const char* const cwd = os::get_current_directory(_dump_path, JVM_MAXPATHLEN);
   if (NULL == cwd) {
     return NULL;
   }
   size_t pos = strlen(cwd);
-  const int fsep_len = jio_snprintf(&buffer[pos], JVM_MAXPATHLEN - pos, "%s", os::file_separator());
+  const int fsep_len = jio_snprintf(&_dump_path[pos], JVM_MAXPATHLEN - pos, "%s", os::file_separator());
   const char* filename_fmt = NULL;
   // fetch specific error cause
   switch (JfrJavaSupport::cause()) {
     case JfrJavaSupport::OUT_OF_MEMORY:
       filename_fmt = vm_oom_filename_fmt;

@@ -268,50 +270,43 @@
       filename_fmt = vm_soe_filename_fmt;
       break;
     default:
       filename_fmt = vm_error_filename_fmt;
   }
-  char* emergency_dump_path = NULL;
   pos += fsep_len;
-  if (Arguments::copy_expand_pid(filename_fmt, strlen(filename_fmt), &buffer[pos], JVM_MAXPATHLEN - pos)) {
-    const size_t emergency_filename_length = strlen(buffer);
-    emergency_dump_path = NEW_RESOURCE_ARRAY_RETURN_NULL(char, emergency_filename_length + 1);
-    if (NULL == emergency_dump_path) {
-      return NULL;
-    }
-    strncpy(emergency_dump_path, buffer, emergency_filename_length + 1);
-  }
-  if (emergency_dump_path != NULL) {
+  Arguments::copy_expand_pid(filename_fmt, strlen(filename_fmt), &_dump_path[pos], JVM_MAXPATHLEN - pos);
+  if (*_dump_path != '\0') {
     log_info(jfr)( // For user, should not be "jfr, system"
-      "Attempting to recover JFR data, emergency jfr file: %s", emergency_dump_path);
+      "Attempting to recover JFR data, emergency jfr file: %s", _dump_path);
   }
-  return emergency_dump_path;
+  return _dump_path;
 }
 
 // Caller needs ResourceMark
-static const char* create_emergency_chunk_path(const char* repository_path) {
+const char* JfrEmergencyDump::create_emergency_chunk_path(const char* repository_path) {
   assert(repository_path != NULL, "invariant");
+
+  if (*_dump_path != '\0') {
+    return _dump_path;
+  }
+
   const size_t repository_path_len = strlen(repository_path);
   // date time
   char date_time_buffer[32] = { 0 };
   date_time(date_time_buffer, sizeof(date_time_buffer));
   size_t date_time_len = strlen(date_time_buffer);
   size_t chunkname_max_len = repository_path_len          // repository_base_path
                              + 1                          // "/"
                              + date_time_len              // date_time
                              + strlen(chunk_file_jfr_ext) // .jfr
                              + 1;
-  char* chunk_path = NEW_RESOURCE_ARRAY_RETURN_NULL(char, chunkname_max_len);
-  if (chunk_path == NULL) {
-    return NULL;
-  }
   // append the individual substrings
-  jio_snprintf(chunk_path, chunkname_max_len, "%s%s%s%s", repository_path, os::file_separator(), date_time_buffer, chunk_file_jfr_ext);
-  return chunk_path;
+  jio_snprintf(_dump_path, chunkname_max_len, "%s%s%s%s", repository_path, os::file_separator(), date_time_buffer, chunk_file_jfr_ext);
+  return _dump_path;
 }
 
-static fio_fd emergency_dump_file_descriptor() {
+fio_fd JfrEmergencyDump::emergency_dump_file_descriptor() {
   ResourceMark rm;
   const char* const emergency_dump_path = create_emergency_dump_path();
   return emergency_dump_path != NULL ? open_exclusivly(emergency_dump_path) : invalid_fd;
 }
 
< prev index next >