3732 if (addr != NULL) {
3733 // mmap() is successful but it fails to reserve at the requested address
3734 anon_munmap(addr, bytes);
3735 }
3736
3737 int i;
3738 for (i = 0; i < max_tries; ++i) {
3739 base[i] = reserve_memory(bytes);
3740
3741 if (base[i] != NULL) {
3742 // Is this the block we wanted?
3743 if (base[i] == requested_addr) {
3744 size[i] = bytes;
3745 break;
3746 }
3747
3748 // Does this overlap the block we wanted? Give back the overlapped
3749 // parts and try again.
3750
3751 size_t top_overlap = requested_addr + (bytes + gap) - base[i];
3752 if (top_overlap >= 0 && top_overlap < bytes) {
3753 unmap_memory(base[i], top_overlap);
3754 base[i] += top_overlap;
3755 size[i] = bytes - top_overlap;
3756 } else {
3757 size_t bottom_overlap = base[i] + bytes - requested_addr;
3758 if (bottom_overlap >= 0 && bottom_overlap < bytes) {
3759 unmap_memory(requested_addr, bottom_overlap);
3760 size[i] = bytes - bottom_overlap;
3761 } else {
3762 size[i] = bytes;
3763 }
3764 }
3765 }
3766 }
3767
3768 // Give back the unused reserved pieces.
3769
3770 for (int j = 0; j < i; ++j) {
3771 if (base[j] != NULL) {
3772 unmap_memory(base[j], size[j]);
3773 }
3774 }
3775
3776 if (i < max_tries) {
3777 _highest_vm_reserved_address = MAX2(old_highest, (address)requested_addr + bytes);
3778 return requested_addr;
6028 if (core_pattern[0] == '/') {
6029 written = jio_snprintf(buffer, bufferSize, core_pattern);
6030 } else {
6031 char cwd[PATH_MAX];
6032
6033 const char* p = get_current_directory(cwd, PATH_MAX);
6034 if (p == NULL) {
6035 assert(p != NULL, "failed to get current directory");
6036 return 0;
6037 }
6038
6039 if (core_pattern[0] == '|') {
6040 written = jio_snprintf(buffer, bufferSize,
6041 "\"%s\" (or dumping to %s/core.%d)",
6042 &core_pattern[1], p, current_process_id());
6043 } else {
6044 written = jio_snprintf(buffer, bufferSize, "%s/%s", p, core_pattern);
6045 }
6046 }
6047
6048 if ((written >= 0) && (written < bufferSize)
6049 && (pid_pos == NULL) && (core_pattern[0] != '|')) {
6050 int core_uses_pid_file = ::open("/proc/sys/kernel/core_uses_pid", O_RDONLY);
6051
6052 if (core_uses_pid_file != -1) {
6053 char core_uses_pid = 0;
6054 ssize_t ret = ::read(core_uses_pid_file, &core_uses_pid, 1);
6055 ::close(core_uses_pid_file);
6056
6057 if (core_uses_pid == '1'){
6058 jio_snprintf(buffer + written, bufferSize - written,
6059 ".%d", current_process_id());
6060 }
6061 }
6062 }
6063
6064 return strlen(buffer);
6065 }
6066
6067 /////////////// Unit tests ///////////////
6068
6069 #ifndef PRODUCT
|
3732 if (addr != NULL) {
3733 // mmap() is successful but it fails to reserve at the requested address
3734 anon_munmap(addr, bytes);
3735 }
3736
3737 int i;
3738 for (i = 0; i < max_tries; ++i) {
3739 base[i] = reserve_memory(bytes);
3740
3741 if (base[i] != NULL) {
3742 // Is this the block we wanted?
3743 if (base[i] == requested_addr) {
3744 size[i] = bytes;
3745 break;
3746 }
3747
3748 // Does this overlap the block we wanted? Give back the overlapped
3749 // parts and try again.
3750
3751 size_t top_overlap = requested_addr + (bytes + gap) - base[i];
3752 if (top_overlap < bytes) {
3753 unmap_memory(base[i], top_overlap);
3754 base[i] += top_overlap;
3755 size[i] = bytes - top_overlap;
3756 } else {
3757 size_t bottom_overlap = base[i] + bytes - requested_addr;
3758 if (bottom_overlap < bytes) {
3759 unmap_memory(requested_addr, bottom_overlap);
3760 size[i] = bytes - bottom_overlap;
3761 } else {
3762 size[i] = bytes;
3763 }
3764 }
3765 }
3766 }
3767
3768 // Give back the unused reserved pieces.
3769
3770 for (int j = 0; j < i; ++j) {
3771 if (base[j] != NULL) {
3772 unmap_memory(base[j], size[j]);
3773 }
3774 }
3775
3776 if (i < max_tries) {
3777 _highest_vm_reserved_address = MAX2(old_highest, (address)requested_addr + bytes);
3778 return requested_addr;
6028 if (core_pattern[0] == '/') {
6029 written = jio_snprintf(buffer, bufferSize, core_pattern);
6030 } else {
6031 char cwd[PATH_MAX];
6032
6033 const char* p = get_current_directory(cwd, PATH_MAX);
6034 if (p == NULL) {
6035 assert(p != NULL, "failed to get current directory");
6036 return 0;
6037 }
6038
6039 if (core_pattern[0] == '|') {
6040 written = jio_snprintf(buffer, bufferSize,
6041 "\"%s\" (or dumping to %s/core.%d)",
6042 &core_pattern[1], p, current_process_id());
6043 } else {
6044 written = jio_snprintf(buffer, bufferSize, "%s/%s", p, core_pattern);
6045 }
6046 }
6047
6048 if ((written < bufferSize) && (pid_pos == NULL) && (core_pattern[0] != '|')) {
6049 int core_uses_pid_file = ::open("/proc/sys/kernel/core_uses_pid", O_RDONLY);
6050
6051 if (core_uses_pid_file != -1) {
6052 char core_uses_pid = 0;
6053 ssize_t ret = ::read(core_uses_pid_file, &core_uses_pid, 1);
6054 ::close(core_uses_pid_file);
6055
6056 if (core_uses_pid == '1'){
6057 jio_snprintf(buffer + written, bufferSize - written,
6058 ".%d", current_process_id());
6059 }
6060 }
6061 }
6062
6063 return strlen(buffer);
6064 }
6065
6066 /////////////// Unit tests ///////////////
6067
6068 #ifndef PRODUCT
|