365 } 366 367 void Klass::append_to_sibling_list() { 368 debug_only(verify();) 369 // add ourselves to superklass' subklass list 370 InstanceKlass* super = superklass(); 371 if (super == NULL) return; // special case: class Object 372 assert((!super->is_interface() // interfaces cannot be supers 373 && (super->superklass() == NULL || !is_interface())), 374 "an interface can only be a subklass of Object"); 375 Klass* prev_first_subklass = super->subklass(); 376 if (prev_first_subklass != NULL) { 377 // set our sibling to be the superklass' previous first subklass 378 set_next_sibling(prev_first_subklass); 379 } 380 // make ourselves the superklass' first subklass 381 super->set_subklass(this); 382 debug_only(verify();) 383 } 384 385 void Klass::clean_weak_klass_links(bool clean_alive_klasses) { 386 if (!ClassUnloading) { 387 return; 388 } 389 390 Klass* root = SystemDictionary::Object_klass(); 391 Stack<Klass*, mtGC> stack; 392 393 stack.push(root); 394 while (!stack.is_empty()) { 395 Klass* current = stack.pop(); 396 397 assert(current->is_loader_alive(), "just checking, this should be live"); 398 399 // Find and set the first alive subklass 400 Klass* sub = current->subklass(); 401 while (sub != NULL && !sub->is_loader_alive()) { 402 #ifndef PRODUCT 403 if (log_is_enabled(Trace, class, unload)) { 404 ResourceMark rm; 405 log_trace(class, unload)("unlinking class (subclass): %s", sub->external_name()); 406 } | 365 } 366 367 void Klass::append_to_sibling_list() { 368 debug_only(verify();) 369 // add ourselves to superklass' subklass list 370 InstanceKlass* super = superklass(); 371 if (super == NULL) return; // special case: class Object 372 assert((!super->is_interface() // interfaces cannot be supers 373 && (super->superklass() == NULL || !is_interface())), 374 "an interface can only be a subklass of Object"); 375 Klass* prev_first_subklass = super->subklass(); 376 if (prev_first_subklass != NULL) { 377 // set our sibling to be the superklass' previous first subklass 378 set_next_sibling(prev_first_subklass); 379 } 380 // make ourselves the superklass' first subklass 381 super->set_subklass(this); 382 debug_only(verify();) 383 } 384 385 void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses) { 386 if (!ClassUnloading || !unloading_occurred) { 387 return; 388 } 389 390 Klass* root = SystemDictionary::Object_klass(); 391 Stack<Klass*, mtGC> stack; 392 393 stack.push(root); 394 while (!stack.is_empty()) { 395 Klass* current = stack.pop(); 396 397 assert(current->is_loader_alive(), "just checking, this should be live"); 398 399 // Find and set the first alive subklass 400 Klass* sub = current->subklass(); 401 while (sub != NULL && !sub->is_loader_alive()) { 402 #ifndef PRODUCT 403 if (log_is_enabled(Trace, class, unload)) { 404 ResourceMark rm; 405 log_trace(class, unload)("unlinking class (subclass): %s", sub->external_name()); 406 } |