118 }
119 }
120
121 void ClassLoaderData::Dependencies::oops_do(OopClosure* f) {
122 f->do_oop((oop*)&_list_head);
123 }
124
125 void ClassLoaderData::classes_do(KlassClosure* klass_closure) {
126 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
127 klass_closure->do_klass(k);
128 assert(k != k->next_link(), "no loops!");
129 }
130 }
131
132 void ClassLoaderData::classes_do(void f(Klass * const)) {
133 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
134 f(k);
135 }
136 }
137
138 void ClassLoaderData::loaded_classes_do(KlassClosure* klass_closure) {
139 // Lock to avoid classes being modified/added/removed during iteration
140 MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
141 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
142 // Do not filter ArrayKlass oops here...
143 if (k->oop_is_array() || (k->oop_is_instance() && InstanceKlass::cast(k)->is_loaded())) {
144 klass_closure->do_klass(k);
145 }
146 }
147 }
148
149 void ClassLoaderData::classes_do(void f(InstanceKlass*)) {
150 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
151 if (k->oop_is_instance()) {
152 f(InstanceKlass::cast(k));
153 }
154 assert(k != k->next_link(), "no loops!");
155 }
156 }
157
604 }
605 }
606
607 void ClassLoaderDataGraph::always_strong_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
608 if (ClassUnloading) {
609 ClassLoaderDataGraph::keep_alive_oops_do(f, klass_closure, must_claim);
610 } else {
611 ClassLoaderDataGraph::oops_do(f, klass_closure, must_claim);
612 }
613 }
614
615 void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
616 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
617 cld->classes_do(klass_closure);
618 }
619 }
620
621 void ClassLoaderDataGraph::classes_do(void f(Klass* const)) {
622 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
623 cld->classes_do(f);
624 }
625 }
626
627 void ClassLoaderDataGraph::loaded_classes_do(KlassClosure* klass_closure) {
628 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
629 cld->loaded_classes_do(klass_closure);
630 }
631 }
632
633 void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) {
634 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
635 for (ClassLoaderData* cld = _unloading; cld != NULL; cld = cld->next()) {
636 cld->classes_do(f);
637 }
638 }
639
640 GrowableArray<ClassLoaderData*>* ClassLoaderDataGraph::new_clds() {
641 assert(_head == NULL || _saved_head != NULL, "remember_new_clds(true) not called?");
642
643 GrowableArray<ClassLoaderData*>* array = new GrowableArray<ClassLoaderData*>();
|
118 }
119 }
120
121 void ClassLoaderData::Dependencies::oops_do(OopClosure* f) {
122 f->do_oop((oop*)&_list_head);
123 }
124
125 void ClassLoaderData::classes_do(KlassClosure* klass_closure) {
126 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
127 klass_closure->do_klass(k);
128 assert(k != k->next_link(), "no loops!");
129 }
130 }
131
132 void ClassLoaderData::classes_do(void f(Klass * const)) {
133 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
134 f(k);
135 }
136 }
137
138 void ClassLoaderData::methods_do(void f(Method*)) {
139 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
140 if (k->oop_is_instance()) {
141 InstanceKlass::cast(k)->methods_do(f);
142 }
143 }
144 }
145
146 void ClassLoaderData::loaded_classes_do(KlassClosure* klass_closure) {
147 // Lock to avoid classes being modified/added/removed during iteration
148 MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
149 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
150 // Do not filter ArrayKlass oops here...
151 if (k->oop_is_array() || (k->oop_is_instance() && InstanceKlass::cast(k)->is_loaded())) {
152 klass_closure->do_klass(k);
153 }
154 }
155 }
156
157 void ClassLoaderData::classes_do(void f(InstanceKlass*)) {
158 for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
159 if (k->oop_is_instance()) {
160 f(InstanceKlass::cast(k));
161 }
162 assert(k != k->next_link(), "no loops!");
163 }
164 }
165
612 }
613 }
614
615 void ClassLoaderDataGraph::always_strong_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
616 if (ClassUnloading) {
617 ClassLoaderDataGraph::keep_alive_oops_do(f, klass_closure, must_claim);
618 } else {
619 ClassLoaderDataGraph::oops_do(f, klass_closure, must_claim);
620 }
621 }
622
623 void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
624 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
625 cld->classes_do(klass_closure);
626 }
627 }
628
629 void ClassLoaderDataGraph::classes_do(void f(Klass* const)) {
630 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
631 cld->classes_do(f);
632 }
633 }
634
635 void ClassLoaderDataGraph::methods_do(void f(Method*)) {
636 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
637 cld->methods_do(f);
638 }
639 }
640
641 void ClassLoaderDataGraph::loaded_classes_do(KlassClosure* klass_closure) {
642 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
643 cld->loaded_classes_do(klass_closure);
644 }
645 }
646
647 void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) {
648 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
649 for (ClassLoaderData* cld = _unloading; cld != NULL; cld = cld->next()) {
650 cld->classes_do(f);
651 }
652 }
653
654 GrowableArray<ClassLoaderData*>* ClassLoaderDataGraph::new_clds() {
655 assert(_head == NULL || _saved_head != NULL, "remember_new_clds(true) not called?");
656
657 GrowableArray<ClassLoaderData*>* array = new GrowableArray<ClassLoaderData*>();
|