@@ -261,8 +261,15 @@ ClassLoaderData* ClassLoaderDataGraph::add(Handle loader, bool has_class_mirror_
261
261
return loader_data;
262
262
}
263
263
264
+ inline void assert_is_safepoint_or_gc () {
265
+ assert (SafepointSynchronize::is_at_safepoint () ||
266
+ Thread::current ()->is_ConcurrentGC_thread () ||
267
+ Thread::current ()->is_Worker_thread (),
268
+ " Must be called by safepoint or GC" );
269
+ }
270
+
264
271
void ClassLoaderDataGraph::cld_unloading_do (CLDClosure* cl) {
265
- assert_locked_or_safepoint_weak (ClassLoaderDataGraph_lock );
272
+ assert_is_safepoint_or_gc ( );
266
273
for (ClassLoaderData* cld = _unloading; cld != nullptr ; cld = cld->next ()) {
267
274
assert (cld->is_unloading (), " invariant" );
268
275
cl->do_cld (cld);
@@ -272,15 +279,15 @@ void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) {
272
279
// These are functions called by the GC, which require all of the CLDs, including the
273
280
// unloading ones.
274
281
void ClassLoaderDataGraph::cld_do (CLDClosure* cl) {
275
- assert_locked_or_safepoint_weak (ClassLoaderDataGraph_lock );
276
- for (ClassLoaderData* cld = _head; cld != nullptr ; cld = cld->_next ) {
282
+ assert_is_safepoint_or_gc ( );
283
+ for (ClassLoaderData* cld = Atomic::load_acquire (& _head) ; cld != nullptr ; cld = cld->next () ) {
277
284
cl->do_cld (cld);
278
285
}
279
286
}
280
287
281
288
void ClassLoaderDataGraph::roots_cld_do (CLDClosure* strong, CLDClosure* weak) {
282
- assert_locked_or_safepoint_weak (ClassLoaderDataGraph_lock );
283
- for (ClassLoaderData* cld = _head; cld != nullptr ; cld = cld->_next ) {
289
+ assert_is_safepoint_or_gc ( );
290
+ for (ClassLoaderData* cld = Atomic::load_acquire (& _head) ; cld != nullptr ; cld = cld->next () ) {
284
291
CLDClosure* closure = cld->keep_alive () ? strong : weak;
285
292
if (closure != nullptr ) {
286
293
closure->do_cld (cld);
@@ -289,7 +296,7 @@ void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) {
289
296
}
290
297
291
298
void ClassLoaderDataGraph::always_strong_cld_do (CLDClosure* cl) {
292
- assert_locked_or_safepoint_weak (ClassLoaderDataGraph_lock );
299
+ assert_is_safepoint_or_gc ( );
293
300
if (ClassUnloading) {
294
301
roots_cld_do (cl, nullptr );
295
302
} else {
@@ -520,7 +527,8 @@ bool ClassLoaderDataGraph::do_unloading() {
520
527
prev->set_next (data);
521
528
} else {
522
529
assert (dead == _head, " sanity check" );
523
- _head = data;
530
+ // The GC might be walking this concurrently
531
+ Atomic::store (&_head, data);
524
532
}
525
533
dead->set_next (_unloading);
526
534
_unloading = dead;
0 commit comments