Mercurial > hg > truffle
comparison src/share/vm/memory/allocation.inline.hpp @ 6872:7b5885dadbdc
8000617: It should be possible to allocate memory without the VM dying.
Reviewed-by: coleenp, kamg
author | nloodin |
---|---|
date | Wed, 17 Oct 2012 17:36:48 +0200 |
parents | b9a9ed0f8eeb |
children | 63e54c37ac64 |
comparison
equal
deleted
inserted
replaced
6871:045cb62046a7 | 6872:7b5885dadbdc |
---|---|
46 #endif | 46 #endif |
47 } | 47 } |
48 #endif | 48 #endif |
49 | 49 |
50 // allocate using malloc; will fail if no memory available | 50 // allocate using malloc; will fail if no memory available |
51 inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0) { | 51 inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0, |
52 AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { | |
52 if (pc == 0) { | 53 if (pc == 0) { |
53 pc = CURRENT_PC; | 54 pc = CURRENT_PC; |
54 } | 55 } |
55 char* p = (char*) os::malloc(size, flags, pc); | 56 char* p = (char*) os::malloc(size, flags, pc); |
56 #ifdef ASSERT | 57 #ifdef ASSERT |
57 if (PrintMallocFree) trace_heap_malloc(size, "AllocateHeap", p); | 58 if (PrintMallocFree) trace_heap_malloc(size, "AllocateHeap", p); |
58 #endif | 59 #endif |
59 if (p == NULL) vm_exit_out_of_memory(size, "AllocateHeap"); | 60 if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) vm_exit_out_of_memory(size, "AllocateHeap"); |
60 return p; | 61 return p; |
61 } | 62 } |
62 | 63 |
63 inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags) { | 64 inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags, |
65 AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { | |
64 char* p = (char*) os::realloc(old, size, flags, CURRENT_PC); | 66 char* p = (char*) os::realloc(old, size, flags, CURRENT_PC); |
65 #ifdef ASSERT | 67 #ifdef ASSERT |
66 if (PrintMallocFree) trace_heap_malloc(size, "ReallocateHeap", p); | 68 if (PrintMallocFree) trace_heap_malloc(size, "ReallocateHeap", p); |
67 #endif | 69 #endif |
68 if (p == NULL) vm_exit_out_of_memory(size, "ReallocateHeap"); | 70 if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) vm_exit_out_of_memory(size, "ReallocateHeap"); |
69 return p; | 71 return p; |
70 } | 72 } |
71 | 73 |
72 inline void FreeHeap(void* p, MEMFLAGS memflags = mtInternal) { | 74 inline void FreeHeap(void* p, MEMFLAGS memflags = mtInternal) { |
73 #ifdef ASSERT | 75 #ifdef ASSERT |
89 } | 91 } |
90 | 92 |
91 template <MEMFLAGS F> void* CHeapObj<F>::operator new (size_t size, | 93 template <MEMFLAGS F> void* CHeapObj<F>::operator new (size_t size, |
92 const std::nothrow_t& nothrow_constant, address caller_pc) { | 94 const std::nothrow_t& nothrow_constant, address caller_pc) { |
93 #ifdef ASSERT | 95 #ifdef ASSERT |
94 void* p = os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC)); | 96 void* p = (void*)AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC), |
97 AllocFailStrategy::RETURN_NULL); | |
95 if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p); | 98 if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p); |
96 return p; | 99 return p; |
97 #else | 100 #else |
98 return os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC)); | 101 return (void *) AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC), |
102 AllocFailStrategy::RETURN_NULL); | |
99 #endif | 103 #endif |
100 } | 104 } |
101 | 105 |
102 template <MEMFLAGS F> void CHeapObj<F>::operator delete(void* p){ | 106 template <MEMFLAGS F> void CHeapObj<F>::operator delete(void* p){ |
103 FreeHeap(p, F); | 107 FreeHeap(p, F); |