8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
Reviewed-by: coleenp, zgu, hseigel
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -824,7 +824,7 @@
// allocate new buffer and initialize
info = (Dl_serinfo*)malloc(_info.dls_size);
if (info == NULL) {
- vm_exit_out_of_memory(_info.dls_size,
+ vm_exit_out_of_memory(_info.dls_size, OOM_MALLOC_ERROR,
"init_system_properties_values info");
}
info->dls_size = _info.dls_size;
@@ -866,7 +866,7 @@
common_path = malloc(bufsize);
if (common_path == NULL) {
free(info);
- vm_exit_out_of_memory(bufsize,
+ vm_exit_out_of_memory(bufsize, OOM_MALLOC_ERROR,
"init_system_properties_values common_path");
}
sprintf(common_path, COMMON_DIR "/lib/%s", cpu_arch);
@@ -879,7 +879,7 @@
if (library_path == NULL) {
free(info);
free(common_path);
- vm_exit_out_of_memory(bufsize,
+ vm_exit_out_of_memory(bufsize, OOM_MALLOC_ERROR,
"init_system_properties_values library_path");
}
library_path[0] = '\0';
@@ -1623,7 +1623,8 @@
// %%% this is used only in threadLocalStorage.cpp
if (thr_setspecific((thread_key_t)index, value)) {
if (errno == ENOMEM) {
- vm_exit_out_of_memory(SMALLINT, "thr_setspecific: out of swap space");
+ vm_exit_out_of_memory(SMALLINT, OOM_MALLOC_ERROR,
+ "thr_setspecific: out of swap space");
} else {
fatal(err_msg("os::thread_local_storage_at_put: thr_setspecific failed "
"(%s)", strerror(errno)));
--- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -178,7 +178,7 @@
// JVM needs to know exact stack location, abort if it fails
if (rslt != 0) {
if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, "pthread_getattr_np");
+ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
} else {
fatal(err_msg("pthread_getattr_np failed with errno = %d", rslt));
}
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -710,7 +710,7 @@
// JVM needs to know exact stack location, abort if it fails
if (rslt != 0) {
if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, "pthread_getattr_np");
+ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
} else {
fatal(err_msg("pthread_getattr_np failed with errno = %d", rslt));
}
--- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -313,7 +313,7 @@
int res = pthread_getattr_np(pthread_self(), &attr);
if (res != 0) {
if (res == ENOMEM) {
- vm_exit_out_of_memory(0, "pthread_getattr_np");
+ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
}
else {
fatal(err_msg("pthread_getattr_np failed with errno = %d", res));
--- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -591,7 +591,7 @@
// on the thread stack, which could get a mapping error when touched.
address addr = (address) info->si_addr;
if (sig == SIGBUS && info->si_code == BUS_OBJERR && info->si_errno == ENOMEM) {
- vm_exit_out_of_memory(0, "Out of swap space to map in thread stack.");
+ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "Out of swap space to map in thread stack.");
}
VMError err(t, sig, pc, info, ucVoid);
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -745,7 +745,7 @@
// on the thread stack, which could get a mapping error when touched.
address addr = (address) info->si_addr;
if (sig == SIGBUS && info->si_code == BUS_OBJERR && info->si_errno == ENOMEM) {
- vm_exit_out_of_memory(0, "Out of swap space to map in thread stack.");
+ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "Out of swap space to map in thread stack.");
}
VMError err(t, sig, pc, info, ucVoid);
--- a/hotspot/src/share/vm/asm/assembler.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/asm/assembler.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -44,7 +44,7 @@
CodeSection* cs = code->insts();
cs->clear_mark(); // new assembler kills old mark
if (cs->start() == NULL) {
- vm_exit_out_of_memory(0, err_msg("CodeCache: no room for %s",
+ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, err_msg("CodeCache: no room for %s",
code->name()));
}
_code_section = cs;
--- a/hotspot/src/share/vm/code/stubs.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/code/stubs.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -67,7 +67,7 @@
intptr_t size = round_to(buffer_size, 2*BytesPerWord);
BufferBlob* blob = BufferBlob::create(name, size);
if( blob == NULL) {
- vm_exit_out_of_memory(size, err_msg("CodeCache: no room for %s", name));
+ vm_exit_out_of_memory(size, OOM_MALLOC_ERROR, err_msg("CodeCache: no room for %s", name));
}
_stub_interface = stub_interface;
_buffer_size = blob->content_size();
--- a/hotspot/src/share/vm/code/vtableStubs.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/code/vtableStubs.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -60,7 +60,7 @@
const int bytes = chunk_factor * real_size + pd_code_alignment();
BufferBlob* blob = BufferBlob::create("vtable chunks", bytes);
if (blob == NULL) {
- vm_exit_out_of_memory(bytes, "CodeCache: no room for vtable chunks");
+ vm_exit_out_of_memory(bytes, OOM_MALLOC_ERROR, "CodeCache: no room for vtable chunks");
}
_chunk = blob->content_begin();
_chunk_end = _chunk + bytes;
--- a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -77,7 +77,7 @@
assert(delta > 0, "just checking");
if (!_vs.expand_by(delta)) {
// Do better than this for Merlin
- vm_exit_out_of_memory(delta, "offset table expansion");
+ vm_exit_out_of_memory(delta, OOM_MMAP_ERROR, "offset table expansion");
}
assert(_vs.high() == high + delta, "invalid expansion");
// Initialization of the contents is left to the
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -1831,7 +1831,7 @@
if (G1ExitOnExpansionFailure &&
_g1_storage.uncommitted_size() >= aligned_expand_bytes) {
// We had head room...
- vm_exit_out_of_memory(aligned_expand_bytes, "G1 heap expansion");
+ vm_exit_out_of_memory(aligned_expand_bytes, OOM_MMAP_ERROR, "G1 heap expansion");
}
}
return successful;
@@ -3614,7 +3614,7 @@
uint array_length = g1_policy()->young_cset_region_length();
_surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC);
if (_surviving_young_words == NULL) {
- vm_exit_out_of_memory(sizeof(size_t) * array_length,
+ vm_exit_out_of_memory(sizeof(size_t) * array_length, OOM_MALLOC_ERROR,
"Not enough space for young surv words summary.");
}
memset(_surviving_young_words, 0, (size_t) array_length * sizeof(size_t));
@@ -4397,7 +4397,7 @@
PADDING_ELEM_NUM;
_surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length, mtGC);
if (_surviving_young_words_base == NULL)
- vm_exit_out_of_memory(array_length * sizeof(size_t),
+ vm_exit_out_of_memory(array_length * sizeof(size_t), OOM_MALLOC_ERROR,
"Not enough space for young surv histo.");
_surviving_young_words = _surviving_young_words_base + PADDING_ELEM_NUM;
memset(_surviving_young_words, 0, (size_t) real_length * sizeof(size_t));
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -285,7 +285,7 @@
_fine_grain_regions = new PerRegionTablePtr[_max_fine_entries];
if (_fine_grain_regions == NULL) {
- vm_exit_out_of_memory(sizeof(void*)*_max_fine_entries,
+ vm_exit_out_of_memory(sizeof(void*)*_max_fine_entries, OOM_MALLOC_ERROR,
"Failed to allocate _fine_grain_entries.");
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -567,7 +567,7 @@
MemRegion(new_start_aligned, new_end_for_commit);
if (!os::commit_memory((char*)new_committed.start(),
new_committed.byte_size())) {
- vm_exit_out_of_memory(new_committed.byte_size(),
+ vm_exit_out_of_memory(new_committed.byte_size(), OOM_MMAP_ERROR,
"card table expansion");
}
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -43,7 +43,7 @@
_time_stamp_index(0)
{
if (!os::create_thread(this, os::pgc_thread))
- vm_exit_out_of_memory(0, "Cannot create GC thread. Out of system resources.");
+ vm_exit_out_of_memory(0, OOM_MALLOC_ERROR, "Cannot create GC thread. Out of system resources.");
if (PrintGCTaskTimeStamps) {
_time_stamps = NEW_C_HEAP_ARRAY(GCTaskTimeStamp, GCTaskTimeStampEntries, mtGC);
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -99,7 +99,7 @@
// Expand
size_t expand_by = requested_blocks_size_in_bytes - current_blocks_size_in_bytes;
if (!_virtual_space.expand_by(expand_by)) {
- vm_exit_out_of_memory(expand_by, "object start array expansion");
+ vm_exit_out_of_memory(expand_by, OOM_MMAP_ERROR, "object start array expansion");
}
// Clear *only* the newly allocated region
memset(_blocks_region.end(), clean_block, expand_by);
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -1052,7 +1052,7 @@
return;
}
if (set_handler_blob() == NULL) {
- vm_exit_out_of_memory(blob_size, "native signature handlers");
+ vm_exit_out_of_memory(blob_size, OOM_MALLOC_ERROR, "native signature handlers");
}
BufferBlob* bb = BufferBlob::create("Signature Handler Temp Buffer",
--- a/hotspot/src/share/vm/memory/allocation.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/memory/allocation.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -259,7 +259,7 @@
}
if (p == NULL) p = os::malloc(bytes, mtChunk, CURRENT_PC);
if (p == NULL)
- vm_exit_out_of_memory(bytes, "ChunkPool::allocate");
+ vm_exit_out_of_memory(bytes, OOM_MALLOC_ERROR, "ChunkPool::allocate");
return p;
}
@@ -371,7 +371,7 @@
default: {
void *p = os::malloc(bytes, mtChunk, CALLER_PC);
if (p == NULL)
- vm_exit_out_of_memory(bytes, "Chunk::new");
+ vm_exit_out_of_memory(bytes, OOM_MALLOC_ERROR, "Chunk::new");
return p;
}
}
@@ -531,7 +531,7 @@
}
void Arena::signal_out_of_memory(size_t sz, const char* whence) const {
- vm_exit_out_of_memory(sz, whence);
+ vm_exit_out_of_memory(sz, OOM_MALLOC_ERROR, whence);
}
// Grow a new Chunk
--- a/hotspot/src/share/vm/memory/allocation.inline.hpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/memory/allocation.inline.hpp Tue Apr 30 11:56:52 2013 -0700
@@ -58,7 +58,9 @@
#ifdef ASSERT
if (PrintMallocFree) trace_heap_malloc(size, "AllocateHeap", p);
#endif
- if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) vm_exit_out_of_memory(size, "AllocateHeap");
+ if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) {
+ vm_exit_out_of_memory(size, OOM_MALLOC_ERROR, "AllocateHeap");
+ }
return p;
}
@@ -68,7 +70,9 @@
#ifdef ASSERT
if (PrintMallocFree) trace_heap_malloc(size, "ReallocateHeap", p);
#endif
- if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) vm_exit_out_of_memory(size, "ReallocateHeap");
+ if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) {
+ vm_exit_out_of_memory(size, OOM_MALLOC_ERROR, "ReallocateHeap");
+ }
return p;
}
@@ -130,12 +134,12 @@
_addr = os::reserve_memory(_size, NULL, alignment);
if (_addr == NULL) {
- vm_exit_out_of_memory(_size, "Allocator (reserve)");
+ vm_exit_out_of_memory(_size, OOM_MMAP_ERROR, "Allocator (reserve)");
}
bool success = os::commit_memory(_addr, _size, false /* executable */);
if (!success) {
- vm_exit_out_of_memory(_size, "Allocator (commit)");
+ vm_exit_out_of_memory(_size, OOM_MMAP_ERROR, "Allocator (commit)");
}
return (E*)_addr;
--- a/hotspot/src/share/vm/memory/blockOffsetTable.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/memory/blockOffsetTable.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -80,7 +80,7 @@
assert(delta > 0, "just checking");
if (!_vs.expand_by(delta)) {
// Do better than this for Merlin
- vm_exit_out_of_memory(delta, "offset table expansion");
+ vm_exit_out_of_memory(delta, OOM_MMAP_ERROR, "offset table expansion");
}
assert(_vs.high() == high + delta, "invalid expansion");
} else {
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -116,7 +116,7 @@
_guard_region = MemRegion((HeapWord*)guard_page, _page_size);
if (!os::commit_memory((char*)guard_page, _page_size, _page_size)) {
// Do better than this for Merlin
- vm_exit_out_of_memory(_page_size, "card table last card");
+ vm_exit_out_of_memory(_page_size, OOM_MMAP_ERROR, "card table last card");
}
*guard_card = last_card;
@@ -292,7 +292,7 @@
if (!os::commit_memory((char*)new_committed.start(),
new_committed.byte_size(), _page_size)) {
// Do better than this for Merlin
- vm_exit_out_of_memory(new_committed.byte_size(),
+ vm_exit_out_of_memory(new_committed.byte_size(), OOM_MMAP_ERROR,
"card table expansion");
}
// Use new_end_aligned (as opposed to new_end_for_commit) because
--- a/hotspot/src/share/vm/oops/oop.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/oops/oop.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -111,7 +111,7 @@
// Use alternate hashing algorithm on the string
return AltHashing::murmur3_32(seed, chars, length);
} else {
- vm_exit_out_of_memory(length, "unable to create Unicode strings for String table rehash");
+ vm_exit_out_of_memory(length, OOM_MALLOC_ERROR, "unable to create Unicode strings for String table rehash");
return 0;
}
}
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -153,7 +153,8 @@
size_t s = initial_size * sizeof(JvmtiTagHashmapEntry*);
_table = (JvmtiTagHashmapEntry**)os::malloc(s, mtInternal);
if (_table == NULL) {
- vm_exit_out_of_memory(s, "unable to allocate initial hashtable for jvmti object tags");
+ vm_exit_out_of_memory(s, OOM_MALLOC_ERROR,
+ "unable to allocate initial hashtable for jvmti object tags");
}
for (int i=0; i<initial_size; i++) {
_table[i] = NULL;
--- a/hotspot/src/share/vm/prims/methodHandles.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -67,7 +67,8 @@
TraceTime timer("MethodHandles adapters generation", TraceStartupTime);
_adapter_code = MethodHandlesAdapterBlob::create(adapter_code_size);
if (_adapter_code == NULL)
- vm_exit_out_of_memory(adapter_code_size, "CodeCache: no room for MethodHandles adapters");
+ vm_exit_out_of_memory(adapter_code_size, OOM_MALLOC_ERROR,
+ "CodeCache: no room for MethodHandles adapters");
{
CodeBuffer code(_adapter_code);
MethodHandlesAdapterGenerator g(&code);
--- a/hotspot/src/share/vm/runtime/objectMonitor.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/runtime/objectMonitor.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -2404,7 +2404,7 @@
size_t sz = strlen (SyncKnobs) ;
char * knobs = (char *) malloc (sz + 2) ;
if (knobs == NULL) {
- vm_exit_out_of_memory (sz + 2, "Parse SyncKnobs") ;
+ vm_exit_out_of_memory (sz + 2, OOM_MALLOC_ERROR, "Parse SyncKnobs") ;
guarantee (0, "invariant") ;
}
strcpy (knobs, SyncKnobs) ;
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -147,7 +147,7 @@
TraceTime timer("StubRoutines generation 1", TraceStartupTime);
_code1 = BufferBlob::create("StubRoutines (1)", code_size1);
if (_code1 == NULL) {
- vm_exit_out_of_memory(code_size1, "CodeCache: no room for StubRoutines (1)");
+ vm_exit_out_of_memory(code_size1, OOM_MALLOC_ERROR, "CodeCache: no room for StubRoutines (1)");
}
CodeBuffer buffer(_code1);
StubGenerator_generate(&buffer, false);
@@ -199,7 +199,7 @@
TraceTime timer("StubRoutines generation 2", TraceStartupTime);
_code2 = BufferBlob::create("StubRoutines (2)", code_size2);
if (_code2 == NULL) {
- vm_exit_out_of_memory(code_size2, "CodeCache: no room for StubRoutines (2)");
+ vm_exit_out_of_memory(code_size2, OOM_MALLOC_ERROR, "CodeCache: no room for StubRoutines (2)");
}
CodeBuffer buffer(_code2);
StubGenerator_generate(&buffer, true);
--- a/hotspot/src/share/vm/runtime/synchronizer.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/runtime/synchronizer.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -1018,7 +1018,8 @@
// We might be able to induce a STW safepoint and scavenge enough
// objectMonitors to permit progress.
if (temp == NULL) {
- vm_exit_out_of_memory (sizeof (ObjectMonitor[_BLOCKSIZE]), "Allocate ObjectMonitors") ;
+ vm_exit_out_of_memory (sizeof (ObjectMonitor[_BLOCKSIZE]), OOM_MALLOC_ERROR,
+ "Allocate ObjectMonitors");
}
// Format the block.
--- a/hotspot/src/share/vm/utilities/debug.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/utilities/debug.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -229,11 +229,11 @@
}
void report_vm_out_of_memory(const char* file, int line, size_t size,
- const char* message) {
+ VMErrorType vm_err_type, const char* message) {
if (Debugging) return;
Thread* thread = ThreadLocalStorage::get_thread_slow();
- VMError(thread, file, line, size, message).report_and_die();
+ VMError(thread, file, line, size, vm_err_type, message).report_and_die();
// The UseOSErrorReporting option in report_and_die() may allow a return
// to here. If so then we'll have to figure out how to handle it.
@@ -344,7 +344,7 @@
msg, eol, msg, eol, msg, eol, msg, eol, msg, eol,
msg, eol, msg, eol, msg, eol, msg, eol, msg, eol,
msg, eol, msg, eol, msg, eol, msg, eol, msg));
- case 8: vm_exit_out_of_memory(num, "ChunkPool::allocate");
+ case 8: vm_exit_out_of_memory(num, OOM_MALLOC_ERROR, "ChunkPool::allocate");
case 9: ShouldNotCallThis();
case 10: ShouldNotReachHere();
case 11: Unimplemented();
--- a/hotspot/src/share/vm/utilities/debug.hpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/utilities/debug.hpp Tue Apr 30 11:56:52 2013 -0700
@@ -174,9 +174,9 @@
} while (0)
// out of memory
-#define vm_exit_out_of_memory(size, msg) \
+#define vm_exit_out_of_memory(size, vm_err_type, msg) \
do { \
- report_vm_out_of_memory(__FILE__, __LINE__, size, msg); \
+ report_vm_out_of_memory(__FILE__, __LINE__, size, vm_err_type, msg); \
BREAKPOINT; \
} while (0)
@@ -204,12 +204,20 @@
BREAKPOINT; \
} while (0);
+
+// types of VM error - originally in vmError.hpp
+enum VMErrorType {
+ INTERNAL_ERROR = 0xe0000000,
+ OOM_MALLOC_ERROR = 0xe0000001,
+ OOM_MMAP_ERROR = 0xe0000002
+};
+
// error reporting helper functions
void report_vm_error(const char* file, int line, const char* error_msg,
const char* detail_msg = NULL);
void report_fatal(const char* file, int line, const char* message);
void report_vm_out_of_memory(const char* file, int line, size_t size,
- const char* message);
+ VMErrorType vm_err_type, const char* message);
void report_should_not_call(const char* file, int line);
void report_should_not_reach_here(const char* file, int line);
void report_unimplemented(const char* file, int line);
--- a/hotspot/src/share/vm/utilities/vmError.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -100,7 +100,7 @@
const char* message, const char * detail_msg)
{
_thread = thread;
- _id = internal_error; // Value that's not an OS exception/signal
+ _id = INTERNAL_ERROR; // Value that's not an OS exception/signal
_filename = filename;
_lineno = lineno;
_message = message;
@@ -119,9 +119,9 @@
// Constructor for OOM errors
VMError::VMError(Thread* thread, const char* filename, int lineno, size_t size,
- const char* message) {
+ VMErrorType vm_err_type, const char* message) {
_thread = thread;
- _id = oom_error; // Value that's not an OS exception/signal
+ _id = vm_err_type; // Value that's not an OS exception/signal
_filename = filename;
_lineno = lineno;
_message = message;
@@ -142,7 +142,7 @@
// Constructor for non-fatal errors
VMError::VMError(const char* message) {
_thread = NULL;
- _id = internal_error; // Value that's not an OS exception/signal
+ _id = INTERNAL_ERROR; // Value that's not an OS exception/signal
_filename = NULL;
_lineno = 0;
_message = message;
@@ -351,9 +351,12 @@
STEP(15, "(printing type of error)")
switch(_id) {
- case oom_error:
+ case OOM_MALLOC_ERROR:
+ case OOM_MMAP_ERROR:
if (_size) {
- st->print("# Native memory allocation (malloc) failed to allocate ");
+ st->print("# Native memory allocation ");
+ st->print((_id == (int)OOM_MALLOC_ERROR) ? "(malloc) failed to allocate " :
+ "(mmap) failed to map ");
jio_snprintf(buf, sizeof(buf), SIZE_FORMAT, _size);
st->print(buf);
st->print(" bytes");
@@ -386,7 +389,7 @@
return; // that's enough for the screen
}
break;
- case internal_error:
+ case INTERNAL_ERROR:
default:
break;
}
--- a/hotspot/src/share/vm/utilities/vmError.hpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/utilities/vmError.hpp Tue Apr 30 11:56:52 2013 -0700
@@ -34,10 +34,6 @@
friend class VM_ReportJavaOutOfMemory;
friend class Decoder;
- enum ErrorType {
- internal_error = 0xe0000000,
- oom_error = 0xe0000001
- };
int _id; // Solaris/Linux signals: 0 - SIGRTMAX
// Windows exceptions: 0xCxxxxxxx system errors
// 0x8xxxxxxx system warnings
@@ -96,9 +92,12 @@
// accessor
const char* message() const { return _message; }
const char* detail_msg() const { return _detail_msg; }
- bool should_report_bug(unsigned int id) { return id != oom_error; }
+ bool should_report_bug(unsigned int id) {
+ return (id != OOM_MALLOC_ERROR) && (id != OOM_MMAP_ERROR);
+ }
public:
+
// Constructor for crashes
VMError(Thread* thread, unsigned int sig, address pc, void* siginfo,
void* context);
@@ -108,7 +107,7 @@
// Constructor for VM OOM errors
VMError(Thread* thread, const char* filename, int lineno, size_t size,
- const char* message);
+ VMErrorType vm_err_type, const char* message);
// Constructor for non-fatal errors
VMError(const char* message);
--- a/hotspot/src/share/vm/utilities/workgroup.cpp Tue Apr 30 09:17:06 2013 -0400
+++ b/hotspot/src/share/vm/utilities/workgroup.cpp Tue Apr 30 11:56:52 2013 -0700
@@ -79,7 +79,7 @@
}
_gang_workers = NEW_C_HEAP_ARRAY(GangWorker*, total_workers(), mtInternal);
if (gang_workers() == NULL) {
- vm_exit_out_of_memory(0, "Cannot create GangWorker array.");
+ vm_exit_out_of_memory(0, OOM_MALLOC_ERROR, "Cannot create GangWorker array.");
return false;
}
os::ThreadType worker_type;
@@ -93,7 +93,8 @@
assert(new_worker != NULL, "Failed to allocate GangWorker");
_gang_workers[worker] = new_worker;
if (new_worker == NULL || !os::create_thread(new_worker, worker_type)) {
- vm_exit_out_of_memory(0, "Cannot create worker GC thread. Out of system resources.");
+ vm_exit_out_of_memory(0, OOM_MALLOC_ERROR,
+ "Cannot create worker GC thread. Out of system resources.");
return false;
}
if (!DisableStartThread) {