47 /* Make sure the non-virtual and the virtual versions match. */ \ |
47 /* Make sure the non-virtual and the virtual versions match. */ \ |
48 assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \ |
48 assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \ |
49 "Inconsistency in do_metadata"); \ |
49 "Inconsistency in do_metadata"); \ |
50 if (closure->do_metadata##nv_suffix()) |
50 if (closure->do_metadata##nv_suffix()) |
51 |
51 |
52 // Macro to define instanceClassLoaderKlass::oop_oop_iterate for virtual/nonvirtual for |
52 // Macro to define InstanceClassLoaderKlass::oop_oop_iterate for virtual/nonvirtual for |
53 // all closures. Macros calling macros above for each oop size. |
53 // all closures. Macros calling macros above for each oop size. |
54 // Since ClassLoader objects have only a pointer to the loader_data, they are not |
54 // Since ClassLoader objects have only a pointer to the loader_data, they are not |
55 // compressed nor does the pointer move. |
55 // compressed nor does the pointer move. |
56 |
56 |
57 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)\ |
57 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)\ |
58 \ |
58 \ |
59 int instanceClassLoaderKlass:: \ |
59 int InstanceClassLoaderKlass:: \ |
60 oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \ |
60 oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \ |
61 /* Get size before changing pointers */ \ |
61 /* Get size before changing pointers */ \ |
62 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ |
62 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ |
63 int size = InstanceKlass::oop_oop_iterate##nv_suffix(obj, closure); \ |
63 int size = InstanceKlass::oop_oop_iterate##nv_suffix(obj, closure); \ |
64 \ |
64 \ |
74 } |
74 } |
75 |
75 |
76 #ifndef SERIALGC |
76 #ifndef SERIALGC |
77 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ |
77 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ |
78 \ |
78 \ |
79 int instanceClassLoaderKlass:: \ |
79 int InstanceClassLoaderKlass:: \ |
80 oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \ |
80 oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \ |
81 /* Get size before changing pointers */ \ |
81 /* Get size before changing pointers */ \ |
82 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ |
82 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ |
83 int size = InstanceKlass::oop_oop_iterate_backwards##nv_suffix(obj, closure); \ |
83 int size = InstanceKlass::oop_oop_iterate_backwards##nv_suffix(obj, closure); \ |
84 return size; \ |
84 return size; \ |
86 #endif // !SERIALGC |
86 #endif // !SERIALGC |
87 |
87 |
88 |
88 |
89 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ |
89 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ |
90 \ |
90 \ |
91 int instanceClassLoaderKlass:: \ |
91 int InstanceClassLoaderKlass:: \ |
92 oop_oop_iterate##nv_suffix##_m(oop obj, \ |
92 oop_oop_iterate##nv_suffix##_m(oop obj, \ |
93 OopClosureType* closure, \ |
93 OopClosureType* closure, \ |
94 MemRegion mr) { \ |
94 MemRegion mr) { \ |
95 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ |
95 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ |
96 \ |
96 \ |
116 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) |
116 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) |
117 #endif // SERIALGC |
117 #endif // SERIALGC |
118 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m) |
118 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m) |
119 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m) |
119 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DEFN_m) |
120 |
120 |
121 void instanceClassLoaderKlass::oop_follow_contents(oop obj) { |
121 void InstanceClassLoaderKlass::oop_follow_contents(oop obj) { |
122 InstanceKlass::oop_follow_contents(obj); |
122 InstanceKlass::oop_follow_contents(obj); |
123 ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); |
123 ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); |
124 |
124 |
125 // We must NULL check here, since the class loader |
125 // We must NULL check here, since the class loader |
126 // can be found before the loader data has been set up. |
126 // can be found before the loader data has been set up. |
128 MarkSweep::follow_class_loader(loader_data); |
128 MarkSweep::follow_class_loader(loader_data); |
129 } |
129 } |
130 } |
130 } |
131 |
131 |
132 #ifndef SERIALGC |
132 #ifndef SERIALGC |
133 void instanceClassLoaderKlass::oop_follow_contents(ParCompactionManager* cm, |
133 void InstanceClassLoaderKlass::oop_follow_contents(ParCompactionManager* cm, |
134 oop obj) { |
134 oop obj) { |
135 InstanceKlass::oop_follow_contents(cm, obj); |
135 InstanceKlass::oop_follow_contents(cm, obj); |
136 ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); |
136 ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); |
137 if (loader_data != NULL) { |
137 if (loader_data != NULL) { |
138 PSParallelCompact::follow_class_loader(cm, loader_data); |
138 PSParallelCompact::follow_class_loader(cm, loader_data); |
139 } |
139 } |
140 } |
140 } |
141 |
141 |
142 void instanceClassLoaderKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { |
142 void InstanceClassLoaderKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { |
143 InstanceKlass::oop_push_contents(pm, obj); |
143 InstanceKlass::oop_push_contents(pm, obj); |
144 |
144 |
145 // This is called by the young collector. It will already have taken care of |
145 // This is called by the young collector. It will already have taken care of |
146 // all class loader data. So, we don't have to follow the class loader -> |
146 // all class loader data. So, we don't have to follow the class loader -> |
147 // class loader data link. |
147 // class loader data link. |
148 } |
148 } |
149 |
149 |
150 int instanceClassLoaderKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { |
150 int InstanceClassLoaderKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { |
151 InstanceKlass::oop_update_pointers(cm, obj); |
151 InstanceKlass::oop_update_pointers(cm, obj); |
152 ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); |
152 ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); |
153 if (loader_data != NULL) { |
153 if (loader_data != NULL) { |
154 PSParallelCompact::adjust_class_loader(cm, loader_data); |
154 PSParallelCompact::adjust_class_loader(cm, loader_data); |
155 } |
155 } |