< prev index next >

src/hotspot/os/posix/os_posix.cpp

Print this page




 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;


< prev index next >