comparison src/share/vm/memory/referenceProcessor.cpp @ 12355:cefad50507d8

Merge with hs25-b53
author Gilles Duboscq <duboscq@ssw.jku.at>
date Fri, 11 Oct 2013 10:38:03 +0200
parents f22cbff51c12 190899198332
children 359f7e70ae7f
comparison
equal deleted inserted replaced
12058:ccb4f2af2319 12355:cefad50507d8
364 obj = next_d; 364 obj = next_d;
365 assert(obj->is_instanceRef(), "should be reference object"); 365 assert(obj->is_instanceRef(), "should be reference object");
366 next_d = java_lang_ref_Reference::discovered(obj); 366 next_d = java_lang_ref_Reference::discovered(obj);
367 if (TraceReferenceGC && PrintGCDetails) { 367 if (TraceReferenceGC && PrintGCDetails) {
368 gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT, 368 gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT,
369 obj, next_d); 369 (void *)obj, (void *)next_d);
370 } 370 }
371 assert(java_lang_ref_Reference::next(obj) == NULL, 371 assert(java_lang_ref_Reference::next(obj) == NULL,
372 "Reference not active; should not be discovered"); 372 "Reference not active; should not be discovered");
373 // Self-loop next, so as to make Ref not active. 373 // Self-loop next, so as to make Ref not active.
374 java_lang_ref_Reference::set_next(obj, obj); 374 java_lang_ref_Reference::set_next(obj, obj);
389 obj = next_d; 389 obj = next_d;
390 assert(obj->is_instanceRef(), "should be reference object"); 390 assert(obj->is_instanceRef(), "should be reference object");
391 next_d = java_lang_ref_Reference::discovered(obj); 391 next_d = java_lang_ref_Reference::discovered(obj);
392 if (TraceReferenceGC && PrintGCDetails) { 392 if (TraceReferenceGC && PrintGCDetails) {
393 gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT, 393 gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT,
394 obj, next_d); 394 (void *)obj, (void *)next_d);
395 } 395 }
396 assert(java_lang_ref_Reference::next(obj) == NULL, 396 assert(java_lang_ref_Reference::next(obj) == NULL,
397 "The reference should not be enqueued"); 397 "The reference should not be enqueued");
398 if (next_d == obj) { // obj is last 398 if (next_d == obj) { // obj is last
399 // Swap refs_list into pendling_list_addr and 399 // Swap refs_list into pendling_list_addr and
559 bool referent_is_dead = (iter.referent() != NULL) && !iter.is_referent_alive(); 559 bool referent_is_dead = (iter.referent() != NULL) && !iter.is_referent_alive();
560 if (referent_is_dead && 560 if (referent_is_dead &&
561 !policy->should_clear_reference(iter.obj(), _soft_ref_timestamp_clock)) { 561 !policy->should_clear_reference(iter.obj(), _soft_ref_timestamp_clock)) {
562 if (TraceReferenceGC) { 562 if (TraceReferenceGC) {
563 gclog_or_tty->print_cr("Dropping reference (" INTPTR_FORMAT ": %s" ") by policy", 563 gclog_or_tty->print_cr("Dropping reference (" INTPTR_FORMAT ": %s" ") by policy",
564 iter.obj(), iter.obj()->klass()->internal_name()); 564 (void *)iter.obj(), iter.obj()->klass()->internal_name());
565 } 565 }
566 // Remove Reference object from list 566 // Remove Reference object from list
567 iter.remove(); 567 iter.remove();
568 // Make the Reference object active again 568 // Make the Reference object active again
569 iter.make_active(); 569 iter.make_active();
598 DEBUG_ONLY(oop next = java_lang_ref_Reference::next(iter.obj());) 598 DEBUG_ONLY(oop next = java_lang_ref_Reference::next(iter.obj());)
599 assert(next == NULL, "Should not discover inactive Reference"); 599 assert(next == NULL, "Should not discover inactive Reference");
600 if (iter.is_referent_alive()) { 600 if (iter.is_referent_alive()) {
601 if (TraceReferenceGC) { 601 if (TraceReferenceGC) {
602 gclog_or_tty->print_cr("Dropping strongly reachable reference (" INTPTR_FORMAT ": %s)", 602 gclog_or_tty->print_cr("Dropping strongly reachable reference (" INTPTR_FORMAT ": %s)",
603 iter.obj(), iter.obj()->klass()->internal_name()); 603 (void *)iter.obj(), iter.obj()->klass()->internal_name());
604 } 604 }
605 // The referent is reachable after all. 605 // The referent is reachable after all.
606 // Remove Reference object from list. 606 // Remove Reference object from list.
607 iter.remove(); 607 iter.remove();
608 // Update the referent pointer as necessary: Note that this 608 // Update the referent pointer as necessary: Note that this
684 iter.make_referent_alive(); 684 iter.make_referent_alive();
685 } 685 }
686 if (TraceReferenceGC) { 686 if (TraceReferenceGC) {
687 gclog_or_tty->print_cr("Adding %sreference (" INTPTR_FORMAT ": %s) as pending", 687 gclog_or_tty->print_cr("Adding %sreference (" INTPTR_FORMAT ": %s) as pending",
688 clear_referent ? "cleared " : "", 688 clear_referent ? "cleared " : "",
689 iter.obj(), iter.obj()->klass()->internal_name()); 689 (void *)iter.obj(), iter.obj()->klass()->internal_name());
690 } 690 }
691 assert(iter.obj()->is_oop(UseConcMarkSweepGC), "Adding a bad reference"); 691 assert(iter.obj()->is_oop(UseConcMarkSweepGC), "Adding a bad reference");
692 iter.next(); 692 iter.next();
693 } 693 }
694 // Remember to update the next pointer of the last ref. 694 // Remember to update the next pointer of the last ref.
1000 debug_only( 1000 debug_only(
1001 if (PrintGCDetails && TraceReferenceGC) { 1001 if (PrintGCDetails && TraceReferenceGC) {
1002 gclog_or_tty->print_cr("clean_up_discovered_list: Dropping Reference: " 1002 gclog_or_tty->print_cr("clean_up_discovered_list: Dropping Reference: "
1003 INTPTR_FORMAT " with next field: " INTPTR_FORMAT 1003 INTPTR_FORMAT " with next field: " INTPTR_FORMAT
1004 " and referent: " INTPTR_FORMAT, 1004 " and referent: " INTPTR_FORMAT,
1005 iter.obj(), next, iter.referent()); 1005 (void *)iter.obj(), (void *)next, (void *)iter.referent());
1006 } 1006 }
1007 ) 1007 )
1008 // Remove Reference object from list 1008 // Remove Reference object from list
1009 iter.remove(); 1009 iter.remove();
1010 iter.move_to_next(); 1010 iter.move_to_next();
1100 _bs->write_ref_field((void*)discovered_addr, next_discovered); 1100 _bs->write_ref_field((void*)discovered_addr, next_discovered);
1101 } 1101 }
1102 1102
1103 if (TraceReferenceGC) { 1103 if (TraceReferenceGC) {
1104 gclog_or_tty->print_cr("Discovered reference (mt) (" INTPTR_FORMAT ": %s)", 1104 gclog_or_tty->print_cr("Discovered reference (mt) (" INTPTR_FORMAT ": %s)",
1105 obj, obj->klass()->internal_name()); 1105 (void *)obj, obj->klass()->internal_name());
1106 } 1106 }
1107 } else { 1107 } else {
1108 // If retest was non NULL, another thread beat us to it: 1108 // If retest was non NULL, another thread beat us to it:
1109 // The reference has already been discovered... 1109 // The reference has already been discovered...
1110 if (TraceReferenceGC) { 1110 if (TraceReferenceGC) {
1111 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)", 1111 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)",
1112 obj, obj->klass()->internal_name()); 1112 (void *)obj, obj->klass()->internal_name());
1113 } 1113 }
1114 } 1114 }
1115 } 1115 }
1116 1116
1117 #ifndef PRODUCT 1117 #ifndef PRODUCT
1122 bool da = discovery_is_atomic(); 1122 bool da = discovery_is_atomic();
1123 oop referent = java_lang_ref_Reference::referent(obj); 1123 oop referent = java_lang_ref_Reference::referent(obj);
1124 assert(da ? referent->is_oop() : referent->is_oop_or_null(), 1124 assert(da ? referent->is_oop() : referent->is_oop_or_null(),
1125 err_msg("Bad referent " INTPTR_FORMAT " found in Reference " 1125 err_msg("Bad referent " INTPTR_FORMAT " found in Reference "
1126 INTPTR_FORMAT " during %satomic discovery ", 1126 INTPTR_FORMAT " during %satomic discovery ",
1127 (intptr_t)referent, (intptr_t)obj, da ? "" : "non-")); 1127 (void *)referent, (void *)obj, da ? "" : "non-"));
1128 } 1128 }
1129 #endif 1129 #endif
1130 1130
1131 // We mention two of several possible choices here: 1131 // We mention two of several possible choices here:
1132 // #0: if the reference object is not in the "originating generation" 1132 // #0: if the reference object is not in the "originating generation"
1202 assert(discovered->is_oop_or_null(), "bad discovered field"); 1202 assert(discovered->is_oop_or_null(), "bad discovered field");
1203 if (discovered != NULL) { 1203 if (discovered != NULL) {
1204 // The reference has already been discovered... 1204 // The reference has already been discovered...
1205 if (TraceReferenceGC) { 1205 if (TraceReferenceGC) {
1206 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)", 1206 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)",
1207 obj, obj->klass()->internal_name()); 1207 (void *)obj, obj->klass()->internal_name());
1208 } 1208 }
1209 if (RefDiscoveryPolicy == ReferentBasedDiscovery) { 1209 if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1210 // assumes that an object is not processed twice; 1210 // assumes that an object is not processed twice;
1211 // if it's been already discovered it must be on another 1211 // if it's been already discovered it must be on another
1212 // generation's discovered list; so we won't discover it. 1212 // generation's discovered list; so we won't discover it.
1270 list->set_head(obj); 1270 list->set_head(obj);
1271 list->inc_length(1); 1271 list->inc_length(1);
1272 1272
1273 if (TraceReferenceGC) { 1273 if (TraceReferenceGC) {
1274 gclog_or_tty->print_cr("Discovered reference (" INTPTR_FORMAT ": %s)", 1274 gclog_or_tty->print_cr("Discovered reference (" INTPTR_FORMAT ": %s)",
1275 obj, obj->klass()->internal_name()); 1275 (void *)obj, obj->klass()->internal_name());
1276 } 1276 }
1277 } 1277 }
1278 assert(obj->is_oop(), "Discovered a bad reference"); 1278 assert(obj->is_oop(), "Discovered a bad reference");
1279 verify_referent(obj); 1279 verify_referent(obj);
1280 return true; 1280 return true;
1369 next != NULL) { 1369 next != NULL) {
1370 // The referent has been cleared, or is alive, or the Reference is not 1370 // The referent has been cleared, or is alive, or the Reference is not
1371 // active; we need to trace and mark its cohort. 1371 // active; we need to trace and mark its cohort.
1372 if (TraceReferenceGC) { 1372 if (TraceReferenceGC) {
1373 gclog_or_tty->print_cr("Precleaning Reference (" INTPTR_FORMAT ": %s)", 1373 gclog_or_tty->print_cr("Precleaning Reference (" INTPTR_FORMAT ": %s)",
1374 iter.obj(), iter.obj()->klass()->internal_name()); 1374 (void *)iter.obj(), iter.obj()->klass()->internal_name());
1375 } 1375 }
1376 // Remove Reference object from list 1376 // Remove Reference object from list
1377 iter.remove(); 1377 iter.remove();
1378 // Keep alive its cohort. 1378 // Keep alive its cohort.
1379 iter.make_referent_alive(); 1379 iter.make_referent_alive();