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);
|