< prev index next >

src/share/vm/prims/jvm.cpp

Print this page
rev 12906 : [mq]: gc_interface

*** 32,42 **** #include "classfile/modules.hpp" #include "classfile/packageEntry.hpp" #include "classfile/stringTable.hpp" #include "classfile/systemDictionary.hpp" #include "classfile/vmSymbols.hpp" - #include "gc/shared/barrierSet.inline.hpp" #include "gc/shared/collectedHeap.inline.hpp" #include "interpreter/bytecode.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.inline.hpp" --- 32,41 ----
*** 51,60 **** --- 50,60 ---- #include "prims/jvmtiExport.hpp" #include "prims/jvmtiThreadState.hpp" #include "prims/nativeLookup.hpp" #include "prims/privilegedStack.hpp" #include "prims/stackwalk.hpp" + #include "runtime/access.inline.hpp" #include "runtime/arguments.hpp" #include "runtime/atomic.hpp" #include "runtime/handles.inline.hpp" #include "runtime/init.hpp" #include "runtime/interfaceSupport.hpp"
*** 650,678 **** new_obj_oop = CollectedHeap::array_allocate(klass, size, length, CHECK_NULL); } else { new_obj_oop = CollectedHeap::obj_allocate(klass, size, CHECK_NULL); } ! // 4839641 (4840070): We must do an oop-atomic copy, because if another thread ! // is modifying a reference field in the clonee, a non-oop-atomic copy might ! // be suspended in the middle of copying the pointer and end up with parts ! // of two different pointers in the field. Subsequent dereferences will crash. ! // 4846409: an oop-copy of objects with long or double fields or arrays of same ! // won't copy the longs/doubles atomically in 32-bit vm's, so we copy jlongs instead ! // of oops. We know objects are aligned on a minimum of an jlong boundary. ! // The same is true of StubRoutines::object_copy and the various oop_copy ! // variants, and of the code generated by the inline_native_clone intrinsic. ! assert(MinObjAlignmentInBytes >= BytesPerLong, "objects misaligned"); ! Copy::conjoint_jlongs_atomic((jlong*)obj(), (jlong*)new_obj_oop, ! (size_t)align_object_size(size) / HeapWordsPerLong); ! // Clear the header ! new_obj_oop->init_mark(); ! ! // Store check (mark entire object and let gc sort it out) ! BarrierSet* bs = Universe::heap()->barrier_set(); ! assert(bs->has_write_region_opt(), "Barrier set does not have write_region"); ! bs->write_region(MemRegion((HeapWord*)new_obj_oop, size)); Handle new_obj(THREAD, new_obj_oop); // Special handling for MemberNames. Since they contain Method* metadata, they // must be registered so that RedefineClasses can fix metadata contained in them. if (java_lang_invoke_MemberName::is_instance(new_obj()) && --- 650,660 ---- new_obj_oop = CollectedHeap::array_allocate(klass, size, length, CHECK_NULL); } else { new_obj_oop = CollectedHeap::obj_allocate(klass, size, CHECK_NULL); } ! HeapAccess<>::clone(obj(), new_obj_oop, size); Handle new_obj(THREAD, new_obj_oop); // Special handling for MemberNames. Since they contain Method* metadata, they // must be registered so that RedefineClasses can fix metadata contained in them. if (java_lang_invoke_MemberName::is_instance(new_obj()) &&
< prev index next >