< prev index next >

src/hotspot/share/oops/klass.cpp

Print this page




 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       }


< prev index next >