Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/heapRegion.cpp @ 6948:e522a00b91aa
Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/ after NPG - C++ build works
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 12 Nov 2012 23:14:12 +0100 |
parents | c38f13903fdf 8fbf05030e24 |
children | ff4fa8b0516e |
comparison
equal
deleted
inserted
replaced
6711:ae13cc658b80 | 6948:e522a00b91aa |
---|---|
38 size_t HeapRegion::GrainBytes = 0; | 38 size_t HeapRegion::GrainBytes = 0; |
39 size_t HeapRegion::GrainWords = 0; | 39 size_t HeapRegion::GrainWords = 0; |
40 size_t HeapRegion::CardsPerRegion = 0; | 40 size_t HeapRegion::CardsPerRegion = 0; |
41 | 41 |
42 HeapRegionDCTOC::HeapRegionDCTOC(G1CollectedHeap* g1, | 42 HeapRegionDCTOC::HeapRegionDCTOC(G1CollectedHeap* g1, |
43 HeapRegion* hr, OopClosure* cl, | 43 HeapRegion* hr, ExtendedOopClosure* cl, |
44 CardTableModRefBS::PrecisionStyle precision, | 44 CardTableModRefBS::PrecisionStyle precision, |
45 FilterKind fk) : | 45 FilterKind fk) : |
46 ContiguousSpaceDCTOC(hr, cl, precision, NULL), | 46 ContiguousSpaceDCTOC(hr, cl, precision, NULL), |
47 _hr(hr), _fk(fk), _g1(g1) { } | 47 _hr(hr), _fk(fk), _g1(g1) { } |
48 | 48 |
81 virtual void do_oop(narrowOop* p) { do_oop_work(p); } | 81 virtual void do_oop(narrowOop* p) { do_oop_work(p); } |
82 virtual void do_oop( oop* p) { do_oop_work(p); } | 82 virtual void do_oop( oop* p) { do_oop_work(p); } |
83 | 83 |
84 void print_object(outputStream* out, oop obj) { | 84 void print_object(outputStream* out, oop obj) { |
85 #ifdef PRODUCT | 85 #ifdef PRODUCT |
86 klassOop k = obj->klass(); | 86 Klass* k = obj->klass(); |
87 const char* class_name = instanceKlass::cast(k)->external_name(); | 87 const char* class_name = InstanceKlass::cast(k)->external_name(); |
88 out->print_cr("class name %s", class_name); | 88 out->print_cr("class name %s", class_name); |
89 #else // PRODUCT | 89 #else // PRODUCT |
90 obj->print_on(out); | 90 obj->print_on(out); |
91 #endif // PRODUCT | 91 #endif // PRODUCT |
92 } | 92 } |
211 } | 211 } |
212 | 212 |
213 void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr, | 213 void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr, |
214 HeapWord* bottom, | 214 HeapWord* bottom, |
215 HeapWord* top, | 215 HeapWord* top, |
216 OopClosure* cl) { | 216 ExtendedOopClosure* cl) { |
217 G1CollectedHeap* g1h = _g1; | 217 G1CollectedHeap* g1h = _g1; |
218 int oop_size; | 218 int oop_size; |
219 OopClosure* cl2 = NULL; | 219 ExtendedOopClosure* cl2 = NULL; |
220 | 220 |
221 FilterIntoCSClosure intoCSFilt(this, g1h, cl); | 221 FilterIntoCSClosure intoCSFilt(this, g1h, cl); |
222 FilterOutOfRegionClosure outOfRegionFilt(_hr, cl); | 222 FilterOutOfRegionClosure outOfRegionFilt(_hr, cl); |
223 | 223 |
224 switch (_fk) { | 224 switch (_fk) { |
474 } | 474 } |
475 assert(low == high && low >= addr, "Didn't work."); | 475 assert(low == high && low >= addr, "Didn't work."); |
476 return low; | 476 return low; |
477 } | 477 } |
478 | 478 |
479 void HeapRegion::initialize(MemRegion mr, bool clear_space, bool mangle_space) { | |
480 G1OffsetTableContigSpace::initialize(mr, false, mangle_space); | |
481 hr_clear(false/*par*/, clear_space); | |
482 } | |
483 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away | 479 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away |
484 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list | 480 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list |
485 #endif // _MSC_VER | 481 #endif // _MSC_VER |
486 | 482 |
487 | 483 |
488 HeapRegion::HeapRegion(uint hrs_index, | 484 HeapRegion::HeapRegion(uint hrs_index, |
489 G1BlockOffsetSharedArray* sharedOffsetArray, | 485 G1BlockOffsetSharedArray* sharedOffsetArray, |
490 MemRegion mr, bool is_zeroed) : | 486 MemRegion mr) : |
491 G1OffsetTableContigSpace(sharedOffsetArray, mr, is_zeroed), | 487 G1OffsetTableContigSpace(sharedOffsetArray, mr), |
492 _hrs_index(hrs_index), | 488 _hrs_index(hrs_index), |
493 _humongous_type(NotHumongous), _humongous_start_region(NULL), | 489 _humongous_type(NotHumongous), _humongous_start_region(NULL), |
494 _in_collection_set(false), | 490 _in_collection_set(false), |
495 _next_in_special_set(NULL), _orig_end(NULL), | 491 _next_in_special_set(NULL), _orig_end(NULL), |
496 _claimed(InitialClaimValue), _evacuation_failed(false), | 492 _claimed(InitialClaimValue), _evacuation_failed(false), |
505 _predicted_bytes_to_copy(0) | 501 _predicted_bytes_to_copy(0) |
506 { | 502 { |
507 _orig_end = mr.end(); | 503 _orig_end = mr.end(); |
508 // Note that initialize() will set the start of the unmarked area of the | 504 // Note that initialize() will set the start of the unmarked area of the |
509 // region. | 505 // region. |
510 this->initialize(mr, !is_zeroed, SpaceDecorator::Mangle); | 506 hr_clear(false /*par*/, false /*clear_space*/); |
511 set_top(bottom()); | 507 set_top(bottom()); |
512 set_saved_mark(); | 508 set_saved_mark(); |
513 | 509 |
514 _rem_set = new HeapRegionRemSet(sharedOffsetArray, this); | 510 _rem_set = new HeapRegionRemSet(sharedOffsetArray, this); |
515 | 511 |
533 | 529 |
534 void HeapRegion::save_marks() { | 530 void HeapRegion::save_marks() { |
535 set_saved_mark(); | 531 set_saved_mark(); |
536 } | 532 } |
537 | 533 |
538 void HeapRegion::oops_in_mr_iterate(MemRegion mr, OopClosure* cl) { | 534 void HeapRegion::oops_in_mr_iterate(MemRegion mr, ExtendedOopClosure* cl) { |
539 HeapWord* p = mr.start(); | 535 HeapWord* p = mr.start(); |
540 HeapWord* e = mr.end(); | 536 HeapWord* e = mr.end(); |
541 oop obj; | 537 oop obj; |
542 while (p < e) { | 538 while (p < e) { |
543 obj = oop(p); | 539 obj = oop(p); |
551 ContiguousSpace::oop_since_save_marks_iterate##nv_suffix(cl); \ | 547 ContiguousSpace::oop_since_save_marks_iterate##nv_suffix(cl); \ |
552 } | 548 } |
553 SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN) | 549 SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(HeapRegion_OOP_SINCE_SAVE_MARKS_DEFN) |
554 | 550 |
555 | 551 |
556 void HeapRegion::oop_before_save_marks_iterate(OopClosure* cl) { | 552 void HeapRegion::oop_before_save_marks_iterate(ExtendedOopClosure* cl) { |
557 oops_in_mr_iterate(MemRegion(bottom(), saved_mark_word()), cl); | 553 oops_in_mr_iterate(MemRegion(bottom(), saved_mark_word()), cl); |
558 } | 554 } |
559 | 555 |
560 void HeapRegion::note_self_forwarding_removal_start(bool during_initial_mark, | 556 void HeapRegion::note_self_forwarding_removal_start(bool during_initial_mark, |
561 bool during_conc_mark) { | 557 bool during_conc_mark) { |
799 return; | 795 return; |
800 } | 796 } |
801 | 797 |
802 if (!g1->is_obj_dead_cond(obj, this, vo)) { | 798 if (!g1->is_obj_dead_cond(obj, this, vo)) { |
803 if (obj->is_oop()) { | 799 if (obj->is_oop()) { |
804 klassOop klass = obj->klass(); | 800 Klass* klass = obj->klass(); |
805 if (!klass->is_perm()) { | 801 if (!klass->is_metadata()) { |
806 gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" " | 802 gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" " |
807 "not in perm", klass, obj); | 803 "not metadata", klass, obj); |
808 *failures = true; | 804 *failures = true; |
809 return; | 805 return; |
810 } else if (!klass->is_klass()) { | 806 } else if (!klass->is_klass()) { |
811 gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" " | 807 gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" " |
812 "not a klass", klass, obj); | 808 "not a klass", klass, obj); |
813 *failures = true; | 809 *failures = true; |
814 return; | 810 return; |
815 } else { | 811 } else { |
816 vl_cl.set_containing_obj(obj); | 812 vl_cl.set_containing_obj(obj); |
817 obj->oop_iterate(&vl_cl); | 813 obj->oop_iterate_no_header(&vl_cl); |
818 if (vl_cl.failures()) { | 814 if (vl_cl.failures()) { |
819 *failures = true; | 815 *failures = true; |
820 } | 816 } |
821 if (G1MaxVerifyFailures >= 0 && | 817 if (G1MaxVerifyFailures >= 0 && |
822 vl_cl.n_failures() >= G1MaxVerifyFailures) { | 818 vl_cl.n_failures() >= G1MaxVerifyFailures) { |
905 } | 901 } |
906 } | 902 } |
907 | 903 |
908 // G1OffsetTableContigSpace code; copied from space.cpp. Hope this can go | 904 // G1OffsetTableContigSpace code; copied from space.cpp. Hope this can go |
909 // away eventually. | 905 // away eventually. |
910 | |
911 void G1OffsetTableContigSpace::initialize(MemRegion mr, bool clear_space, bool mangle_space) { | |
912 // false ==> we'll do the clearing if there's clearing to be done. | |
913 ContiguousSpace::initialize(mr, false, mangle_space); | |
914 _offsets.zero_bottom_entry(); | |
915 _offsets.initialize_threshold(); | |
916 if (clear_space) clear(mangle_space); | |
917 } | |
918 | 906 |
919 void G1OffsetTableContigSpace::clear(bool mangle_space) { | 907 void G1OffsetTableContigSpace::clear(bool mangle_space) { |
920 ContiguousSpace::clear(mangle_space); | 908 ContiguousSpace::clear(mangle_space); |
921 _offsets.zero_bottom_entry(); | 909 _offsets.zero_bottom_entry(); |
922 _offsets.initialize_threshold(); | 910 _offsets.initialize_threshold(); |
981 } | 969 } |
982 } | 970 } |
983 | 971 |
984 G1OffsetTableContigSpace:: | 972 G1OffsetTableContigSpace:: |
985 G1OffsetTableContigSpace(G1BlockOffsetSharedArray* sharedOffsetArray, | 973 G1OffsetTableContigSpace(G1BlockOffsetSharedArray* sharedOffsetArray, |
986 MemRegion mr, bool is_zeroed) : | 974 MemRegion mr) : |
987 _offsets(sharedOffsetArray, mr), | 975 _offsets(sharedOffsetArray, mr), |
988 _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true), | 976 _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true), |
989 _gc_time_stamp(0) | 977 _gc_time_stamp(0) |
990 { | 978 { |
991 _offsets.set_space(this); | 979 _offsets.set_space(this); |
992 initialize(mr, !is_zeroed, SpaceDecorator::Mangle); | 980 // false ==> we'll do the clearing if there's clearing to be done. |
993 } | 981 ContiguousSpace::initialize(mr, false, SpaceDecorator::Mangle); |
982 _offsets.zero_bottom_entry(); | |
983 _offsets.initialize_threshold(); | |
984 } |