< prev index next >
src/share/vm/gc/serial/markSweep.cpp
Print this page
@@ -297,42 +297,55 @@
return InstanceKlass::oop_ms_adjust_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* 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), p2i(referent_addr ? (address)oopDesc::load_decode_heap_oop(referent_addr) : NULL));
log_develop_trace(gc, ref)(" next_addr/* " PTR_FORMAT " / " PTR_FORMAT,
p2i(next_addr), p2i(next_addr ? (address)oopDesc::load_decode_heap_oop(next_addr) : NULL));
log_develop_trace(gc, ref)(" discovered_addr/* " PTR_FORMAT " / " PTR_FORMAT,
p2i(discovered_addr), p2i(discovered_addr ? (address)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), p2i(value_addr ? (address)oopDesc::load_decode_heap_oop(value_addr) : NULL));
+ }
}
#endif
-template <class T> void static adjust_object_specialized(oop obj) {
+template <class T> void static adjust_object_specialized(oop obj, InstanceRefKlass* klass) {
T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
MarkSweep::adjust_pointer(referent_addr);
T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
MarkSweep::adjust_pointer(next_addr);
T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
MarkSweep::adjust_pointer(discovered_addr);
- debug_only(trace_reference_gc("InstanceRefKlass::oop_ms_adjust_pointers", obj,
- referent_addr, next_addr, discovered_addr);)
+ if (klass->reference_type() == REF_EPHEMERON) {
+ T* value_addr = (T*) java_lang_ref_Ephemeron::value_addr(obj);
+ MarkSweep::adjust_pointer(value_addr);
+ debug_only(trace_reference_gc("InstanceRefKlass<Ephemeron>::oop_ms_adjust_pointers", obj, true,
+ referent_addr, next_addr, discovered_addr, value_addr);)
+ } else {
+ debug_only(trace_reference_gc("InstanceRefKlass::oop_ms_adjust_pointers", obj, false,
+ referent_addr, next_addr, discovered_addr, (T*)NULL);)
+ }
}
int InstanceRefKlass::oop_ms_adjust_pointers(oop obj) {
int size = size_helper();
InstanceKlass::oop_ms_adjust_pointers(obj);
if (UseCompressedOops) {
- adjust_object_specialized<narrowOop>(obj);
+ adjust_object_specialized<narrowOop>(obj, this);
} else {
- adjust_object_specialized<oop>(obj);
+ adjust_object_specialized<oop>(obj, this);
}
return size;
}
int ObjArrayKlass::oop_ms_adjust_pointers(oop obj) {
< prev index next >