src/share/vm/oops/instanceRefKlass.cpp

changeset 548
ba764ed4b6f2
parent 435
a61af66fc99e
child 631
d1605aabd0a1
child 777
37f87013dfd8
     1.1 --- a/src/share/vm/oops/instanceRefKlass.cpp	Fri Apr 11 09:56:35 2008 -0400
     1.2 +++ b/src/share/vm/oops/instanceRefKlass.cpp	Sun Apr 13 17:43:42 2008 -0400
     1.3 @@ -25,23 +25,24 @@
     1.4  # include "incls/_precompiled.incl"
     1.5  # include "incls/_instanceRefKlass.cpp.incl"
     1.6  
     1.7 -void instanceRefKlass::oop_follow_contents(oop obj) {
     1.8 -  oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);
     1.9 -  oop referent = *referent_addr;
    1.10 +template <class T>
    1.11 +static void specialized_oop_follow_contents(instanceRefKlass* ref, oop obj) {
    1.12 +  T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
    1.13 +  oop referent = oopDesc::load_decode_heap_oop(referent_addr);
    1.14    debug_only(
    1.15      if(TraceReferenceGC && PrintGCDetails) {
    1.16 -      gclog_or_tty->print_cr("instanceRefKlass::oop_follow_contents " INTPTR_FORMAT, (address)obj);
    1.17 +      gclog_or_tty->print_cr("instanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj);
    1.18      }
    1.19    )
    1.20    if (referent != NULL) {
    1.21      if (!referent->is_gc_marked() &&
    1.22          MarkSweep::ref_processor()->
    1.23 -          discover_reference(obj, reference_type())) {
    1.24 +          discover_reference(obj, ref->reference_type())) {
    1.25        // reference already enqueued, referent will be traversed later
    1.26 -      instanceKlass::oop_follow_contents(obj);
    1.27 +      ref->instanceKlass::oop_follow_contents(obj);
    1.28        debug_only(
    1.29          if(TraceReferenceGC && PrintGCDetails) {
    1.30 -          gclog_or_tty->print_cr("       Non NULL enqueued " INTPTR_FORMAT, (address)obj);
    1.31 +          gclog_or_tty->print_cr("       Non NULL enqueued " INTPTR_FORMAT, obj);
    1.32          }
    1.33        )
    1.34        return;
    1.35 @@ -49,42 +50,52 @@
    1.36        // treat referent as normal oop
    1.37        debug_only(
    1.38          if(TraceReferenceGC && PrintGCDetails) {
    1.39 -          gclog_or_tty->print_cr("       Non NULL normal " INTPTR_FORMAT, (address)obj);
    1.40 +          gclog_or_tty->print_cr("       Non NULL normal " INTPTR_FORMAT, obj);
    1.41          }
    1.42        )
    1.43        MarkSweep::mark_and_push(referent_addr);
    1.44      }
    1.45    }
    1.46    // treat next as normal oop.  next is a link in the pending list.
    1.47 -  oop* next_addr = java_lang_ref_Reference::next_addr(obj);
    1.48 +  T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
    1.49    debug_only(
    1.50      if(TraceReferenceGC && PrintGCDetails) {
    1.51        gclog_or_tty->print_cr("   Process next as normal " INTPTR_FORMAT, next_addr);
    1.52      }
    1.53    )
    1.54    MarkSweep::mark_and_push(next_addr);
    1.55 -  instanceKlass::oop_follow_contents(obj);
    1.56 +  ref->instanceKlass::oop_follow_contents(obj);
    1.57 +}
    1.58 +
    1.59 +void instanceRefKlass::oop_follow_contents(oop obj) {
    1.60 +  if (UseCompressedOops) {
    1.61 +    specialized_oop_follow_contents<narrowOop>(this, obj);
    1.62 +  } else {
    1.63 +    specialized_oop_follow_contents<oop>(this, obj);
    1.64 +  }
    1.65  }
    1.66  
    1.67  #ifndef SERIALGC
    1.68 -void instanceRefKlass::oop_follow_contents(ParCompactionManager* cm,
    1.69 -                                           oop obj) {
    1.70 -  oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);
    1.71 -  oop referent = *referent_addr;
    1.72 +template <class T>
    1.73 +static void specialized_oop_follow_contents(instanceRefKlass* ref,
    1.74 +                                            ParCompactionManager* cm,
    1.75 +                                            oop obj) {
    1.76 +  T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
    1.77 +  oop referent = oopDesc::load_decode_heap_oop(referent_addr);
    1.78    debug_only(
    1.79      if(TraceReferenceGC && PrintGCDetails) {
    1.80 -      gclog_or_tty->print_cr("instanceRefKlass::oop_follow_contents " INTPTR_FORMAT, (address)obj);
    1.81 +      gclog_or_tty->print_cr("instanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj);
    1.82      }
    1.83    )
    1.84    if (referent != NULL) {
    1.85      if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) &&
    1.86          PSParallelCompact::ref_processor()->
    1.87 -          discover_reference(obj, reference_type())) {
    1.88 +          discover_reference(obj, ref->reference_type())) {
    1.89        // reference already enqueued, referent will be traversed later
    1.90 -      instanceKlass::oop_follow_contents(cm, obj);
    1.91 +      ref->instanceKlass::oop_follow_contents(cm, obj);
    1.92        debug_only(
    1.93          if(TraceReferenceGC && PrintGCDetails) {
    1.94 -          gclog_or_tty->print_cr("       Non NULL enqueued " INTPTR_FORMAT, (address)obj);
    1.95 +          gclog_or_tty->print_cr("       Non NULL enqueued " INTPTR_FORMAT, obj);
    1.96          }
    1.97        )
    1.98        return;
    1.99 @@ -92,55 +103,106 @@
   1.100        // treat referent as normal oop
   1.101        debug_only(
   1.102          if(TraceReferenceGC && PrintGCDetails) {
   1.103 -          gclog_or_tty->print_cr("       Non NULL normal " INTPTR_FORMAT, (address)obj);
   1.104 +          gclog_or_tty->print_cr("       Non NULL normal " INTPTR_FORMAT, obj);
   1.105          }
   1.106        )
   1.107        PSParallelCompact::mark_and_push(cm, referent_addr);
   1.108      }
   1.109    }
   1.110    // treat next as normal oop.  next is a link in the pending list.
   1.111 -  oop* next_addr = java_lang_ref_Reference::next_addr(obj);
   1.112 +  T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
   1.113    debug_only(
   1.114      if(TraceReferenceGC && PrintGCDetails) {
   1.115        gclog_or_tty->print_cr("   Process next as normal " INTPTR_FORMAT, next_addr);
   1.116      }
   1.117    )
   1.118    PSParallelCompact::mark_and_push(cm, next_addr);
   1.119 -  instanceKlass::oop_follow_contents(cm, obj);
   1.120 +  ref->instanceKlass::oop_follow_contents(cm, obj);
   1.121 +}
   1.122 +
   1.123 +void instanceRefKlass::oop_follow_contents(ParCompactionManager* cm,
   1.124 +                                           oop obj) {
   1.125 +  if (UseCompressedOops) {
   1.126 +    specialized_oop_follow_contents<narrowOop>(this, cm, obj);
   1.127 +  } else {
   1.128 +    specialized_oop_follow_contents<oop>(this, cm, obj);
   1.129 +  }
   1.130  }
   1.131  #endif // SERIALGC
   1.132  
   1.133 +#ifdef ASSERT
   1.134 +template <class T> void trace_reference_gc(const char *s, oop obj,
   1.135 +                                           T* referent_addr,
   1.136 +                                           T* next_addr,
   1.137 +                                           T* discovered_addr) {
   1.138 +  if(TraceReferenceGC && PrintGCDetails) {
   1.139 +    gclog_or_tty->print_cr("%s obj " INTPTR_FORMAT, s, (address)obj);
   1.140 +    gclog_or_tty->print_cr("     referent_addr/* " INTPTR_FORMAT " / "
   1.141 +         INTPTR_FORMAT, referent_addr,
   1.142 +         referent_addr ?
   1.143 +           (address)oopDesc::load_decode_heap_oop(referent_addr) : NULL);
   1.144 +    gclog_or_tty->print_cr("     next_addr/* " INTPTR_FORMAT " / "
   1.145 +         INTPTR_FORMAT, next_addr,
   1.146 +         next_addr ? (address)oopDesc::load_decode_heap_oop(next_addr) : NULL);
   1.147 +    gclog_or_tty->print_cr("     discovered_addr/* " INTPTR_FORMAT " / "
   1.148 +         INTPTR_FORMAT, discovered_addr,
   1.149 +         discovered_addr ?
   1.150 +           (address)oopDesc::load_decode_heap_oop(discovered_addr) : NULL);
   1.151 +  }
   1.152 +}
   1.153 +#endif
   1.154 +
   1.155 +template <class T> void specialized_oop_adjust_pointers(instanceRefKlass *ref, oop obj) {
   1.156 +  T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
   1.157 +  MarkSweep::adjust_pointer(referent_addr);
   1.158 +  T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
   1.159 +  MarkSweep::adjust_pointer(next_addr);
   1.160 +  T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
   1.161 +  MarkSweep::adjust_pointer(discovered_addr);
   1.162 +  debug_only(trace_reference_gc("instanceRefKlass::oop_adjust_pointers", obj,
   1.163 +                                referent_addr, next_addr, discovered_addr);)
   1.164 +}
   1.165  
   1.166  int instanceRefKlass::oop_adjust_pointers(oop obj) {
   1.167    int size = size_helper();
   1.168    instanceKlass::oop_adjust_pointers(obj);
   1.169  
   1.170 -  oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);
   1.171 -  MarkSweep::adjust_pointer(referent_addr);
   1.172 -  oop* next_addr = java_lang_ref_Reference::next_addr(obj);
   1.173 -  MarkSweep::adjust_pointer(next_addr);
   1.174 -  oop* discovered_addr = java_lang_ref_Reference::discovered_addr(obj);
   1.175 -  MarkSweep::adjust_pointer(discovered_addr);
   1.176 -
   1.177 -#ifdef ASSERT
   1.178 -  if(TraceReferenceGC && PrintGCDetails) {
   1.179 -    gclog_or_tty->print_cr("instanceRefKlass::oop_adjust_pointers obj "
   1.180 -                           INTPTR_FORMAT, (address)obj);
   1.181 -    gclog_or_tty->print_cr("     referent_addr/* " INTPTR_FORMAT " / "
   1.182 -                           INTPTR_FORMAT, referent_addr,
   1.183 -                           referent_addr ? (address)*referent_addr : NULL);
   1.184 -    gclog_or_tty->print_cr("     next_addr/* " INTPTR_FORMAT " / "
   1.185 -                           INTPTR_FORMAT, next_addr,
   1.186 -                           next_addr ? (address)*next_addr : NULL);
   1.187 -    gclog_or_tty->print_cr("     discovered_addr/* " INTPTR_FORMAT " / "
   1.188 -                           INTPTR_FORMAT, discovered_addr,
   1.189 -                           discovered_addr ? (address)*discovered_addr : NULL);
   1.190 +  if (UseCompressedOops) {
   1.191 +    specialized_oop_adjust_pointers<narrowOop>(this, obj);
   1.192 +  } else {
   1.193 +    specialized_oop_adjust_pointers<oop>(this, obj);
   1.194    }
   1.195 -#endif
   1.196 -
   1.197    return size;
   1.198  }
   1.199  
   1.200 +#define InstanceRefKlass_SPECIALIZED_OOP_ITERATE(T, nv_suffix, contains)        \
   1.201 +  T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);           \
   1.202 +  oop referent = oopDesc::load_decode_heap_oop(referent_addr);                  \
   1.203 +  if (referent != NULL && contains(referent_addr)) {                            \
   1.204 +    ReferenceProcessor* rp = closure->_ref_processor;                           \
   1.205 +    if (!referent->is_gc_marked() && (rp != NULL) &&                            \
   1.206 +        rp->discover_reference(obj, reference_type())) {                        \
   1.207 +      return size;                                                              \
   1.208 +    } else {                                                                    \
   1.209 +      /* treat referent as normal oop */                                        \
   1.210 +      SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk);\
   1.211 +      closure->do_oop##nv_suffix(referent_addr);                                \
   1.212 +    }                                                                           \
   1.213 +  }                                                                             \
   1.214 +  /* treat next as normal oop */                                                \
   1.215 +  T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);                   \
   1.216 +  if (contains(next_addr)) {                                                    \
   1.217 +    SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk); \
   1.218 +    closure->do_oop##nv_suffix(next_addr);                                      \
   1.219 +  }                                                                             \
   1.220 +  return size;                                                                  \
   1.221 +
   1.222 +
   1.223 +template <class T> bool contains(T *t) { return true; }
   1.224 +
   1.225 +// Macro to define instanceRefKlass::oop_oop_iterate for virtual/nonvirtual for
   1.226 +// all closures.  Macros calling macros above for each oop size.
   1.227 +
   1.228  #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)        \
   1.229                                                                                  \
   1.230  int instanceRefKlass::                                                          \
   1.231 @@ -150,25 +212,11 @@
   1.232                                                                                  \
   1.233    int size = instanceKlass::oop_oop_iterate##nv_suffix(obj, closure);           \
   1.234                                                                                  \
   1.235 -  oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);             \
   1.236 -  oop referent = *referent_addr;                                                \
   1.237 -  if (referent != NULL) {                                                       \
   1.238 -    ReferenceProcessor* rp = closure->_ref_processor;                           \
   1.239 -    if (!referent->is_gc_marked() && (rp != NULL) &&                            \
   1.240 -        rp->discover_reference(obj, reference_type())) {              \
   1.241 -      return size;                                                              \
   1.242 -    } else {                                                                    \
   1.243 -      /* treat referent as normal oop */                                        \
   1.244 -      SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk);\
   1.245 -      closure->do_oop##nv_suffix(referent_addr);                                \
   1.246 -    }                                                                           \
   1.247 +  if (UseCompressedOops) {                                                      \
   1.248 +    InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, contains);   \
   1.249 +  } else {                                                                      \
   1.250 +    InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, contains);         \
   1.251    }                                                                             \
   1.252 -                                                                                \
   1.253 -  /* treat next as normal oop */                                                \
   1.254 -  oop* next_addr = java_lang_ref_Reference::next_addr(obj);                     \
   1.255 -  SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk); \
   1.256 -  closure->do_oop##nv_suffix(next_addr);                                        \
   1.257 -  return size;                                                                  \
   1.258  }
   1.259  
   1.260  #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix)      \
   1.261 @@ -180,28 +228,11 @@
   1.262    SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\
   1.263                                                                                  \
   1.264    int size = instanceKlass::oop_oop_iterate##nv_suffix##_m(obj, closure, mr);   \
   1.265 -                                                                                \
   1.266 -  oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);             \
   1.267 -  oop referent = *referent_addr;                                                \
   1.268 -  if (referent != NULL && mr.contains(referent_addr)) {                         \
   1.269 -    ReferenceProcessor* rp = closure->_ref_processor;                           \
   1.270 -    if (!referent->is_gc_marked() && (rp != NULL) &&                            \
   1.271 -        rp->discover_reference(obj, reference_type())) {              \
   1.272 -      return size;                                                              \
   1.273 -    } else {                                                                    \
   1.274 -      /* treat referent as normal oop */                                        \
   1.275 -      SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk);\
   1.276 -      closure->do_oop##nv_suffix(referent_addr);                                \
   1.277 -    }                                                                           \
   1.278 +  if (UseCompressedOops) {                                                      \
   1.279 +    InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, mr.contains); \
   1.280 +  } else {                                                                      \
   1.281 +    InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, mr.contains);      \
   1.282    }                                                                             \
   1.283 -                                                                                \
   1.284 -  /* treat next as normal oop */                                                \
   1.285 -  oop* next_addr = java_lang_ref_Reference::next_addr(obj);                     \
   1.286 -  if (mr.contains(next_addr)) {                                                 \
   1.287 -    SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk);\
   1.288 -    closure->do_oop##nv_suffix(next_addr);                                      \
   1.289 -  }                                                                             \
   1.290 -  return size;                                                                  \
   1.291  }
   1.292  
   1.293  ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN)
   1.294 @@ -209,16 +240,17 @@
   1.295  ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m)
   1.296  ALL_OOP_OOP_ITERATE_CLOSURES_3(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m)
   1.297  
   1.298 -
   1.299  #ifndef SERIALGC
   1.300 -void instanceRefKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   1.301 +template <class T>
   1.302 +void specialized_oop_copy_contents(instanceRefKlass *ref,
   1.303 +                                   PSPromotionManager* pm, oop obj) {
   1.304    assert(!pm->depth_first(), "invariant");
   1.305 -  oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);
   1.306 -  if (PSScavenge::should_scavenge(*referent_addr)) {
   1.307 +  T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
   1.308 +  if (PSScavenge::should_scavenge(referent_addr)) {
   1.309      ReferenceProcessor* rp = PSScavenge::reference_processor();
   1.310 -    if (rp->discover_reference(obj, reference_type())) {
   1.311 +    if (rp->discover_reference(obj, ref->reference_type())) {
   1.312        // reference already enqueued, referent and next will be traversed later
   1.313 -      instanceKlass::oop_copy_contents(pm, obj);
   1.314 +      ref->instanceKlass::oop_copy_contents(pm, obj);
   1.315        return;
   1.316      } else {
   1.317        // treat referent as normal oop
   1.318 @@ -226,21 +258,31 @@
   1.319      }
   1.320    }
   1.321    // treat next as normal oop
   1.322 -  oop* next_addr = java_lang_ref_Reference::next_addr(obj);
   1.323 -  if (PSScavenge::should_scavenge(*next_addr)) {
   1.324 +  T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
   1.325 +  if (PSScavenge::should_scavenge(next_addr)) {
   1.326      pm->claim_or_forward_breadth(next_addr);
   1.327    }
   1.328 -  instanceKlass::oop_copy_contents(pm, obj);
   1.329 +  ref->instanceKlass::oop_copy_contents(pm, obj);
   1.330  }
   1.331  
   1.332 -void instanceRefKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
   1.333 +void instanceRefKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
   1.334 +  if (UseCompressedOops) {
   1.335 +    specialized_oop_copy_contents<narrowOop>(this, pm, obj);
   1.336 +  } else {
   1.337 +    specialized_oop_copy_contents<oop>(this, pm, obj);
   1.338 +  }
   1.339 +}
   1.340 +
   1.341 +template <class T>
   1.342 +void specialized_oop_push_contents(instanceRefKlass *ref,
   1.343 +                                   PSPromotionManager* pm, oop obj) {
   1.344    assert(pm->depth_first(), "invariant");
   1.345 -  oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);
   1.346 -  if (PSScavenge::should_scavenge(*referent_addr)) {
   1.347 +  T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
   1.348 +  if (PSScavenge::should_scavenge(referent_addr)) {
   1.349      ReferenceProcessor* rp = PSScavenge::reference_processor();
   1.350 -    if (rp->discover_reference(obj, reference_type())) {
   1.351 +    if (rp->discover_reference(obj, ref->reference_type())) {
   1.352        // reference already enqueued, referent and next will be traversed later
   1.353 -      instanceKlass::oop_push_contents(pm, obj);
   1.354 +      ref->instanceKlass::oop_push_contents(pm, obj);
   1.355        return;
   1.356      } else {
   1.357        // treat referent as normal oop
   1.358 @@ -248,71 +290,68 @@
   1.359      }
   1.360    }
   1.361    // treat next as normal oop
   1.362 -  oop* next_addr = java_lang_ref_Reference::next_addr(obj);
   1.363 -  if (PSScavenge::should_scavenge(*next_addr)) {
   1.364 +  T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
   1.365 +  if (PSScavenge::should_scavenge(next_addr)) {
   1.366      pm->claim_or_forward_depth(next_addr);
   1.367    }
   1.368 -  instanceKlass::oop_push_contents(pm, obj);
   1.369 +  ref->instanceKlass::oop_push_contents(pm, obj);
   1.370 +}
   1.371 +
   1.372 +void instanceRefKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
   1.373 +  if (UseCompressedOops) {
   1.374 +    specialized_oop_push_contents<narrowOop>(this, pm, obj);
   1.375 +  } else {
   1.376 +    specialized_oop_push_contents<oop>(this, pm, obj);
   1.377 +  }
   1.378 +}
   1.379 +
   1.380 +template <class T>
   1.381 +void specialized_oop_update_pointers(instanceRefKlass *ref,
   1.382 +                                    ParCompactionManager* cm, oop obj) {
   1.383 +  T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
   1.384 +  PSParallelCompact::adjust_pointer(referent_addr);
   1.385 +  T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
   1.386 +  PSParallelCompact::adjust_pointer(next_addr);
   1.387 +  T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj);
   1.388 +  PSParallelCompact::adjust_pointer(discovered_addr);
   1.389 +  debug_only(trace_reference_gc("instanceRefKlass::oop_update_ptrs", obj,
   1.390 +                                referent_addr, next_addr, discovered_addr);)
   1.391  }
   1.392  
   1.393  int instanceRefKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
   1.394    instanceKlass::oop_update_pointers(cm, obj);
   1.395 +  if (UseCompressedOops) {
   1.396 +    specialized_oop_update_pointers<narrowOop>(this, cm, obj);
   1.397 +  } else {
   1.398 +    specialized_oop_update_pointers<oop>(this, cm, obj);
   1.399 +  }
   1.400 +  return size_helper();
   1.401 +}
   1.402  
   1.403 -  oop* referent_addr = java_lang_ref_Reference::referent_addr(obj);
   1.404 -  PSParallelCompact::adjust_pointer(referent_addr);
   1.405 -  oop* next_addr = java_lang_ref_Reference::next_addr(obj);
   1.406 -  PSParallelCompact::adjust_pointer(next_addr);
   1.407 -  oop* discovered_addr = java_lang_ref_Reference::discovered_addr(obj);
   1.408 -  PSParallelCompact::adjust_pointer(discovered_addr);
   1.409  
   1.410 -#ifdef ASSERT
   1.411 -  if(TraceReferenceGC && PrintGCDetails) {
   1.412 -    gclog_or_tty->print_cr("instanceRefKlass::oop_update_pointers obj "
   1.413 -                           INTPTR_FORMAT, (oopDesc*) obj);
   1.414 -    gclog_or_tty->print_cr("     referent_addr/* " INTPTR_FORMAT " / "
   1.415 -                           INTPTR_FORMAT, referent_addr,
   1.416 -                           referent_addr ? (oopDesc*) *referent_addr : NULL);
   1.417 -    gclog_or_tty->print_cr("     next_addr/* " INTPTR_FORMAT " / "
   1.418 -                           INTPTR_FORMAT, next_addr,
   1.419 -                           next_addr ? (oopDesc*) *next_addr : NULL);
   1.420 -    gclog_or_tty->print_cr("     discovered_addr/* " INTPTR_FORMAT " / "
   1.421 -                   INTPTR_FORMAT, discovered_addr,
   1.422 -                   discovered_addr ? (oopDesc*) *discovered_addr : NULL);
   1.423 -  }
   1.424 -#endif
   1.425 -
   1.426 -  return size_helper();
   1.427 +template <class T> void
   1.428 +specialized_oop_update_pointers(ParCompactionManager* cm, oop obj,
   1.429 +                                HeapWord* beg_addr, HeapWord* end_addr) {
   1.430 +  T* p;
   1.431 +  T* referent_addr = p = (T*)java_lang_ref_Reference::referent_addr(obj);
   1.432 +  PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   1.433 +  T* next_addr = p = (T*)java_lang_ref_Reference::next_addr(obj);
   1.434 +  PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   1.435 +  T* discovered_addr = p = (T*)java_lang_ref_Reference::discovered_addr(obj);
   1.436 +  PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   1.437 +  debug_only(trace_reference_gc("instanceRefKlass::oop_update_ptrs", obj,
   1.438 +                                referent_addr, next_addr, discovered_addr);)
   1.439  }
   1.440  
   1.441  int
   1.442  instanceRefKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
   1.443                                        HeapWord* beg_addr, HeapWord* end_addr) {
   1.444    instanceKlass::oop_update_pointers(cm, obj, beg_addr, end_addr);
   1.445 -
   1.446 -  oop* p;
   1.447 -  oop* referent_addr = p = java_lang_ref_Reference::referent_addr(obj);
   1.448 -  PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   1.449 -  oop* next_addr = p = java_lang_ref_Reference::next_addr(obj);
   1.450 -  PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   1.451 -  oop* discovered_addr = p = java_lang_ref_Reference::discovered_addr(obj);
   1.452 -  PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   1.453 -
   1.454 -#ifdef ASSERT
   1.455 -  if(TraceReferenceGC && PrintGCDetails) {
   1.456 -    gclog_or_tty->print_cr("instanceRefKlass::oop_update_pointers obj "
   1.457 -                           INTPTR_FORMAT, (oopDesc*) obj);
   1.458 -    gclog_or_tty->print_cr("     referent_addr/* " INTPTR_FORMAT " / "
   1.459 -                           INTPTR_FORMAT, referent_addr,
   1.460 -                           referent_addr ? (oopDesc*) *referent_addr : NULL);
   1.461 -    gclog_or_tty->print_cr("     next_addr/* " INTPTR_FORMAT " / "
   1.462 -                           INTPTR_FORMAT, next_addr,
   1.463 -                           next_addr ? (oopDesc*) *next_addr : NULL);
   1.464 -    gclog_or_tty->print_cr("     discovered_addr/* " INTPTR_FORMAT " / "
   1.465 -                   INTPTR_FORMAT, discovered_addr,
   1.466 -                   discovered_addr ? (oopDesc*) *discovered_addr : NULL);
   1.467 +  if (UseCompressedOops) {
   1.468 +    specialized_oop_update_pointers<narrowOop>(cm, obj, beg_addr, end_addr);
   1.469 +  } else {
   1.470 +    specialized_oop_update_pointers<oop>(cm, obj, beg_addr, end_addr);
   1.471    }
   1.472 -#endif
   1.473 -
   1.474    return size_helper();
   1.475  }
   1.476  #endif // SERIALGC
   1.477 @@ -338,7 +377,7 @@
   1.478    // offset 2 (words) and has 4 map entries.
   1.479    debug_only(int offset = java_lang_ref_Reference::referent_offset);
   1.480    debug_only(int length = ((java_lang_ref_Reference::discovered_offset -
   1.481 -    java_lang_ref_Reference::referent_offset)/wordSize) + 1);
   1.482 +    java_lang_ref_Reference::referent_offset)/heapOopSize) + 1);
   1.483  
   1.484    if (UseSharedSpaces) {
   1.485      assert(map->offset() == java_lang_ref_Reference::queue_offset &&
   1.486 @@ -368,22 +407,35 @@
   1.487  
   1.488    if (referent != NULL) {
   1.489      guarantee(referent->is_oop(), "referent field heap failed");
   1.490 -    if (gch != NULL && !gch->is_in_youngest(obj))
   1.491 +    if (gch != NULL && !gch->is_in_youngest(obj)) {
   1.492        // We do a specific remembered set check here since the referent
   1.493        // field is not part of the oop mask and therefore skipped by the
   1.494        // regular verify code.
   1.495 -      obj->verify_old_oop(java_lang_ref_Reference::referent_addr(obj), true);
   1.496 +      if (UseCompressedOops) {
   1.497 +        narrowOop* referent_addr = (narrowOop*)java_lang_ref_Reference::referent_addr(obj);
   1.498 +        obj->verify_old_oop(referent_addr, true);
   1.499 +      } else {
   1.500 +        oop* referent_addr = (oop*)java_lang_ref_Reference::referent_addr(obj);
   1.501 +        obj->verify_old_oop(referent_addr, true);
   1.502 +      }
   1.503 +    }
   1.504    }
   1.505    // Verify next field
   1.506    oop next = java_lang_ref_Reference::next(obj);
   1.507    if (next != NULL) {
   1.508 -    guarantee(next->is_oop(), "next field verify failed");
   1.509 +    guarantee(next->is_oop(), "next field verify fa iled");
   1.510      guarantee(next->is_instanceRef(), "next field verify failed");
   1.511      if (gch != NULL && !gch->is_in_youngest(obj)) {
   1.512        // We do a specific remembered set check here since the next field is
   1.513        // not part of the oop mask and therefore skipped by the regular
   1.514        // verify code.
   1.515 -      obj->verify_old_oop(java_lang_ref_Reference::next_addr(obj), true);
   1.516 +      if (UseCompressedOops) {
   1.517 +        narrowOop* next_addr = (narrowOop*)java_lang_ref_Reference::next_addr(obj);
   1.518 +        obj->verify_old_oop(next_addr, true);
   1.519 +      } else {
   1.520 +        oop* next_addr = (oop*)java_lang_ref_Reference::next_addr(obj);
   1.521 +        obj->verify_old_oop(next_addr, true);
   1.522 +      }
   1.523      }
   1.524    }
   1.525  }

mercurial