hotspot/src/os/linux/vm/os_linux.cpp
changeset 29580 a67a581cfe11
parent 29474 81a5c5330d08
child 30125 8ba6e8e367e9
equal deleted inserted replaced
29477:82f545c6572b 29580:a67a581cfe11
  3730       }
  3730       }
  3731 
  3731 
  3732       // Does this overlap the block we wanted? Give back the overlapped
  3732       // Does this overlap the block we wanted? Give back the overlapped
  3733       // parts and try again.
  3733       // parts and try again.
  3734 
  3734 
  3735       size_t top_overlap = requested_addr + (bytes + gap) - base[i];
  3735       ptrdiff_t top_overlap = requested_addr + (bytes + gap) - base[i];
  3736       if (top_overlap >= 0 && top_overlap < bytes) {
  3736       if (top_overlap >= 0 && (size_t)top_overlap < bytes) {
  3737         unmap_memory(base[i], top_overlap);
  3737         unmap_memory(base[i], top_overlap);
  3738         base[i] += top_overlap;
  3738         base[i] += top_overlap;
  3739         size[i] = bytes - top_overlap;
  3739         size[i] = bytes - top_overlap;
  3740       } else {
  3740       } else {
  3741         size_t bottom_overlap = base[i] + bytes - requested_addr;
  3741         ptrdiff_t bottom_overlap = base[i] + bytes - requested_addr;
  3742         if (bottom_overlap >= 0 && bottom_overlap < bytes) {
  3742         if (bottom_overlap >= 0 && (size_t)bottom_overlap < bytes) {
  3743           unmap_memory(requested_addr, bottom_overlap);
  3743           unmap_memory(requested_addr, bottom_overlap);
  3744           size[i] = bytes - bottom_overlap;
  3744           size[i] = bytes - bottom_overlap;
  3745         } else {
  3745         } else {
  3746           size[i] = bytes;
  3746           size[i] = bytes;
  3747         }
  3747         }
  6001       }
  6001       }
  6002     }
  6002     }
  6003   }
  6003   }
  6004 
  6004 
  6005   if (strlen(core_pattern) == 0) {
  6005   if (strlen(core_pattern) == 0) {
  6006     return 0;
  6006     return -1;
  6007   }
  6007   }
  6008 
  6008 
  6009   char *pid_pos = strstr(core_pattern, "%p");
  6009   char *pid_pos = strstr(core_pattern, "%p");
  6010   size_t written;
  6010   int written;
  6011 
  6011 
  6012   if (core_pattern[0] == '/') {
  6012   if (core_pattern[0] == '/') {
  6013     written = jio_snprintf(buffer, bufferSize, core_pattern);
  6013     written = jio_snprintf(buffer, bufferSize, core_pattern);
  6014   } else {
  6014   } else {
  6015     char cwd[PATH_MAX];
  6015     char cwd[PATH_MAX];
  6016 
  6016 
  6017     const char* p = get_current_directory(cwd, PATH_MAX);
  6017     const char* p = get_current_directory(cwd, PATH_MAX);
  6018     if (p == NULL) {
  6018     if (p == NULL) {
  6019       assert(p != NULL, "failed to get current directory");
  6019       return -1;
  6020       return 0;
       
  6021     }
  6020     }
  6022 
  6021 
  6023     if (core_pattern[0] == '|') {
  6022     if (core_pattern[0] == '|') {
  6024       written = jio_snprintf(buffer, bufferSize,
  6023       written = jio_snprintf(buffer, bufferSize,
  6025                         "\"%s\" (or dumping to %s/core.%d)",
  6024                         "\"%s\" (or dumping to %s/core.%d)",
  6027     } else {
  6026     } else {
  6028       written = jio_snprintf(buffer, bufferSize, "%s/%s", p, core_pattern);
  6027       written = jio_snprintf(buffer, bufferSize, "%s/%s", p, core_pattern);
  6029     }
  6028     }
  6030   }
  6029   }
  6031 
  6030 
  6032   if ((written >= 0) && (written < bufferSize)
  6031   if (written < 0) {
  6033             && (pid_pos == NULL) && (core_pattern[0] != '|')) {
  6032     return -1;
       
  6033   }
       
  6034 
       
  6035   if (((size_t)written < bufferSize) && (pid_pos == NULL) && (core_pattern[0] != '|')) {
  6034     int core_uses_pid_file = ::open("/proc/sys/kernel/core_uses_pid", O_RDONLY);
  6036     int core_uses_pid_file = ::open("/proc/sys/kernel/core_uses_pid", O_RDONLY);
  6035 
  6037 
  6036     if (core_uses_pid_file != -1) {
  6038     if (core_uses_pid_file != -1) {
  6037       char core_uses_pid = 0;
  6039       char core_uses_pid = 0;
  6038       ssize_t ret = ::read(core_uses_pid_file, &core_uses_pid, 1);
  6040       ssize_t ret = ::read(core_uses_pid_file, &core_uses_pid, 1);
  6039       ::close(core_uses_pid_file);
  6041       ::close(core_uses_pid_file);
  6040 
  6042 
  6041       if (core_uses_pid == '1'){
  6043       if (core_uses_pid == '1') {
  6042         jio_snprintf(buffer + written, bufferSize - written,
  6044         jio_snprintf(buffer + written, bufferSize - written,
  6043                                           ".%d", current_process_id());
  6045                                           ".%d", current_process_id());
  6044       }
  6046       }
  6045     }
  6047     }
  6046   }
  6048   }