2465 bool ConcurrentMarkSweepGeneration::no_allocs_since_save_marks() { |
2465 bool ConcurrentMarkSweepGeneration::no_allocs_since_save_marks() { |
2466 return cmsSpace()->no_allocs_since_save_marks(); |
2466 return cmsSpace()->no_allocs_since_save_marks(); |
2467 } |
2467 } |
2468 |
2468 |
2469 void |
2469 void |
2470 ConcurrentMarkSweepGeneration::oop_iterate(ExtendedOopClosure* cl) { |
2470 ConcurrentMarkSweepGeneration::oop_iterate(OopIterateClosure* cl) { |
2471 if (freelistLock()->owned_by_self()) { |
2471 if (freelistLock()->owned_by_self()) { |
2472 Generation::oop_iterate(cl); |
2472 Generation::oop_iterate(cl); |
2473 } else { |
2473 } else { |
2474 MutexLockerEx x(freelistLock(), Mutex::_no_safepoint_check_flag); |
2474 MutexLockerEx x(freelistLock(), Mutex::_no_safepoint_check_flag); |
2475 Generation::oop_iterate(cl); |
2475 Generation::oop_iterate(cl); |
3303 // have been bumped up by the thread that claimed the last |
3303 // have been bumped up by the thread that claimed the last |
3304 // task. |
3304 // task. |
3305 pst->all_tasks_completed(); |
3305 pst->all_tasks_completed(); |
3306 } |
3306 } |
3307 |
3307 |
3308 class ParConcMarkingClosure: public MetadataAwareOopClosure { |
3308 class ParConcMarkingClosure: public MetadataVisitingOopIterateClosure { |
3309 private: |
3309 private: |
3310 CMSCollector* _collector; |
3310 CMSCollector* _collector; |
3311 CMSConcMarkingTask* _task; |
3311 CMSConcMarkingTask* _task; |
3312 MemRegion _span; |
3312 MemRegion _span; |
3313 CMSBitMap* _bit_map; |
3313 CMSBitMap* _bit_map; |
3316 protected: |
3316 protected: |
3317 DO_OOP_WORK_DEFN |
3317 DO_OOP_WORK_DEFN |
3318 public: |
3318 public: |
3319 ParConcMarkingClosure(CMSCollector* collector, CMSConcMarkingTask* task, OopTaskQueue* work_queue, |
3319 ParConcMarkingClosure(CMSCollector* collector, CMSConcMarkingTask* task, OopTaskQueue* work_queue, |
3320 CMSBitMap* bit_map, CMSMarkStack* overflow_stack): |
3320 CMSBitMap* bit_map, CMSMarkStack* overflow_stack): |
3321 MetadataAwareOopClosure(collector->ref_processor()), |
3321 MetadataVisitingOopIterateClosure(collector->ref_processor()), |
3322 _collector(collector), |
3322 _collector(collector), |
3323 _task(task), |
3323 _task(task), |
3324 _span(collector->_span), |
3324 _span(collector->_span), |
3325 _work_queue(work_queue), |
3325 _work_queue(work_queue), |
3326 _bit_map(bit_map), |
3326 _bit_map(bit_map), |
3379 } |
3379 } |
3380 } // Else, some other thread got there first |
3380 } // Else, some other thread got there first |
3381 do_yield_check(); |
3381 do_yield_check(); |
3382 } |
3382 } |
3383 } |
3383 } |
3384 |
|
3385 void ParConcMarkingClosure::do_oop(oop* p) { ParConcMarkingClosure::do_oop_work(p); } |
|
3386 void ParConcMarkingClosure::do_oop(narrowOop* p) { ParConcMarkingClosure::do_oop_work(p); } |
|
3387 |
3384 |
3388 void ParConcMarkingClosure::trim_queue(size_t max) { |
3385 void ParConcMarkingClosure::trim_queue(size_t max) { |
3389 while (_work_queue->size() > max) { |
3386 while (_work_queue->size() > max) { |
3390 oop new_oop; |
3387 oop new_oop; |
3391 if (_work_queue->pop_local(new_oop)) { |
3388 if (_work_queue->pop_local(new_oop)) { |
4063 verify_overflow_empty(); |
4060 verify_overflow_empty(); |
4064 return cumNumDirtyCards; |
4061 return cumNumDirtyCards; |
4065 } |
4062 } |
4066 |
4063 |
4067 class PrecleanCLDClosure : public CLDClosure { |
4064 class PrecleanCLDClosure : public CLDClosure { |
4068 MetadataAwareOopsInGenClosure* _cm_closure; |
4065 MetadataVisitingOopsInGenClosure* _cm_closure; |
4069 public: |
4066 public: |
4070 PrecleanCLDClosure(MetadataAwareOopsInGenClosure* oop_closure) : _cm_closure(oop_closure) {} |
4067 PrecleanCLDClosure(MetadataVisitingOopsInGenClosure* oop_closure) : _cm_closure(oop_closure) {} |
4071 void do_cld(ClassLoaderData* cld) { |
4068 void do_cld(ClassLoaderData* cld) { |
4072 if (cld->has_accumulated_modified_oops()) { |
4069 if (cld->has_accumulated_modified_oops()) { |
4073 cld->clear_accumulated_modified_oops(); |
4070 cld->clear_accumulated_modified_oops(); |
4074 |
4071 |
4075 _cm_closure->do_cld(cld); |
4072 _cm_closure->do_cld(cld); |
4427 // Scan all new class loader data objects and new dependencies that were |
4424 // Scan all new class loader data objects and new dependencies that were |
4428 // introduced during concurrent marking. |
4425 // introduced during concurrent marking. |
4429 ResourceMark rm; |
4426 ResourceMark rm; |
4430 GrowableArray<ClassLoaderData*>* array = ClassLoaderDataGraph::new_clds(); |
4427 GrowableArray<ClassLoaderData*>* array = ClassLoaderDataGraph::new_clds(); |
4431 for (int i = 0; i < array->length(); i++) { |
4428 for (int i = 0; i < array->length(); i++) { |
4432 par_mrias_cl.do_cld_nv(array->at(i)); |
4429 Devirtualizer::do_cld(&par_mrias_cl, array->at(i)); |
4433 } |
4430 } |
4434 |
4431 |
4435 // We don't need to keep track of new CLDs anymore. |
4432 // We don't need to keep track of new CLDs anymore. |
4436 ClassLoaderDataGraph::remember_new_clds(false); |
4433 ClassLoaderDataGraph::remember_new_clds(false); |
4437 |
4434 |
4968 // Scan all class loader data objects that might have been introduced |
4965 // Scan all class loader data objects that might have been introduced |
4969 // during concurrent marking. |
4966 // during concurrent marking. |
4970 ResourceMark rm; |
4967 ResourceMark rm; |
4971 GrowableArray<ClassLoaderData*>* array = ClassLoaderDataGraph::new_clds(); |
4968 GrowableArray<ClassLoaderData*>* array = ClassLoaderDataGraph::new_clds(); |
4972 for (int i = 0; i < array->length(); i++) { |
4969 for (int i = 0; i < array->length(); i++) { |
4973 mrias_cl.do_cld_nv(array->at(i)); |
4970 Devirtualizer::do_cld(&mrias_cl, array->at(i)); |
4974 } |
4971 } |
4975 |
4972 |
4976 // We don't need to keep track of new CLDs anymore. |
4973 // We don't need to keep track of new CLDs anymore. |
4977 ClassLoaderDataGraph::remember_new_clds(false); |
4974 ClassLoaderDataGraph::remember_new_clds(false); |
4978 |
4975 |
5801 // this should be made more efficient |
5798 // this should be made more efficient |
5802 _bitMap->mark(addr); |
5799 _bitMap->mark(addr); |
5803 } |
5800 } |
5804 } |
5801 } |
5805 |
5802 |
5806 void MarkRefsIntoClosure::do_oop(oop* p) { MarkRefsIntoClosure::do_oop_work(p); } |
|
5807 void MarkRefsIntoClosure::do_oop(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); } |
|
5808 |
|
5809 ParMarkRefsIntoClosure::ParMarkRefsIntoClosure( |
5803 ParMarkRefsIntoClosure::ParMarkRefsIntoClosure( |
5810 MemRegion span, CMSBitMap* bitMap): |
5804 MemRegion span, CMSBitMap* bitMap): |
5811 _span(span), |
5805 _span(span), |
5812 _bitMap(bitMap) |
5806 _bitMap(bitMap) |
5813 { |
5807 { |
5822 if (_span.contains(addr)) { |
5816 if (_span.contains(addr)) { |
5823 // this should be made more efficient |
5817 // this should be made more efficient |
5824 _bitMap->par_mark(addr); |
5818 _bitMap->par_mark(addr); |
5825 } |
5819 } |
5826 } |
5820 } |
5827 |
|
5828 void ParMarkRefsIntoClosure::do_oop(oop* p) { ParMarkRefsIntoClosure::do_oop_work(p); } |
|
5829 void ParMarkRefsIntoClosure::do_oop(narrowOop* p) { ParMarkRefsIntoClosure::do_oop_work(p); } |
|
5830 |
5821 |
5831 // A variant of the above, used for CMS marking verification. |
5822 // A variant of the above, used for CMS marking verification. |
5832 MarkRefsIntoVerifyClosure::MarkRefsIntoVerifyClosure( |
5823 MarkRefsIntoVerifyClosure::MarkRefsIntoVerifyClosure( |
5833 MemRegion span, CMSBitMap* verification_bm, CMSBitMap* cms_bm): |
5824 MemRegion span, CMSBitMap* verification_bm, CMSBitMap* cms_bm): |
5834 _span(span), |
5825 _span(span), |
5853 log.error(" (" INTPTR_FORMAT " should have been marked)", p2i(addr)); |
5844 log.error(" (" INTPTR_FORMAT " should have been marked)", p2i(addr)); |
5854 fatal("... aborting"); |
5845 fatal("... aborting"); |
5855 } |
5846 } |
5856 } |
5847 } |
5857 } |
5848 } |
5858 |
|
5859 void MarkRefsIntoVerifyClosure::do_oop(oop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); } |
|
5860 void MarkRefsIntoVerifyClosure::do_oop(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); } |
|
5861 |
5849 |
5862 ////////////////////////////////////////////////// |
5850 ////////////////////////////////////////////////// |
5863 // MarkRefsIntoAndScanClosure |
5851 // MarkRefsIntoAndScanClosure |
5864 ////////////////////////////////////////////////// |
5852 ////////////////////////////////////////////////// |
5865 |
5853 |
5931 assert(_collector->no_preserved_marks(), |
5919 assert(_collector->no_preserved_marks(), |
5932 "All preserved marks should have been restored above"); |
5920 "All preserved marks should have been restored above"); |
5933 } |
5921 } |
5934 } |
5922 } |
5935 |
5923 |
5936 void MarkRefsIntoAndScanClosure::do_oop(oop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); } |
|
5937 void MarkRefsIntoAndScanClosure::do_oop(narrowOop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); } |
|
5938 |
|
5939 void MarkRefsIntoAndScanClosure::do_yield_work() { |
5924 void MarkRefsIntoAndScanClosure::do_yield_work() { |
5940 assert(ConcurrentMarkSweepThread::cms_thread_has_cms_token(), |
5925 assert(ConcurrentMarkSweepThread::cms_thread_has_cms_token(), |
5941 "CMS thread should hold CMS token"); |
5926 "CMS thread should hold CMS token"); |
5942 assert_lock_strong(_freelistLock); |
5927 assert_lock_strong(_freelistLock); |
5943 assert_lock_strong(_bit_map->lock()); |
5928 assert_lock_strong(_bit_map->lock()); |
6013 trim_queue(_low_water_mark); |
5998 trim_queue(_low_water_mark); |
6014 } // Else, another thread claimed the object |
5999 } // Else, another thread claimed the object |
6015 } |
6000 } |
6016 } |
6001 } |
6017 } |
6002 } |
6018 |
|
6019 void ParMarkRefsIntoAndScanClosure::do_oop(oop* p) { ParMarkRefsIntoAndScanClosure::do_oop_work(p); } |
|
6020 void ParMarkRefsIntoAndScanClosure::do_oop(narrowOop* p) { ParMarkRefsIntoAndScanClosure::do_oop_work(p); } |
|
6021 |
6003 |
6022 // This closure is used to rescan the marked objects on the dirty cards |
6004 // This closure is used to rescan the marked objects on the dirty cards |
6023 // in the mod union table and the card table proper. |
6005 // in the mod union table and the card table proper. |
6024 size_t ScanMarkedObjectsAgainCarefullyClosure::do_object_careful_m( |
6006 size_t ScanMarkedObjectsAgainCarefullyClosure::do_object_careful_m( |
6025 oop p, MemRegion mr) { |
6007 oop p, MemRegion mr) { |
6595 |
6577 |
6596 PushAndMarkVerifyClosure::PushAndMarkVerifyClosure( |
6578 PushAndMarkVerifyClosure::PushAndMarkVerifyClosure( |
6597 CMSCollector* collector, MemRegion span, |
6579 CMSCollector* collector, MemRegion span, |
6598 CMSBitMap* verification_bm, CMSBitMap* cms_bm, |
6580 CMSBitMap* verification_bm, CMSBitMap* cms_bm, |
6599 CMSMarkStack* mark_stack): |
6581 CMSMarkStack* mark_stack): |
6600 MetadataAwareOopClosure(collector->ref_processor()), |
6582 MetadataVisitingOopIterateClosure(collector->ref_processor()), |
6601 _collector(collector), |
6583 _collector(collector), |
6602 _span(span), |
6584 _span(span), |
6603 _verification_bm(verification_bm), |
6585 _verification_bm(verification_bm), |
6604 _cms_bm(cms_bm), |
6586 _cms_bm(cms_bm), |
6605 _mark_stack(mark_stack) |
6587 _mark_stack(mark_stack) |
6652 |
6634 |
6653 PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector, |
6635 PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector, |
6654 MemRegion span, |
6636 MemRegion span, |
6655 CMSBitMap* bitMap, CMSMarkStack* markStack, |
6637 CMSBitMap* bitMap, CMSMarkStack* markStack, |
6656 HeapWord* finger, MarkFromRootsClosure* parent) : |
6638 HeapWord* finger, MarkFromRootsClosure* parent) : |
6657 MetadataAwareOopClosure(collector->ref_processor()), |
6639 MetadataVisitingOopIterateClosure(collector->ref_processor()), |
6658 _collector(collector), |
6640 _collector(collector), |
6659 _span(span), |
6641 _span(span), |
6660 _bitMap(bitMap), |
6642 _bitMap(bitMap), |
6661 _markStack(markStack), |
6643 _markStack(markStack), |
6662 _finger(finger), |
6644 _finger(finger), |
6669 OopTaskQueue* work_queue, |
6651 OopTaskQueue* work_queue, |
6670 CMSMarkStack* overflow_stack, |
6652 CMSMarkStack* overflow_stack, |
6671 HeapWord* finger, |
6653 HeapWord* finger, |
6672 HeapWord* volatile* global_finger_addr, |
6654 HeapWord* volatile* global_finger_addr, |
6673 ParMarkFromRootsClosure* parent) : |
6655 ParMarkFromRootsClosure* parent) : |
6674 MetadataAwareOopClosure(collector->ref_processor()), |
6656 MetadataVisitingOopIterateClosure(collector->ref_processor()), |
6675 _collector(collector), |
6657 _collector(collector), |
6676 _whole_span(collector->_span), |
6658 _whole_span(collector->_span), |
6677 _span(span), |
6659 _span(span), |
6678 _bit_map(bit_map), |
6660 _bit_map(bit_map), |
6679 _work_queue(work_queue), |
6661 _work_queue(work_queue), |
6750 // bit map |
6732 // bit map |
6751 do_yield_check(); |
6733 do_yield_check(); |
6752 } |
6734 } |
6753 } |
6735 } |
6754 |
6736 |
6755 void PushOrMarkClosure::do_oop(oop* p) { PushOrMarkClosure::do_oop_work(p); } |
|
6756 void PushOrMarkClosure::do_oop(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); } |
|
6757 |
|
6758 void ParPushOrMarkClosure::do_oop(oop obj) { |
6737 void ParPushOrMarkClosure::do_oop(oop obj) { |
6759 // Ignore mark word because we are running concurrent with mutators. |
6738 // Ignore mark word because we are running concurrent with mutators. |
6760 assert(oopDesc::is_oop_or_null(obj, true), "Expected an oop or NULL at " PTR_FORMAT, p2i(obj)); |
6739 assert(oopDesc::is_oop_or_null(obj, true), "Expected an oop or NULL at " PTR_FORMAT, p2i(obj)); |
6761 HeapWord* addr = (HeapWord*)obj; |
6740 HeapWord* addr = (HeapWord*)obj; |
6762 if (_whole_span.contains(addr) && !_bit_map->isMarked(addr)) { |
6741 if (_whole_span.contains(addr) && !_bit_map->isMarked(addr)) { |
6799 } |
6778 } |
6800 do_yield_check(); |
6779 do_yield_check(); |
6801 } |
6780 } |
6802 } |
6781 } |
6803 |
6782 |
6804 void ParPushOrMarkClosure::do_oop(oop* p) { ParPushOrMarkClosure::do_oop_work(p); } |
|
6805 void ParPushOrMarkClosure::do_oop(narrowOop* p) { ParPushOrMarkClosure::do_oop_work(p); } |
|
6806 |
|
6807 PushAndMarkClosure::PushAndMarkClosure(CMSCollector* collector, |
6783 PushAndMarkClosure::PushAndMarkClosure(CMSCollector* collector, |
6808 MemRegion span, |
6784 MemRegion span, |
6809 ReferenceDiscoverer* rd, |
6785 ReferenceDiscoverer* rd, |
6810 CMSBitMap* bit_map, |
6786 CMSBitMap* bit_map, |
6811 CMSBitMap* mod_union_table, |
6787 CMSBitMap* mod_union_table, |
6812 CMSMarkStack* mark_stack, |
6788 CMSMarkStack* mark_stack, |
6813 bool concurrent_precleaning): |
6789 bool concurrent_precleaning): |
6814 MetadataAwareOopClosure(rd), |
6790 MetadataVisitingOopIterateClosure(rd), |
6815 _collector(collector), |
6791 _collector(collector), |
6816 _span(span), |
6792 _span(span), |
6817 _bit_map(bit_map), |
6793 _bit_map(bit_map), |
6818 _mod_union_table(mod_union_table), |
6794 _mod_union_table(mod_union_table), |
6819 _mark_stack(mark_stack), |
6795 _mark_stack(mark_stack), |
6881 ParPushAndMarkClosure::ParPushAndMarkClosure(CMSCollector* collector, |
6857 ParPushAndMarkClosure::ParPushAndMarkClosure(CMSCollector* collector, |
6882 MemRegion span, |
6858 MemRegion span, |
6883 ReferenceDiscoverer* rd, |
6859 ReferenceDiscoverer* rd, |
6884 CMSBitMap* bit_map, |
6860 CMSBitMap* bit_map, |
6885 OopTaskQueue* work_queue): |
6861 OopTaskQueue* work_queue): |
6886 MetadataAwareOopClosure(rd), |
6862 MetadataVisitingOopIterateClosure(rd), |
6887 _collector(collector), |
6863 _collector(collector), |
6888 _span(span), |
6864 _span(span), |
6889 _bit_map(bit_map), |
6865 _bit_map(bit_map), |
6890 _work_queue(work_queue) |
6866 _work_queue(work_queue) |
6891 { |
6867 { |
6892 assert(ref_discoverer() != NULL, "ref_discoverer shouldn't be NULL"); |
6868 assert(ref_discoverer() != NULL, "ref_discoverer shouldn't be NULL"); |
6893 } |
6869 } |
6894 |
|
6895 void PushAndMarkClosure::do_oop(oop* p) { PushAndMarkClosure::do_oop_work(p); } |
|
6896 void PushAndMarkClosure::do_oop(narrowOop* p) { PushAndMarkClosure::do_oop_work(p); } |
|
6897 |
6870 |
6898 // Grey object rescan during second checkpoint phase -- |
6871 // Grey object rescan during second checkpoint phase -- |
6899 // the parallel version. |
6872 // the parallel version. |
6900 void ParPushAndMarkClosure::do_oop(oop obj) { |
6873 void ParPushAndMarkClosure::do_oop(oop obj) { |
6901 // In the assert below, we ignore the mark word because |
6874 // In the assert below, we ignore the mark word because |
6934 _collector->_par_pmc_remark_ovflw++; // imprecise OK: no need to CAS |
6907 _collector->_par_pmc_remark_ovflw++; // imprecise OK: no need to CAS |
6935 } |
6908 } |
6936 } // Else, some other thread got there first |
6909 } // Else, some other thread got there first |
6937 } |
6910 } |
6938 } |
6911 } |
6939 |
|
6940 void ParPushAndMarkClosure::do_oop(oop* p) { ParPushAndMarkClosure::do_oop_work(p); } |
|
6941 void ParPushAndMarkClosure::do_oop(narrowOop* p) { ParPushAndMarkClosure::do_oop_work(p); } |
|
6942 |
6912 |
6943 void CMSPrecleanRefsYieldClosure::do_yield_work() { |
6913 void CMSPrecleanRefsYieldClosure::do_yield_work() { |
6944 Mutex* bml = _collector->bitMapLock(); |
6914 Mutex* bml = _collector->bitMapLock(); |
6945 assert_lock_strong(bml); |
6915 assert_lock_strong(bml); |
6946 assert(ConcurrentMarkSweepThread::cms_thread_has_cms_token(), |
6916 assert(ConcurrentMarkSweepThread::cms_thread_has_cms_token(), |
7604 } |
7574 } |
7605 } |
7575 } |
7606 } |
7576 } |
7607 } |
7577 } |
7608 |
7578 |
7609 void CMSKeepAliveClosure::do_oop(oop* p) { CMSKeepAliveClosure::do_oop_work(p); } |
|
7610 void CMSKeepAliveClosure::do_oop(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); } |
|
7611 |
|
7612 // CMSParKeepAliveClosure: a parallel version of the above. |
7579 // CMSParKeepAliveClosure: a parallel version of the above. |
7613 // The work queues are private to each closure (thread), |
7580 // The work queues are private to each closure (thread), |
7614 // but (may be) available for stealing by other threads. |
7581 // but (may be) available for stealing by other threads. |
7615 void CMSParKeepAliveClosure::do_oop(oop obj) { |
7582 void CMSParKeepAliveClosure::do_oop(oop obj) { |
7616 HeapWord* addr = (HeapWord*)obj; |
7583 HeapWord* addr = (HeapWord*)obj; |
7626 // stack usage lower, but leave some oops for potential stealers |
7593 // stack usage lower, but leave some oops for potential stealers |
7627 trim_queue(_low_water_mark); |
7594 trim_queue(_low_water_mark); |
7628 } // Else, another thread got there first |
7595 } // Else, another thread got there first |
7629 } |
7596 } |
7630 } |
7597 } |
7631 |
|
7632 void CMSParKeepAliveClosure::do_oop(oop* p) { CMSParKeepAliveClosure::do_oop_work(p); } |
|
7633 void CMSParKeepAliveClosure::do_oop(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); } |
|
7634 |
7598 |
7635 void CMSParKeepAliveClosure::trim_queue(uint max) { |
7599 void CMSParKeepAliveClosure::trim_queue(uint max) { |
7636 while (_work_queue->size() > max) { |
7600 while (_work_queue->size() > max) { |
7637 oop new_oop; |
7601 oop new_oop; |
7638 if (_work_queue->pop_local(new_oop)) { |
7602 if (_work_queue->pop_local(new_oop)) { |
7674 _collector->_par_kac_ovflw++; |
7638 _collector->_par_kac_ovflw++; |
7675 } |
7639 } |
7676 } // Else another thread got there already |
7640 } // Else another thread got there already |
7677 } |
7641 } |
7678 } |
7642 } |
7679 |
|
7680 void CMSInnerParMarkAndPushClosure::do_oop(oop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); } |
|
7681 void CMSInnerParMarkAndPushClosure::do_oop(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); } |
|
7682 |
7643 |
7683 ////////////////////////////////////////////////////////////////// |
7644 ////////////////////////////////////////////////////////////////// |
7684 // CMSExpansionCause ///////////////////////////// |
7645 // CMSExpansionCause ///////////////////////////// |
7685 ////////////////////////////////////////////////////////////////// |
7646 ////////////////////////////////////////////////////////////////// |
7686 const char* CMSExpansionCause::to_string(CMSExpansionCause::Cause cause) { |
7647 const char* CMSExpansionCause::to_string(CMSExpansionCause::Cause cause) { |