src/share/vm/oops/instanceKlass.cpp

changeset 5971
b8860472c377
parent 5896
d37a0525c0fe
child 6024
e64f1fe9756b
equal deleted inserted replaced
5969:1327b7f85503 5971:b8860472c377
496 return java_lang_Class::signers(java_mirror()); 496 return java_lang_Class::signers(java_mirror());
497 } 497 }
498 498
499 oop InstanceKlass::init_lock() const { 499 oop InstanceKlass::init_lock() const {
500 // return the init lock from the mirror 500 // return the init lock from the mirror
501 return java_lang_Class::init_lock(java_mirror()); 501 oop lock = java_lang_Class::init_lock(java_mirror());
502 assert((oop)lock != NULL || !is_not_initialized(), // initialized or in_error state
503 "only fully initialized state can have a null lock");
504 return lock;
505 }
506
507 // Set the initialization lock to null so the object can be GC'ed. Any racing
508 // threads to get this lock will see a null lock and will not lock.
509 // That's okay because they all check for initialized state after getting
510 // the lock and return.
511 void InstanceKlass::fence_and_clear_init_lock() {
512 // make sure previous stores are all done, notably the init_state.
513 OrderAccess::storestore();
514 java_lang_Class::set_init_lock(java_mirror(), NULL);
515 assert(!is_not_initialized(), "class must be initialized now");
502 } 516 }
503 517
504 void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) { 518 void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) {
505 EXCEPTION_MARK; 519 EXCEPTION_MARK;
506 oop init_lock = this_oop->init_lock(); 520 oop init_lock = this_oop->init_lock();
507 ObjectLocker ol(init_lock, THREAD); 521 ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
508 522
509 // abort if someone beat us to the initialization 523 // abort if someone beat us to the initialization
510 if (!this_oop->is_not_initialized()) return; // note: not equivalent to is_initialized() 524 if (!this_oop->is_not_initialized()) return; // note: not equivalent to is_initialized()
511 525
512 ClassState old_state = this_oop->init_state(); 526 ClassState old_state = this_oop->init_state();
521 if( old_state != this_oop->_init_state ) 535 if( old_state != this_oop->_init_state )
522 this_oop->set_init_state (old_state); 536 this_oop->set_init_state (old_state);
523 } else { 537 } else {
524 // linking successfull, mark class as initialized 538 // linking successfull, mark class as initialized
525 this_oop->set_init_state (fully_initialized); 539 this_oop->set_init_state (fully_initialized);
540 this_oop->fence_and_clear_init_lock();
526 // trace 541 // trace
527 if (TraceClassInitialization) { 542 if (TraceClassInitialization) {
528 ResourceMark rm(THREAD); 543 ResourceMark rm(THREAD);
529 tty->print_cr("[Initialized %s without side effects]", this_oop->external_name()); 544 tty->print_cr("[Initialized %s without side effects]", this_oop->external_name());
530 } 545 }
647 PerfClassTraceTime::CLASS_LINK); 662 PerfClassTraceTime::CLASS_LINK);
648 663
649 // verification & rewriting 664 // verification & rewriting
650 { 665 {
651 oop init_lock = this_oop->init_lock(); 666 oop init_lock = this_oop->init_lock();
652 ObjectLocker ol(init_lock, THREAD); 667 ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
653 // rewritten will have been set if loader constraint error found 668 // rewritten will have been set if loader constraint error found
654 // on an earlier link attempt 669 // on an earlier link attempt
655 // don't verify or rewrite if already rewritten 670 // don't verify or rewrite if already rewritten
656 671
657 if (!this_oop->is_linked()) { 672 if (!this_oop->is_linked()) {
770 785
771 // refer to the JVM book page 47 for description of steps 786 // refer to the JVM book page 47 for description of steps
772 // Step 1 787 // Step 1
773 { 788 {
774 oop init_lock = this_oop->init_lock(); 789 oop init_lock = this_oop->init_lock();
775 ObjectLocker ol(init_lock, THREAD); 790 ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
776 791
777 Thread *self = THREAD; // it's passed the current thread 792 Thread *self = THREAD; // it's passed the current thread
778 793
779 // Step 2 794 // Step 2
780 // If we were to use wait() instead of waitInterruptibly() then 795 // If we were to use wait() instead of waitInterruptibly() then
918 set_initialization_state_and_notify_impl(kh, state, CHECK); 933 set_initialization_state_and_notify_impl(kh, state, CHECK);
919 } 934 }
920 935
921 void InstanceKlass::set_initialization_state_and_notify_impl(instanceKlassHandle this_oop, ClassState state, TRAPS) { 936 void InstanceKlass::set_initialization_state_and_notify_impl(instanceKlassHandle this_oop, ClassState state, TRAPS) {
922 oop init_lock = this_oop->init_lock(); 937 oop init_lock = this_oop->init_lock();
923 ObjectLocker ol(init_lock, THREAD); 938 ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
924 this_oop->set_init_state(state); 939 this_oop->set_init_state(state);
940 this_oop->fence_and_clear_init_lock();
925 ol.notify_all(CHECK); 941 ol.notify_all(CHECK);
926 } 942 }
927 943
928 // The embedded _implementor field can only record one implementor. 944 // The embedded _implementor field can only record one implementor.
929 // When there are more than one implementors, the _implementor field 945 // When there are more than one implementors, the _implementor field

mercurial