< 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 >