comparison src/share/vm/prims/jvmtiExport.cpp @ 1577:852d0157c696

6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint Reviewed-by: kvn, dcubed
author never
date Wed, 02 Jun 2010 14:23:23 -0700
parents b4776199210f
children e9ff18c4ace7
comparison
equal deleted inserted replaced
1576:4a2e260bb13a 1577:852d0157c696
724 bool JvmtiExport::_have_pending_compiled_method_unload_events; 724 bool JvmtiExport::_have_pending_compiled_method_unload_events;
725 GrowableArray<jmethodID>* JvmtiExport::_pending_compiled_method_unload_method_ids; 725 GrowableArray<jmethodID>* JvmtiExport::_pending_compiled_method_unload_method_ids;
726 GrowableArray<const void *>* JvmtiExport::_pending_compiled_method_unload_code_begins; 726 GrowableArray<const void *>* JvmtiExport::_pending_compiled_method_unload_code_begins;
727 JavaThread* JvmtiExport::_current_poster; 727 JavaThread* JvmtiExport::_current_poster;
728 728
729 void JvmtiExport::post_compiled_method_unload_internal(JavaThread* self, jmethodID method, const void *code_begin) {
730 EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_UNLOAD,
731 ("JVMTI [%s] method compile unload event triggered",
732 JvmtiTrace::safe_get_thread_name(self)));
733
734 // post the event for each environment that has this event enabled.
735 JvmtiEnvIterator it;
736 for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
737 if (env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_UNLOAD)) {
738
739 EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_UNLOAD,
740 ("JVMTI [%s] class compile method unload event sent jmethodID " PTR_FORMAT,
741 JvmtiTrace::safe_get_thread_name(self), method));
742
743 ResourceMark rm(self);
744
745 JvmtiEventMark jem(self);
746 JvmtiJavaThreadEventTransition jet(self);
747 jvmtiEventCompiledMethodUnload callback = env->callbacks()->CompiledMethodUnload;
748 if (callback != NULL) {
749 (*callback)(env->jvmti_external(), method, code_begin);
750 }
751 }
752 }
753 }
754
729 // post any pending CompiledMethodUnload events 755 // post any pending CompiledMethodUnload events
730 756
731 void JvmtiExport::post_pending_compiled_method_unload_events() { 757 void JvmtiExport::post_pending_compiled_method_unload_events() {
732 JavaThread* self = JavaThread::current(); 758 JavaThread* self = JavaThread::current();
733 assert(!self->owns_locks(), "can't hold locks"); 759 assert(!self->owns_locks(), "can't hold locks");
786 // re-grabs the monitor and checks the list again. If the list is empty then and this 812 // re-grabs the monitor and checks the list again. If the list is empty then and this
787 // is the first activation of the function then we reset the _have_pending_events 813 // is the first activation of the function then we reset the _have_pending_events
788 // flag, cleanup _current_poster to indicate that no thread is now servicing the 814 // flag, cleanup _current_poster to indicate that no thread is now servicing the
789 // pending events list, and finally notify any thread that might be waiting. 815 // pending events list, and finally notify any thread that might be waiting.
790 for (;;) { 816 for (;;) {
791 EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_UNLOAD, 817 post_compiled_method_unload_internal(self, method, code_begin);
792 ("JVMTI [%s] method compile unload event triggered",
793 JvmtiTrace::safe_get_thread_name(self)));
794
795 // post the event for each environment that has this event enabled.
796 JvmtiEnvIterator it;
797 for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
798 if (env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_UNLOAD)) {
799 EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_UNLOAD,
800 ("JVMTI [%s] class compile method unload event sent jmethodID " PTR_FORMAT,
801 JvmtiTrace::safe_get_thread_name(self), method));
802
803 JvmtiEventMark jem(self);
804 JvmtiJavaThreadEventTransition jet(self);
805 jvmtiEventCompiledMethodUnload callback = env->callbacks()->CompiledMethodUnload;
806 if (callback != NULL) {
807 (*callback)(env->jvmti_external(), method, code_begin);
808 }
809 }
810 }
811 818
812 // event posted, now re-grab monitor and get the next event 819 // event posted, now re-grab monitor and get the next event
813 // If there's no next event then we are done. If this is the first 820 // If there's no next event then we are done. If this is the first
814 // activiation of this function by this thread notify any waiters 821 // activiation of this function by this thread notify any waiters
815 // so that they can post. 822 // so that they can post.
1862 } 1869 }
1863 } 1870 }
1864 } 1871 }
1865 1872
1866 // used at a safepoint to post a CompiledMethodUnload event 1873 // used at a safepoint to post a CompiledMethodUnload event
1867 void JvmtiExport::post_compiled_method_unload_at_safepoint(jmethodID mid, const void *code_begin) { 1874 void JvmtiExport::post_compiled_method_unload(jmethodID mid, const void *code_begin) {
1868 assert(SafepointSynchronize::is_at_safepoint(), "must be executed at a safepoint"); 1875 if (SafepointSynchronize::is_at_safepoint()) {
1869 1876 // Class unloading can cause nmethod unloading which is reported
1870 // create list lazily 1877 // by the VMThread. These must be batched to be processed later.
1871 if (_pending_compiled_method_unload_method_ids == NULL) { 1878 if (_pending_compiled_method_unload_method_ids == NULL) {
1872 _pending_compiled_method_unload_method_ids = new (ResourceObj::C_HEAP) GrowableArray<jmethodID>(10,true); 1879 // create list lazily
1873 _pending_compiled_method_unload_code_begins = new (ResourceObj::C_HEAP) GrowableArray<const void *>(10,true); 1880 _pending_compiled_method_unload_method_ids = new (ResourceObj::C_HEAP) GrowableArray<jmethodID>(10,true);
1874 } 1881 _pending_compiled_method_unload_code_begins = new (ResourceObj::C_HEAP) GrowableArray<const void *>(10,true);
1875 _pending_compiled_method_unload_method_ids->append(mid); 1882 }
1876 _pending_compiled_method_unload_code_begins->append(code_begin); 1883 _pending_compiled_method_unload_method_ids->append(mid);
1877 _have_pending_compiled_method_unload_events = true; 1884 _pending_compiled_method_unload_code_begins->append(code_begin);
1885 _have_pending_compiled_method_unload_events = true;
1886 } else {
1887 // Unloading caused by the sweeper can be reported synchronously.
1888 if (have_pending_compiled_method_unload_events()) {
1889 post_pending_compiled_method_unload_events();
1890 }
1891 post_compiled_method_unload_internal(JavaThread::current(), mid, code_begin);
1892 }
1878 } 1893 }
1879 1894
1880 void JvmtiExport::post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) { 1895 void JvmtiExport::post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) {
1881 JavaThread* thread = JavaThread::current(); 1896 JavaThread* thread = JavaThread::current();
1882 EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED, 1897 EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,