Mercurial > hg > graal-jvmci-8
comparison src/share/vm/oops/instanceKlass.cpp @ 12946:b8860472c377
8014910: deadlock between JVM/TI ClassPrepare event handler and CompilerThread
Summary: Revert changes in JDK-8008962
Reviewed-by: coleenp, sspitsyn
author | iklam |
---|---|
date | Tue, 22 Oct 2013 14:29:02 -0700 |
parents | d37a0525c0fe |
children | e64f1fe9756b |
comparison
equal
deleted
inserted
replaced
12944:1327b7f85503 | 12946: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 |