< prev index next >

src/share/vm/runtime/os.cpp

Print this page
rev 12652 : 8168542: os::realloc should return a valid pointer for input size=0
Reviewed-by: dholmes, cjplummer, dsamersoff, rehn


 632   debug_only(if (paranoid) verify_memory(ptr));
 633   if (PrintMalloc && tty != NULL) {
 634     tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, p2i(ptr));
 635   }
 636 
 637   // we do not track guard memory
 638   return MemTracker::record_malloc((address)ptr, size, memflags, stack, level);
 639 }
 640 
 641 void* os::realloc(void *memblock, size_t size, MEMFLAGS flags) {
 642   return os::realloc(memblock, size, flags, CALLER_PC);
 643 }
 644 
 645 void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, const NativeCallStack& stack) {
 646 
 647   // For the test flag -XX:MallocMaxTestWords
 648   if (has_reached_max_malloc_test_peak(size)) {
 649     return NULL;
 650   }
 651 






 652 #ifndef ASSERT
 653   NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
 654   NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
 655    // NMT support
 656   void* membase = MemTracker::record_free(memblock);
 657   NMT_TrackingLevel level = MemTracker::tracking_level();
 658   size_t  nmt_header_size = MemTracker::malloc_header_size(level);
 659   void* ptr = ::realloc(membase, size + nmt_header_size);
 660   return MemTracker::record_malloc(ptr, size, memflags, stack, level);
 661 #else
 662   if (memblock == NULL) {
 663     return os::malloc(size, memflags, stack);
 664   }
 665   if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
 666     tty->print_cr("os::realloc caught " PTR_FORMAT, p2i(memblock));
 667     breakpoint();
 668   }
 669   // NMT support
 670   void* membase = MemTracker::malloc_base(memblock);
 671   verify_memory(membase);
 672   if (size == 0) {
 673     return NULL;
 674   }
 675   // always move the block
 676   void* ptr = os::malloc(size, memflags, stack);
 677   if (PrintMalloc && tty != NULL) {
 678     tty->print_cr("os::realloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, p2i(memblock), p2i(ptr));
 679   }
 680   // Copy to new memory if malloc didn't fail
 681   if ( ptr != NULL ) {
 682     GuardedMemory guarded(MemTracker::malloc_base(memblock));
 683     // Guard's user data contains NMT header
 684     size_t memblock_size = guarded.get_user_size() - MemTracker::malloc_header_size(memblock);
 685     memcpy(ptr, memblock, MIN2(size, memblock_size));
 686     if (paranoid) verify_memory(MemTracker::malloc_base(ptr));
 687     if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
 688       tty->print_cr("os::realloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, p2i(ptr));
 689       breakpoint();
 690     }
 691     os::free(memblock);
 692   }
 693   return ptr;
 694 #endif




 632   debug_only(if (paranoid) verify_memory(ptr));
 633   if (PrintMalloc && tty != NULL) {
 634     tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, p2i(ptr));
 635   }
 636 
 637   // we do not track guard memory
 638   return MemTracker::record_malloc((address)ptr, size, memflags, stack, level);
 639 }
 640 
 641 void* os::realloc(void *memblock, size_t size, MEMFLAGS flags) {
 642   return os::realloc(memblock, size, flags, CALLER_PC);
 643 }
 644 
 645 void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, const NativeCallStack& stack) {
 646 
 647   // For the test flag -XX:MallocMaxTestWords
 648   if (has_reached_max_malloc_test_peak(size)) {
 649     return NULL;
 650   }
 651 
 652   if (size == 0) {
 653     // return a valid pointer if size is zero
 654     // if NULL is returned the calling functions assume out of memory.
 655     size = 1;
 656   }
 657 
 658 #ifndef ASSERT
 659   NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1));
 660   NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size));
 661    // NMT support
 662   void* membase = MemTracker::record_free(memblock);
 663   NMT_TrackingLevel level = MemTracker::tracking_level();
 664   size_t  nmt_header_size = MemTracker::malloc_header_size(level);
 665   void* ptr = ::realloc(membase, size + nmt_header_size);
 666   return MemTracker::record_malloc(ptr, size, memflags, stack, level);
 667 #else
 668   if (memblock == NULL) {
 669     return os::malloc(size, memflags, stack);
 670   }
 671   if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
 672     tty->print_cr("os::realloc caught " PTR_FORMAT, p2i(memblock));
 673     breakpoint();
 674   }
 675   // NMT support
 676   void* membase = MemTracker::malloc_base(memblock);
 677   verify_memory(membase);



 678   // always move the block
 679   void* ptr = os::malloc(size, memflags, stack);
 680   if (PrintMalloc && tty != NULL) {
 681     tty->print_cr("os::realloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, p2i(memblock), p2i(ptr));
 682   }
 683   // Copy to new memory if malloc didn't fail
 684   if ( ptr != NULL ) {
 685     GuardedMemory guarded(MemTracker::malloc_base(memblock));
 686     // Guard's user data contains NMT header
 687     size_t memblock_size = guarded.get_user_size() - MemTracker::malloc_header_size(memblock);
 688     memcpy(ptr, memblock, MIN2(size, memblock_size));
 689     if (paranoid) verify_memory(MemTracker::malloc_base(ptr));
 690     if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
 691       tty->print_cr("os::realloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, p2i(ptr));
 692       breakpoint();
 693     }
 694     os::free(memblock);
 695   }
 696   return ptr;
 697 #endif


< prev index next >