< prev index next >

src/hotspot/share/gc/cms/parNewGeneration.cpp

Print this page
rev 52211 : [mq]: 8212753-improve-forward-to-atomic


1101   dummyOld.set_mark_raw(m);
1102   assert(!dummyOld.is_forwarded(),
1103          "should not be called with forwarding pointer mark word.");
1104 
1105   oop new_obj = NULL;
1106   oop forward_ptr;
1107 
1108   // Try allocating obj in to-space (unless too old)
1109   if (dummyOld.age() < tenuring_threshold()) {
1110     new_obj = (oop)par_scan_state->alloc_in_to_space(sz);
1111     if (new_obj == NULL) {
1112       set_survivor_overflow(true);
1113     }
1114   }
1115 
1116   if (new_obj == NULL) {
1117     // Either to-space is full or we decided to promote try allocating obj tenured
1118 
1119     // Attempt to install a null forwarding pointer (atomically),
1120     // to claim the right to install the real forwarding pointer.
1121     forward_ptr = old->forward_to_atomic(ClaimedForwardPtr);
1122     if (forward_ptr != NULL) {
1123       // someone else beat us to it.
1124         return real_forwardee(old);
1125     }
1126 
1127     if (!_promotion_failed) {
1128       new_obj = _old_gen->par_promote(par_scan_state->thread_num(),
1129                                       old, m, sz);
1130     }
1131 
1132     if (new_obj == NULL) {
1133       // promotion failed, forward to self
1134       _promotion_failed = true;
1135       new_obj = old;
1136 
1137       par_scan_state->preserved_marks()->push_if_necessary(old, m);
1138       par_scan_state->register_promotion_failure(sz);
1139     }
1140 
1141     old->forward_to(new_obj);
1142     forward_ptr = NULL;
1143   } else {
1144     // Is in to-space; do copying ourselves.
1145     Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)new_obj, sz);
1146     assert(CMSHeap::heap()->is_in_reserved(new_obj), "illegal forwarding pointer value.");
1147     forward_ptr = old->forward_to_atomic(new_obj);
1148     // Restore the mark word copied above.
1149     new_obj->set_mark_raw(m);
1150     // Increment age if obj still in new generation
1151     new_obj->incr_age();
1152     par_scan_state->age_table()->add(new_obj, sz);
1153   }
1154   assert(new_obj != NULL, "just checking");
1155 
1156   // This code must come after the CAS test, or it will print incorrect
1157   // information.
1158   log_develop_trace(gc, scavenge)("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
1159                                   is_in_reserved(new_obj) ? "copying" : "tenuring",
1160                                   new_obj->klass()->internal_name(), p2i(old), p2i(new_obj), new_obj->size());
1161 
1162   if (forward_ptr == NULL) {
1163     oop obj_to_push = new_obj;
1164     if (par_scan_state->should_be_partially_scanned(obj_to_push, old)) {
1165       // Length field used as index of next element to be scanned.
1166       // Real length can be obtained from real_forwardee()
1167       arrayOop(old)->set_length(0);




1101   dummyOld.set_mark_raw(m);
1102   assert(!dummyOld.is_forwarded(),
1103          "should not be called with forwarding pointer mark word.");
1104 
1105   oop new_obj = NULL;
1106   oop forward_ptr;
1107 
1108   // Try allocating obj in to-space (unless too old)
1109   if (dummyOld.age() < tenuring_threshold()) {
1110     new_obj = (oop)par_scan_state->alloc_in_to_space(sz);
1111     if (new_obj == NULL) {
1112       set_survivor_overflow(true);
1113     }
1114   }
1115 
1116   if (new_obj == NULL) {
1117     // Either to-space is full or we decided to promote try allocating obj tenured
1118 
1119     // Attempt to install a null forwarding pointer (atomically),
1120     // to claim the right to install the real forwarding pointer.
1121     forward_ptr = old->forward_to_atomic(ClaimedForwardPtr, m);
1122     if (forward_ptr != NULL) {
1123       // someone else beat us to it.
1124         return real_forwardee(old);
1125     }
1126 
1127     if (!_promotion_failed) {
1128       new_obj = _old_gen->par_promote(par_scan_state->thread_num(),
1129                                       old, m, sz);
1130     }
1131 
1132     if (new_obj == NULL) {
1133       // promotion failed, forward to self
1134       _promotion_failed = true;
1135       new_obj = old;
1136 
1137       par_scan_state->preserved_marks()->push_if_necessary(old, m);
1138       par_scan_state->register_promotion_failure(sz);
1139     }
1140 
1141     old->forward_to(new_obj);
1142     forward_ptr = NULL;
1143   } else {
1144     // Is in to-space; do copying ourselves.
1145     Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)new_obj, sz);
1146     assert(CMSHeap::heap()->is_in_reserved(new_obj), "illegal forwarding pointer value.");
1147     forward_ptr = old->forward_to_atomic(new_obj, m);
1148     // Restore the mark word copied above.
1149     new_obj->set_mark_raw(m);
1150     // Increment age if obj still in new generation
1151     new_obj->incr_age();
1152     par_scan_state->age_table()->add(new_obj, sz);
1153   }
1154   assert(new_obj != NULL, "just checking");
1155 
1156   // This code must come after the CAS test, or it will print incorrect
1157   // information.
1158   log_develop_trace(gc, scavenge)("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
1159                                   is_in_reserved(new_obj) ? "copying" : "tenuring",
1160                                   new_obj->klass()->internal_name(), p2i(old), p2i(new_obj), new_obj->size());
1161 
1162   if (forward_ptr == NULL) {
1163     oop obj_to_push = new_obj;
1164     if (par_scan_state->should_be_partially_scanned(obj_to_push, old)) {
1165       // Length field used as index of next element to be scanned.
1166       // Real length can be obtained from real_forwardee()
1167       arrayOop(old)->set_length(0);


< prev index next >