--- a/hotspot/src/share/vm/code/nmethod.cpp Fri Mar 22 13:35:31 2013 -0400
+++ b/hotspot/src/share/vm/code/nmethod.cpp Sat Mar 23 06:22:07 2013 -0700
@@ -486,7 +486,6 @@
#endif // def HAVE_DTRACE_H
}
-
nmethod* nmethod::new_native_nmethod(methodHandle method,
int compile_id,
CodeBuffer *code_buffer,
@@ -502,17 +501,19 @@
{
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
int native_nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
- CodeOffsets offsets;
- offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
- offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
- nm = new (native_nmethod_size)
- nmethod(method(), native_nmethod_size, compile_id, &offsets,
- code_buffer, frame_size,
- basic_lock_owner_sp_offset, basic_lock_sp_offset,
- oop_maps);
- NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_native_nmethod(nm));
- if (PrintAssembly && nm != NULL)
- Disassembler::decode(nm);
+ if (CodeCache::has_space(native_nmethod_size)) {
+ CodeOffsets offsets;
+ offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
+ offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
+ nm = new (native_nmethod_size) nmethod(method(), native_nmethod_size,
+ compile_id, &offsets,
+ code_buffer, frame_size,
+ basic_lock_owner_sp_offset,
+ basic_lock_sp_offset, oop_maps);
+ NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_native_nmethod(nm));
+ if (PrintAssembly && nm != NULL)
+ Disassembler::decode(nm);
+ }
}
// verify nmethod
debug_only(if (nm) nm->verify();) // might block
@@ -537,16 +538,19 @@
{
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
int nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
- CodeOffsets offsets;
- offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
- offsets.set_value(CodeOffsets::Dtrace_trap, trap_offset);
- offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
+ if (CodeCache::has_space(nmethod_size)) {
+ CodeOffsets offsets;
+ offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
+ offsets.set_value(CodeOffsets::Dtrace_trap, trap_offset);
+ offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
- nm = new (nmethod_size) nmethod(method(), nmethod_size, &offsets, code_buffer, frame_size);
+ nm = new (nmethod_size) nmethod(method(), nmethod_size,
+ &offsets, code_buffer, frame_size);
- NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
- if (PrintAssembly && nm != NULL)
- Disassembler::decode(nm);
+ NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
+ if (PrintAssembly && nm != NULL)
+ Disassembler::decode(nm);
+ }
}
// verify nmethod
debug_only(if (nm) nm->verify();) // might block
@@ -587,7 +591,8 @@
+ round_to(handler_table->size_in_bytes(), oopSize)
+ round_to(nul_chk_table->size_in_bytes(), oopSize)
+ round_to(debug_info->data_size() , oopSize);
- nm = new (nmethod_size)
+ if (CodeCache::has_space(nmethod_size)) {
+ nm = new (nmethod_size)
nmethod(method(), nmethod_size, compile_id, entry_bci, offsets,
orig_pc_offset, debug_info, dependencies, code_buffer, frame_size,
oop_maps,
@@ -595,6 +600,7 @@
nul_chk_table,
compiler,
comp_level);
+ }
if (nm != NULL) {
// To make dependency checking during class loading fast, record
// the nmethod dependencies in the classes it is dependent on.
@@ -793,9 +799,9 @@
#endif // def HAVE_DTRACE_H
void* nmethod::operator new(size_t size, int nmethod_size) {
- // Always leave some room in the CodeCache for I2C/C2I adapters
- if (CodeCache::largest_free_block() < CodeCacheMinimumFreeSpace) return NULL;
- return CodeCache::allocate(nmethod_size);
+ void* alloc = CodeCache::allocate(nmethod_size);
+ guarantee(alloc != NULL, "CodeCache should have enough space");
+ return alloc;
}