Mercurial > hg > truffle
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(); |