229 ClassLoaderData* loader_data = add_to_graph(loader, is_unsafe_anonymous); |
229 ClassLoaderData* loader_data = add_to_graph(loader, is_unsafe_anonymous); |
230 return loader_data; |
230 return loader_data; |
231 } |
231 } |
232 |
232 |
233 void ClassLoaderDataGraph::cld_do(CLDClosure* cl) { |
233 void ClassLoaderDataGraph::cld_do(CLDClosure* cl) { |
234 assert_locked_or_safepoint(ClassLoaderDataGraph_lock); |
234 assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); |
235 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { |
235 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { |
236 cl->do_cld(cld); |
236 cl->do_cld(cld); |
237 } |
237 } |
238 } |
238 } |
239 |
239 |
240 void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) { |
240 void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) { |
241 assert_locked_or_safepoint(ClassLoaderDataGraph_lock); |
241 assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); |
242 // Only walk the head until any clds not purged from prior unloading |
242 // Only walk the head until any clds not purged from prior unloading |
243 // (CMS doesn't purge right away). |
243 // (CMS doesn't purge right away). |
244 for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) { |
244 for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) { |
245 assert(cld->is_unloading(), "invariant"); |
245 assert(cld->is_unloading(), "invariant"); |
246 cl->do_cld(cld); |
246 cl->do_cld(cld); |
247 } |
247 } |
248 } |
248 } |
249 |
249 |
250 void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) { |
250 void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) { |
251 assert_locked_or_safepoint(ClassLoaderDataGraph_lock); |
251 assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); |
252 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { |
252 for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { |
253 CLDClosure* closure = cld->keep_alive() ? strong : weak; |
253 CLDClosure* closure = cld->keep_alive() ? strong : weak; |
254 if (closure != NULL) { |
254 if (closure != NULL) { |
255 closure->do_cld(cld); |
255 closure->do_cld(cld); |
256 } |
256 } |
257 } |
257 } |
258 } |
258 } |
259 |
259 |
260 void ClassLoaderDataGraph::always_strong_cld_do(CLDClosure* cl) { |
260 void ClassLoaderDataGraph::always_strong_cld_do(CLDClosure* cl) { |
261 assert_locked_or_safepoint(ClassLoaderDataGraph_lock); |
261 assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); |
262 if (ClassUnloading) { |
262 if (ClassUnloading) { |
263 roots_cld_do(cl, NULL); |
263 roots_cld_do(cl, NULL); |
264 } else { |
264 } else { |
265 cld_do(cl); |
265 cld_do(cl); |
266 } |
266 } |