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 } |