864
865 bool JvmtiSuspendControl::resume(JavaThread *java_thread) {
866 // external suspend should have caught resuming a thread twice
867 assert(java_thread->is_being_ext_suspended(), "thread should be suspended");
868
869 // resume thread
870 {
871 // must always grab Threads_lock, see JVM_SuspendThread
872 MutexLocker ml(Threads_lock);
873 java_thread->java_resume();
874 }
875
876 return true;
877 }
878
879
880 void JvmtiSuspendControl::print() {
881 #ifndef PRODUCT
882 LogStreamHandle(Trace, jvmti) log_stream;
883 log_stream.print("Suspended Threads: [");
884 ThreadsListHandle tlh;
885 JavaThreadIterator jti(tlh.list());
886 for (JavaThread *thread = jti.first(); thread != NULL; thread = jti.next()) {
887 #ifdef JVMTI_TRACE
888 const char *name = JvmtiTrace::safe_get_thread_name(thread);
889 #else
890 const char *name = "";
891 #endif /*JVMTI_TRACE */
892 log_stream.print("%s(%c ", name, thread->is_being_ext_suspended() ? 'S' : '_');
893 if (!thread->has_last_Java_frame()) {
894 log_stream.print("no stack");
895 }
896 log_stream.print(") ");
897 }
898 log_stream.print_cr("]");
899 #endif
900 }
901
902 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
903 nmethod* nm) {
904 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
905 event._event_data.compiled_method_load = nm;
906 // Keep the nmethod alive until the ServiceThread can process
|
864
865 bool JvmtiSuspendControl::resume(JavaThread *java_thread) {
866 // external suspend should have caught resuming a thread twice
867 assert(java_thread->is_being_ext_suspended(), "thread should be suspended");
868
869 // resume thread
870 {
871 // must always grab Threads_lock, see JVM_SuspendThread
872 MutexLocker ml(Threads_lock);
873 java_thread->java_resume();
874 }
875
876 return true;
877 }
878
879
880 void JvmtiSuspendControl::print() {
881 #ifndef PRODUCT
882 LogStreamHandle(Trace, jvmti) log_stream;
883 log_stream.print("Suspended Threads: [");
884 for (JavaThreadIteratorWithHandle jtiwh; JavaThread *thread = jtiwh.next(); ) {
885 #ifdef JVMTI_TRACE
886 const char *name = JvmtiTrace::safe_get_thread_name(thread);
887 #else
888 const char *name = "";
889 #endif /*JVMTI_TRACE */
890 log_stream.print("%s(%c ", name, thread->is_being_ext_suspended() ? 'S' : '_');
891 if (!thread->has_last_Java_frame()) {
892 log_stream.print("no stack");
893 }
894 log_stream.print(") ");
895 }
896 log_stream.print_cr("]");
897 #endif
898 }
899
900 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
901 nmethod* nm) {
902 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
903 event._event_data.compiled_method_load = nm;
904 // Keep the nmethod alive until the ServiceThread can process
|