< prev index next >

src/share/vm/gc/parallel/psParallelCompact.cpp

Print this page

        

@@ -3103,13 +3103,15 @@
   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* discovered_addr,
+                                                  T* value_addr) {
   if(TraceReferenceGC && PrintGCDetails) {
     gclog_or_tty->print_cr("%s obj " PTR_FORMAT, s, p2i(obj));
     gclog_or_tty->print_cr("     referent_addr/* " PTR_FORMAT " / "
                            PTR_FORMAT, p2i(referent_addr),
                            referent_addr ? p2i(oopDesc::load_decode_heap_oop(referent_addr)) : NULL);

@@ -3117,33 +3119,45 @@
                            PTR_FORMAT, p2i(next_addr),
                            next_addr ? p2i(oopDesc::load_decode_heap_oop(next_addr)) : NULL);
     gclog_or_tty->print_cr("     discovered_addr/* " PTR_FORMAT " / "
                            PTR_FORMAT, p2i(discovered_addr),
                            discovered_addr ? p2i(oopDesc::load_decode_heap_oop(discovered_addr)) : NULL);
+    if (is_ephemeron) {
+      gclog_or_tty->print_cr("     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) {
+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);
-  debug_only(trace_reference_gc("InstanceRefKlass::oop_update_ptrs", obj,
-                                referent_addr, next_addr, 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);
+    oop_pc_update_pointers_specialized<narrowOop>(obj, this);
   } else {
-    oop_pc_update_pointers_specialized<oop>(obj);
+    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 >