Mercurial > hg > truffle
changeset 12433:808348377021
Fix inconsistent oops in slow path allocation
author | Christos Kotselidis <christos.kotselidis@oracle.com> |
---|---|
date | Wed, 16 Oct 2013 01:05:14 +0200 |
parents | 083e90f11c93 |
children | 90f3c090a002 |
files | src/share/vm/graal/graalRuntime.cpp src/share/vm/graal/graalRuntime.hpp |
diffstat | 2 files changed, 31 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/graal/graalRuntime.cpp Tue Oct 15 02:07:33 2013 +0200 +++ b/src/share/vm/graal/graalRuntime.cpp Wed Oct 16 01:05:14 2013 +0200 @@ -56,7 +56,8 @@ } } -JRT_ENTRY(void, GraalRuntime::new_instance(JavaThread* thread, Klass* klass)) +JRT_BLOCK_ENTRY(void, GraalRuntime::new_instance(JavaThread* thread, Klass* klass)) + JRT_BLOCK; assert(klass->is_klass(), "not a class"); instanceKlassHandle h(thread, klass); h->check_valid_for_instantiation(true, CHECK); @@ -64,13 +65,16 @@ h->initialize(CHECK); // allocate instance and return via TLS oop obj = h->allocate_instance(CHECK); + thread->set_vm_result(obj); + JRT_BLOCK_END; + if (GraalDeferredInitBarriers) { - obj = Universe::heap()->new_store_pre_barrier(thread, obj); + new_store_pre_barrier(thread); } - thread->set_vm_result(obj); JRT_END -JRT_ENTRY(void, GraalRuntime::new_array(JavaThread* thread, Klass* array_klass, jint length)) +JRT_BLOCK_ENTRY(void, GraalRuntime::new_array(JavaThread* thread, Klass* array_klass, jint length)) + JRT_BLOCK; // Note: no handle for klass needed since they are not used // anymore after new_objArray() and no GC can happen before. // (This may have to change if this code changes!) @@ -83,9 +87,6 @@ Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass(); obj = oopFactory::new_objArray(elem_klass, length, CHECK); } - if (GraalDeferredInitBarriers) { - obj = Universe::heap()->new_store_pre_barrier(thread, obj); - } thread->set_vm_result(obj); // This is pretty rare but this runtime patch is stressful to deoptimization // if we deoptimize here so force a deopt to stress the path. @@ -99,8 +100,30 @@ deopt_caller(); } } + JRT_BLOCK_END; + + if (GraalDeferredInitBarriers) { + new_store_pre_barrier(thread); + } JRT_END +void GraalRuntime::new_store_pre_barrier(JavaThread* thread) { + // After any safepoint, just before going back to compiled code, + // we inform the GC that we will be doing initializing writes to + // this object in the future without emitting card-marks, so + // GC may take any compensating steps. + // NOTE: Keep this code consistent with GraphKit::store_barrier. + + oop new_obj = thread->vm_result(); + if (new_obj == NULL) return; + + assert(Universe::heap()->can_elide_tlab_store_barriers(), + "compiler must check this first"); + // GC may decide to give back a safer copy of new_obj. + new_obj = Universe::heap()->new_store_pre_barrier(thread, new_obj); + thread->set_vm_result(new_obj); +} + JRT_ENTRY(void, GraalRuntime::new_multi_array(JavaThread* thread, Klass* klass, int rank, jint* dims)) assert(klass->is_klass(), "not a class"); assert(rank >= 1, "rank must be nonzero");
--- a/src/share/vm/graal/graalRuntime.hpp Tue Oct 15 02:07:33 2013 +0200 +++ b/src/share/vm/graal/graalRuntime.hpp Wed Oct 16 01:05:14 2013 +0200 @@ -56,6 +56,7 @@ static void write_barrier_pre(JavaThread* thread, oopDesc* obj); static void write_barrier_post(JavaThread* thread, void* card); static jboolean validate_object(JavaThread* thread, oopDesc* parent, oopDesc* child); + static void new_store_pre_barrier(JavaThread* thread); }; #endif // SHARE_VM_GRAAL_GRAAL_RUNTIME_HPP