< prev index next >

src/hotspot/share/oops/klass.cpp

Print this page




 419   // add ourselves to superklass' subklass list
 420   InstanceKlass* super = superklass();
 421   if (super == NULL) return;        // special case: class Object
 422   assert((!super->is_interface()    // interfaces cannot be supers
 423           && (super->superklass() == NULL || !is_interface())),
 424          "an interface can only be a subklass of Object");
 425 
 426   // Make sure there is no stale subklass head
 427   super->clean_subklass();
 428 
 429   for (;;) {
 430     Klass* prev_first_subklass = Atomic::load_acquire(&_super->_subklass);
 431     if (prev_first_subklass != NULL) {
 432       // set our sibling to be the superklass' previous first subklass
 433       assert(prev_first_subklass->is_loader_alive(), "May not attach not alive klasses");
 434       set_next_sibling(prev_first_subklass);
 435     }
 436     // Note that the prev_first_subklass is always alive, meaning no sibling_next links
 437     // are ever created to not alive klasses. This is an important invariant of the lock-free
 438     // cleaning protocol, that allows us to safely unlink dead klasses from the sibling list.
 439     if (Atomic::cmpxchg(this, &super->_subklass, prev_first_subklass) == prev_first_subklass) {
 440       return;
 441     }
 442   }
 443   debug_only(verify();)
 444 }
 445 
 446 void Klass::clean_subklass() {
 447   for (;;) {
 448     // Need load_acquire, due to contending with concurrent inserts
 449     Klass* subklass = Atomic::load_acquire(&_subklass);
 450     if (subklass == NULL || subklass->is_loader_alive()) {
 451       return;
 452     }
 453     // Try to fix _subklass until it points at something not dead.
 454     Atomic::cmpxchg(subklass->next_sibling(), &_subklass, subklass);
 455   }
 456 }
 457 
 458 void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses) {
 459   if (!ClassUnloading || !unloading_occurred) {
 460     return;
 461   }
 462 
 463   Klass* root = SystemDictionary::Object_klass();
 464   Stack<Klass*, mtGC> stack;
 465 
 466   stack.push(root);
 467   while (!stack.is_empty()) {
 468     Klass* current = stack.pop();
 469 
 470     assert(current->is_loader_alive(), "just checking, this should be live");
 471 
 472     // Find and set the first alive subklass
 473     Klass* sub = current->subklass(true);
 474     current->clean_subklass();




 419   // add ourselves to superklass' subklass list
 420   InstanceKlass* super = superklass();
 421   if (super == NULL) return;        // special case: class Object
 422   assert((!super->is_interface()    // interfaces cannot be supers
 423           && (super->superklass() == NULL || !is_interface())),
 424          "an interface can only be a subklass of Object");
 425 
 426   // Make sure there is no stale subklass head
 427   super->clean_subklass();
 428 
 429   for (;;) {
 430     Klass* prev_first_subklass = Atomic::load_acquire(&_super->_subklass);
 431     if (prev_first_subklass != NULL) {
 432       // set our sibling to be the superklass' previous first subklass
 433       assert(prev_first_subklass->is_loader_alive(), "May not attach not alive klasses");
 434       set_next_sibling(prev_first_subklass);
 435     }
 436     // Note that the prev_first_subklass is always alive, meaning no sibling_next links
 437     // are ever created to not alive klasses. This is an important invariant of the lock-free
 438     // cleaning protocol, that allows us to safely unlink dead klasses from the sibling list.
 439     if (Atomic::cmpxchg(&super->_subklass, prev_first_subklass, this) == prev_first_subklass) {
 440       return;
 441     }
 442   }
 443   debug_only(verify();)
 444 }
 445 
 446 void Klass::clean_subklass() {
 447   for (;;) {
 448     // Need load_acquire, due to contending with concurrent inserts
 449     Klass* subklass = Atomic::load_acquire(&_subklass);
 450     if (subklass == NULL || subklass->is_loader_alive()) {
 451       return;
 452     }
 453     // Try to fix _subklass until it points at something not dead.
 454     Atomic::cmpxchg(&_subklass, subklass, subklass->next_sibling());
 455   }
 456 }
 457 
 458 void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses) {
 459   if (!ClassUnloading || !unloading_occurred) {
 460     return;
 461   }
 462 
 463   Klass* root = SystemDictionary::Object_klass();
 464   Stack<Klass*, mtGC> stack;
 465 
 466   stack.push(root);
 467   while (!stack.is_empty()) {
 468     Klass* current = stack.pop();
 469 
 470     assert(current->is_loader_alive(), "just checking, this should be live");
 471 
 472     // Find and set the first alive subklass
 473     Klass* sub = current->subklass(true);
 474     current->clean_subklass();


< prev index next >