comparison src/share/vm/runtime/os.cpp @ 10986:1f4355cee9a2

8013651: NMT: reserve/release sequence id's in incorrect order due to race Summary: Fixed NMT race condition for realloc, uncommit and release Reviewed-by: coleenp, ccheung
author zgu
date Tue, 18 Jun 2013 08:44:08 -0400
parents a837fa3d3f86
children 5e3b6f79d280 75ef1a499665
comparison
equal deleted inserted replaced
10984:cd2118b62475 10986:1f4355cee9a2
645 645
646 void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller) { 646 void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller) {
647 #ifndef ASSERT 647 #ifndef ASSERT
648 NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1)); 648 NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
649 NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size)); 649 NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
650 MemTracker::Tracker tkr = MemTracker::get_realloc_tracker();
650 void* ptr = ::realloc(memblock, size); 651 void* ptr = ::realloc(memblock, size);
651 if (ptr != NULL) { 652 if (ptr != NULL) {
652 MemTracker::record_realloc((address)memblock, (address)ptr, size, memflags, 653 tkr.record((address)memblock, (address)ptr, size, memflags,
653 caller == 0 ? CALLER_PC : caller); 654 caller == 0 ? CALLER_PC : caller);
655 } else {
656 tkr.discard();
654 } 657 }
655 return ptr; 658 return ptr;
656 #else 659 #else
657 if (memblock == NULL) { 660 if (memblock == NULL) {
658 return malloc(size, memflags, (caller == 0 ? CALLER_PC : caller)); 661 return malloc(size, memflags, (caller == 0 ? CALLER_PC : caller));
1454 } 1457 }
1455 1458
1456 char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { 1459 char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
1457 char* result = pd_reserve_memory(bytes, addr, alignment_hint); 1460 char* result = pd_reserve_memory(bytes, addr, alignment_hint);
1458 if (result != NULL) { 1461 if (result != NULL) {
1459 MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); 1462 MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
1460 } 1463 }
1461 1464
1462 return result; 1465 return result;
1463 } 1466 }
1464 1467
1465 char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, 1468 char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint,
1466 MEMFLAGS flags) { 1469 MEMFLAGS flags) {
1467 char* result = pd_reserve_memory(bytes, addr, alignment_hint); 1470 char* result = pd_reserve_memory(bytes, addr, alignment_hint);
1468 if (result != NULL) { 1471 if (result != NULL) {
1469 MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); 1472 MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
1470 MemTracker::record_virtual_memory_type((address)result, flags); 1473 MemTracker::record_virtual_memory_type((address)result, flags);
1471 } 1474 }
1472 1475
1473 return result; 1476 return result;
1474 } 1477 }
1475 1478
1476 char* os::attempt_reserve_memory_at(size_t bytes, char* addr) { 1479 char* os::attempt_reserve_memory_at(size_t bytes, char* addr) {
1477 char* result = pd_attempt_reserve_memory_at(bytes, addr); 1480 char* result = pd_attempt_reserve_memory_at(bytes, addr);
1478 if (result != NULL) { 1481 if (result != NULL) {
1479 MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); 1482 MemTracker::record_virtual_memory_reserve((address)result, bytes, mtNone, CALLER_PC);
1480 } 1483 }
1481 return result; 1484 return result;
1482 } 1485 }
1483 1486
1484 void os::split_reserved_memory(char *base, size_t size, 1487 void os::split_reserved_memory(char *base, size_t size,
1514 os::pd_commit_memory_or_exit(addr, size, alignment_hint, executable, mesg); 1517 os::pd_commit_memory_or_exit(addr, size, alignment_hint, executable, mesg);
1515 MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC); 1518 MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC);
1516 } 1519 }
1517 1520
1518 bool os::uncommit_memory(char* addr, size_t bytes) { 1521 bool os::uncommit_memory(char* addr, size_t bytes) {
1522 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_uncommit_tracker();
1519 bool res = pd_uncommit_memory(addr, bytes); 1523 bool res = pd_uncommit_memory(addr, bytes);
1520 if (res) { 1524 if (res) {
1521 MemTracker::record_virtual_memory_uncommit((address)addr, bytes); 1525 tkr.record((address)addr, bytes);
1526 } else {
1527 tkr.discard();
1522 } 1528 }
1523 return res; 1529 return res;
1524 } 1530 }
1525 1531
1526 bool os::release_memory(char* addr, size_t bytes) { 1532 bool os::release_memory(char* addr, size_t bytes) {
1533 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
1527 bool res = pd_release_memory(addr, bytes); 1534 bool res = pd_release_memory(addr, bytes);
1528 if (res) { 1535 if (res) {
1529 MemTracker::record_virtual_memory_release((address)addr, bytes); 1536 tkr.record((address)addr, bytes);
1537 } else {
1538 tkr.discard();
1530 } 1539 }
1531 return res; 1540 return res;
1532 } 1541 }
1533 1542
1534 1543
1535 char* os::map_memory(int fd, const char* file_name, size_t file_offset, 1544 char* os::map_memory(int fd, const char* file_name, size_t file_offset,
1536 char *addr, size_t bytes, bool read_only, 1545 char *addr, size_t bytes, bool read_only,
1537 bool allow_exec) { 1546 bool allow_exec) {
1538 char* result = pd_map_memory(fd, file_name, file_offset, addr, bytes, read_only, allow_exec); 1547 char* result = pd_map_memory(fd, file_name, file_offset, addr, bytes, read_only, allow_exec);
1539 if (result != NULL) { 1548 if (result != NULL) {
1540 MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); 1549 MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, mtNone, CALLER_PC);
1541 MemTracker::record_virtual_memory_commit((address)result, bytes, CALLER_PC);
1542 } 1550 }
1543 return result; 1551 return result;
1544 } 1552 }
1545 1553
1546 char* os::remap_memory(int fd, const char* file_name, size_t file_offset, 1554 char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
1549 return pd_remap_memory(fd, file_name, file_offset, addr, bytes, 1557 return pd_remap_memory(fd, file_name, file_offset, addr, bytes,
1550 read_only, allow_exec); 1558 read_only, allow_exec);
1551 } 1559 }
1552 1560
1553 bool os::unmap_memory(char *addr, size_t bytes) { 1561 bool os::unmap_memory(char *addr, size_t bytes) {
1562 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
1554 bool result = pd_unmap_memory(addr, bytes); 1563 bool result = pd_unmap_memory(addr, bytes);
1555 if (result) { 1564 if (result) {
1556 MemTracker::record_virtual_memory_uncommit((address)addr, bytes); 1565 tkr.record((address)addr, bytes);
1557 MemTracker::record_virtual_memory_release((address)addr, bytes); 1566 } else {
1567 tkr.discard();
1558 } 1568 }
1559 return result; 1569 return result;
1560 } 1570 }
1561 1571
1562 void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) { 1572 void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) {