< prev index next >
src/share/vm/gc/parallel/psParallelCompact.cpp
Print this page
*** 3076,3117 ****
InstanceKlass::oop_pc_update_pointers(obj);
}
#ifdef ASSERT
template <class T> static void trace_reference_gc(const char *s, oop obj,
T* referent_addr,
T* next_addr,
! T* discovered_addr) {
log_develop_trace(gc, ref)("%s obj " PTR_FORMAT, s, p2i(obj));
log_develop_trace(gc, ref)(" referent_addr/* " PTR_FORMAT " / " PTR_FORMAT,
p2i(referent_addr), referent_addr ? p2i(oopDesc::load_decode_heap_oop(referent_addr)) : NULL);
log_develop_trace(gc, ref)(" next_addr/* " PTR_FORMAT " / " PTR_FORMAT,
p2i(next_addr), next_addr ? p2i(oopDesc::load_decode_heap_oop(next_addr)) : NULL);
log_develop_trace(gc, ref)(" discovered_addr/* " PTR_FORMAT " / " PTR_FORMAT,
p2i(discovered_addr), discovered_addr ? p2i(oopDesc::load_decode_heap_oop(discovered_addr)) : NULL);
}
#endif
template <class T>
! static void oop_pc_update_pointers_specialized(oop obj) {
T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
PSParallelCompact::adjust_pointer(referent_addr);
T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
PSParallelCompact::adjust_pointer(next_addr);
T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
PSParallelCompact::adjust_pointer(discovered_addr);
! debug_only(trace_reference_gc("InstanceRefKlass::oop_update_ptrs", obj,
! referent_addr, next_addr, discovered_addr);)
}
void InstanceRefKlass::oop_pc_update_pointers(oop obj) {
InstanceKlass::oop_pc_update_pointers(obj);
if (UseCompressedOops) {
! oop_pc_update_pointers_specialized<narrowOop>(obj);
} else {
! oop_pc_update_pointers_specialized<oop>(obj);
}
}
void ObjArrayKlass::oop_pc_update_pointers(oop obj) {
assert(obj->is_objArray(), "obj must be obj array");
--- 3076,3130 ----
InstanceKlass::oop_pc_update_pointers(obj);
}
#ifdef ASSERT
template <class T> static void trace_reference_gc(const char *s, oop obj,
+ bool is_ephemeron,
T* referent_addr,
T* next_addr,
! T* discovered_addr,
! T* value_addr) {
log_develop_trace(gc, ref)("%s obj " PTR_FORMAT, s, p2i(obj));
log_develop_trace(gc, ref)(" referent_addr/* " PTR_FORMAT " / " PTR_FORMAT,
p2i(referent_addr), referent_addr ? p2i(oopDesc::load_decode_heap_oop(referent_addr)) : NULL);
log_develop_trace(gc, ref)(" next_addr/* " PTR_FORMAT " / " PTR_FORMAT,
p2i(next_addr), next_addr ? p2i(oopDesc::load_decode_heap_oop(next_addr)) : NULL);
log_develop_trace(gc, ref)(" discovered_addr/* " PTR_FORMAT " / " PTR_FORMAT,
p2i(discovered_addr), discovered_addr ? p2i(oopDesc::load_decode_heap_oop(discovered_addr)) : NULL);
+ if (is_ephemeron) {
+ log_develop_trace(gc, ref)(" value_addr/* " PTR_FORMAT " / " PTR_FORMAT,
+ p2i(value_addr), value_addr ? p2i(oopDesc::load_decode_heap_oop(value_addr)) : NULL);
+ }
}
#endif
template <class T>
! static void oop_pc_update_pointers_specialized(oop obj, InstanceRefKlass* klass) {
T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
PSParallelCompact::adjust_pointer(referent_addr);
T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
PSParallelCompact::adjust_pointer(next_addr);
T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
PSParallelCompact::adjust_pointer(discovered_addr);
! if (klass->reference_type() == REF_EPHEMERON) {
! T* value_addr = (T*)java_lang_ref_Ephemeron::value_addr(obj);
! PSParallelCompact::adjust_pointer(value_addr);
! debug_only(trace_reference_gc("InstanceRefKlass<Ephemeron>::oop_update_ptrs", obj, true,
! referent_addr, next_addr, discovered_addr, value_addr);)
! } else {
! debug_only(trace_reference_gc("InstanceRefKlass::oop_update_ptrs", obj, false,
! referent_addr, next_addr, discovered_addr, (T*)NULL);)
! }
}
void InstanceRefKlass::oop_pc_update_pointers(oop obj) {
InstanceKlass::oop_pc_update_pointers(obj);
if (UseCompressedOops) {
! oop_pc_update_pointers_specialized<narrowOop>(obj, this);
} else {
! oop_pc_update_pointers_specialized<oop>(obj, this);
}
}
void ObjArrayKlass::oop_pc_update_pointers(oop obj) {
assert(obj->is_objArray(), "obj must be obj array");
< prev index next >