159 160 size_t os::lasterror(char *buf, size_t len) { 161 if (errno == 0) return 0; 162 163 const char *s = os::strerror(errno); 164 size_t n = ::strlen(s); 165 if (n >= len) { 166 n = len - 1; 167 } 168 ::strncpy(buf, s, n); 169 buf[n] = '\0'; 170 return n; 171 } 172 173 void os::wait_for_keypress_at_exit(void) { 174 // don't do anything on posix platforms 175 return; 176 } 177 178 int os::create_file_for_heap(const char* dir) { 179 180 const char name_template[] = "/jvmheap.XXXXXX"; 181 182 size_t fullname_len = strlen(dir) + strlen(name_template); 183 char *fullname = (char*)os::malloc(fullname_len + 1, mtInternal); 184 if (fullname == NULL) { 185 vm_exit_during_initialization(err_msg("Malloc failed during creation of backing file for heap (%s)", os::strerror(errno))); 186 return -1; 187 } 188 int n = snprintf(fullname, fullname_len + 1, "%s%s", dir, name_template); 189 assert((size_t)n == fullname_len, "Unexpected number of characters in string"); 190 191 os::native_path(fullname); 192 193 // set the file creation mask. 194 mode_t file_mode = S_IRUSR | S_IWUSR; 195 196 // create a new file. 197 int fd = mkstemp(fullname); 198 199 if (fd < 0) { 200 warning("Could not create file for heap with template %s", fullname); 201 os::free(fullname); 202 return -1; 203 } 204 205 // delete the name from the filesystem. When 'fd' is closed, the file (and space) will be deleted. 206 int ret = unlink(fullname); 207 assert_with_errno(ret == 0, "unlink returned error"); 208 209 os::free(fullname); 210 return fd; 211 } 212 213 static char* reserve_mmapped_memory(size_t bytes, char* requested_addr) { 214 char * addr; 215 int flags = MAP_PRIVATE NOT_AIX( | MAP_NORESERVE ) | MAP_ANONYMOUS; 216 if (requested_addr != NULL) { 217 assert((uintptr_t)requested_addr % os::vm_page_size() == 0, "Requested address should be aligned to OS page size"); 218 flags |= MAP_FIXED; 219 } 220 221 // Map reserved/uncommitted pages PROT_NONE so we fail early if we 222 // touch an uncommitted page. Otherwise, the read/write might 223 // succeed if we have enough swap space to back the physical page. 224 addr = (char*)::mmap(requested_addr, bytes, PROT_NONE, 225 flags, -1, 0); 226 227 if (addr != MAP_FAILED) { 228 MemTracker::record_virtual_memory_reserve((address)addr, bytes, CALLER_PC); 229 return addr; | 159 160 size_t os::lasterror(char *buf, size_t len) { 161 if (errno == 0) return 0; 162 163 const char *s = os::strerror(errno); 164 size_t n = ::strlen(s); 165 if (n >= len) { 166 n = len - 1; 167 } 168 ::strncpy(buf, s, n); 169 buf[n] = '\0'; 170 return n; 171 } 172 173 void os::wait_for_keypress_at_exit(void) { 174 // don't do anything on posix platforms 175 return; 176 } 177 178 int os::create_file_for_heap(const char* dir) { 179 int fd; 180 181 #if defined(LINUX) && defined(O_TMPFILE) 182 char* native_dir = os::strdup(dir); 183 if (native_dir == NULL) { 184 vm_exit_during_initialization(err_msg("strdup failed during creation of backing file for heap (%s)", os::strerror(errno))); 185 return -1; 186 } 187 os::native_path(native_dir); 188 fd = os::open(dir, O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); 189 os::free(native_dir); 190 191 if (fd == -1) 192 #endif 193 { 194 const char name_template[] = "/jvmheap.XXXXXX"; 195 196 size_t fullname_len = strlen(dir) + strlen(name_template); 197 char *fullname = (char*)os::malloc(fullname_len + 1, mtInternal); 198 if (fullname == NULL) { 199 vm_exit_during_initialization(err_msg("Malloc failed during creation of backing file for heap (%s)", os::strerror(errno))); 200 return -1; 201 } 202 int n = snprintf(fullname, fullname_len + 1, "%s%s", dir, name_template); 203 assert((size_t)n == fullname_len, "Unexpected number of characters in string"); 204 205 os::native_path(fullname); 206 207 // create a new file. 208 fd = mkstemp(fullname); 209 210 if (fd < 0) { 211 warning("Could not create file for heap with template %s", fullname); 212 os::free(fullname); 213 return -1; 214 } else { 215 // delete the name from the filesystem. When 'fd' is closed, the file (and space) will be deleted. 216 int ret = unlink(fullname); 217 assert_with_errno(ret == 0, "unlink returned error"); 218 } 219 220 os::free(fullname); 221 } 222 223 return fd; 224 } 225 226 static char* reserve_mmapped_memory(size_t bytes, char* requested_addr) { 227 char * addr; 228 int flags = MAP_PRIVATE NOT_AIX( | MAP_NORESERVE ) | MAP_ANONYMOUS; 229 if (requested_addr != NULL) { 230 assert((uintptr_t)requested_addr % os::vm_page_size() == 0, "Requested address should be aligned to OS page size"); 231 flags |= MAP_FIXED; 232 } 233 234 // Map reserved/uncommitted pages PROT_NONE so we fail early if we 235 // touch an uncommitted page. Otherwise, the read/write might 236 // succeed if we have enough swap space to back the physical page. 237 addr = (char*)::mmap(requested_addr, bytes, PROT_NONE, 238 flags, -1, 0); 239 240 if (addr != MAP_FAILED) { 241 MemTracker::record_virtual_memory_reserve((address)addr, bytes, CALLER_PC); 242 return addr; |