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(); |