mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 11:04:34 +02:00
8000617: It should be possible to allocate memory without the VM dying
Reviewed-by: coleenp, kamg
This commit is contained in:
parent
228b4f6d7f
commit
953bec36ab
7 changed files with 87 additions and 33 deletions
|
@ -48,7 +48,8 @@ inline void inc_stat_counter(volatile julong* dest, julong add_value) {
|
|||
#endif
|
||||
|
||||
// allocate using malloc; will fail if no memory available
|
||||
inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0) {
|
||||
inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0,
|
||||
AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) {
|
||||
if (pc == 0) {
|
||||
pc = CURRENT_PC;
|
||||
}
|
||||
|
@ -56,16 +57,17 @@ inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0) {
|
|||
#ifdef ASSERT
|
||||
if (PrintMallocFree) trace_heap_malloc(size, "AllocateHeap", p);
|
||||
#endif
|
||||
if (p == NULL) vm_exit_out_of_memory(size, "AllocateHeap");
|
||||
if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) vm_exit_out_of_memory(size, "AllocateHeap");
|
||||
return p;
|
||||
}
|
||||
|
||||
inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags) {
|
||||
inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags,
|
||||
AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) {
|
||||
char* p = (char*) os::realloc(old, size, flags, CURRENT_PC);
|
||||
#ifdef ASSERT
|
||||
if (PrintMallocFree) trace_heap_malloc(size, "ReallocateHeap", p);
|
||||
#endif
|
||||
if (p == NULL) vm_exit_out_of_memory(size, "ReallocateHeap");
|
||||
if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) vm_exit_out_of_memory(size, "ReallocateHeap");
|
||||
return p;
|
||||
}
|
||||
|
||||
|
@ -91,11 +93,13 @@ template <MEMFLAGS F> void* CHeapObj<F>::operator new(size_t size,
|
|||
template <MEMFLAGS F> void* CHeapObj<F>::operator new (size_t size,
|
||||
const std::nothrow_t& nothrow_constant, address caller_pc) {
|
||||
#ifdef ASSERT
|
||||
void* p = os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
|
||||
void* p = (void*)AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC),
|
||||
AllocFailStrategy::RETURN_NULL);
|
||||
if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p);
|
||||
return p;
|
||||
#else
|
||||
return os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
|
||||
return (void *) AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC),
|
||||
AllocFailStrategy::RETURN_NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue