3387 int err = errno; 3388 3389 // Remove shmid. If shmat() is successful, the actual shared memory segment 3390 // will be deleted when it's detached by shmdt() or when the process 3391 // terminates. If shmat() is not successful this will remove the shared 3392 // segment immediately. 3393 shmctl(shmid, IPC_RMID, NULL); 3394 3395 if (retAddr == (char *) -1) { 3396 if (warn_on_failure) { 3397 jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err); 3398 warning(msg); 3399 } 3400 return NULL; 3401 } 3402 if ((retAddr != NULL) && UseNUMAInterleaving) { 3403 numa_make_global(retAddr, size); 3404 } 3405 3406 // The memory is committed 3407 address pc = CALLER_PC; 3408 MemTracker::record_virtual_memory_reserve((address)retAddr, size, pc); 3409 MemTracker::record_virtual_memory_commit((address)retAddr, size, pc); 3410 3411 return retAddr; 3412 } 3413 3414 bool os::release_memory_special(char* base, size_t bytes) { 3415 // detaching the SHM segment will also delete it, see reserve_memory_special() 3416 int rslt = shmdt(base); 3417 if (rslt == 0) { 3418 MemTracker::record_virtual_memory_uncommit((address)base, bytes); 3419 MemTracker::record_virtual_memory_release((address)base, bytes); 3420 return true; 3421 } else { 3422 return false; 3423 } 3424 } 3425 3426 size_t os::large_page_size() { 3427 return _large_page_size; 3428 } 3429 3430 // MPSS allows application to commit large page memory on demand; with ISM 3431 // the entire memory region must be allocated as shared memory. 3432 bool os::can_commit_large_page_memory() { 3433 return UseISM ? false : true; 3434 } 3435 3436 bool os::can_execute_large_page_memory() { 3437 return UseISM ? false : true; 3438 } 3439 3440 static int os_sleep(jlong millis, bool interruptible) { 3441 const jlong limit = INT_MAX; | 3387 int err = errno; 3388 3389 // Remove shmid. If shmat() is successful, the actual shared memory segment 3390 // will be deleted when it's detached by shmdt() or when the process 3391 // terminates. If shmat() is not successful this will remove the shared 3392 // segment immediately. 3393 shmctl(shmid, IPC_RMID, NULL); 3394 3395 if (retAddr == (char *) -1) { 3396 if (warn_on_failure) { 3397 jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err); 3398 warning(msg); 3399 } 3400 return NULL; 3401 } 3402 if ((retAddr != NULL) && UseNUMAInterleaving) { 3403 numa_make_global(retAddr, size); 3404 } 3405 3406 // The memory is committed 3407 NMTTrackOp op(NMTTrackOp::ReserveAndCommitOp); 3408 op.execute_op((address)retAddr, size, 0, CALLER_PC); 3409 3410 return retAddr; 3411 } 3412 3413 bool os::release_memory_special(char* base, size_t bytes) { 3414 NMTTrackOp op(NMTTrackOp::ReleaseOp); 3415 // detaching the SHM segment will also delete it, see reserve_memory_special() 3416 int rslt = shmdt(base); 3417 if (rslt == 0) { 3418 op.execute_op((address)base, bytes); 3419 return true; 3420 } else { 3421 op.abort_op(); 3422 return false; 3423 } 3424 } 3425 3426 size_t os::large_page_size() { 3427 return _large_page_size; 3428 } 3429 3430 // MPSS allows application to commit large page memory on demand; with ISM 3431 // the entire memory region must be allocated as shared memory. 3432 bool os::can_commit_large_page_memory() { 3433 return UseISM ? false : true; 3434 } 3435 3436 bool os::can_execute_large_page_memory() { 3437 return UseISM ? false : true; 3438 } 3439 3440 static int os_sleep(jlong millis, bool interruptible) { 3441 const jlong limit = INT_MAX; |