479 }
480 #endif // PRODUCT
481
482 bool ClassLoaderDataGraph::is_valid(ClassLoaderData* loader_data) {
483 DEBUG_ONLY( if (!VMError::is_error_reported()) { assert_locked_or_safepoint(ClassLoaderDataGraph_lock); } )
484 if (loader_data != NULL) {
485 if (loader_data == ClassLoaderData::the_null_class_loader_data()) {
486 return true;
487 }
488 for (ClassLoaderData* data = _head; data != NULL; data = data->next()) {
489 if (loader_data == data) {
490 return true;
491 }
492 }
493 }
494 return false;
495 }
496
497 // Move class loader data from main list to the unloaded list for unloading
498 // and deallocation later.
499 bool ClassLoaderDataGraph::do_unloading(bool do_cleaning) {
500 assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
501
502 // Indicate whether safepoint cleanup is needed.
503 _safepoint_cleanup_needed |= do_cleaning;
504
505 ClassLoaderData* data = _head;
506 ClassLoaderData* prev = NULL;
507 bool seen_dead_loader = false;
508 uint loaders_processed = 0;
509 uint loaders_removed = 0;
510
511 // Save previous _unloading pointer for CMS which may add to unloading list before
512 // purging and we don't want to rewalk the previously unloaded class loader data.
513 _saved_unloading = _unloading;
514
515 data = _head;
516 while (data != NULL) {
517 if (data->is_alive()) {
518 prev = data;
519 data = data->next();
520 loaders_processed++;
521 continue;
522 }
523 seen_dead_loader = true;
|
479 }
480 #endif // PRODUCT
481
482 bool ClassLoaderDataGraph::is_valid(ClassLoaderData* loader_data) {
483 DEBUG_ONLY( if (!VMError::is_error_reported()) { assert_locked_or_safepoint(ClassLoaderDataGraph_lock); } )
484 if (loader_data != NULL) {
485 if (loader_data == ClassLoaderData::the_null_class_loader_data()) {
486 return true;
487 }
488 for (ClassLoaderData* data = _head; data != NULL; data = data->next()) {
489 if (loader_data == data) {
490 return true;
491 }
492 }
493 }
494 return false;
495 }
496
497 // Move class loader data from main list to the unloaded list for unloading
498 // and deallocation later.
499 bool ClassLoaderDataGraph::do_unloading() {
500 assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
501
502 // Indicate whether safepoint cleanup is needed.
503 _safepoint_cleanup_needed = true;
504
505 ClassLoaderData* data = _head;
506 ClassLoaderData* prev = NULL;
507 bool seen_dead_loader = false;
508 uint loaders_processed = 0;
509 uint loaders_removed = 0;
510
511 // Save previous _unloading pointer for CMS which may add to unloading list before
512 // purging and we don't want to rewalk the previously unloaded class loader data.
513 _saved_unloading = _unloading;
514
515 data = _head;
516 while (data != NULL) {
517 if (data->is_alive()) {
518 prev = data;
519 data = data->next();
520 loaders_processed++;
521 continue;
522 }
523 seen_dead_loader = true;
|