32 #include "interpreter/interpreter.hpp" |
32 #include "interpreter/interpreter.hpp" |
33 #include "interpreter/linkResolver.hpp" |
33 #include "interpreter/linkResolver.hpp" |
34 #include "interpreter/oopMapCache.hpp" |
34 #include "interpreter/oopMapCache.hpp" |
35 #include "jvmtifiles/jvmtiEnv.hpp" |
35 #include "jvmtifiles/jvmtiEnv.hpp" |
36 #include "memory/gcLocker.inline.hpp" |
36 #include "memory/gcLocker.inline.hpp" |
|
37 #include "memory/metaspaceShared.hpp" |
37 #include "memory/oopFactory.hpp" |
38 #include "memory/oopFactory.hpp" |
38 #include "memory/universe.inline.hpp" |
39 #include "memory/universe.inline.hpp" |
39 #include "oops/instanceKlass.hpp" |
40 #include "oops/instanceKlass.hpp" |
40 #include "oops/objArrayOop.hpp" |
41 #include "oops/objArrayOop.hpp" |
41 #include "oops/oop.inline.hpp" |
42 #include "oops/oop.inline.hpp" |
217 |
218 |
218 // allocated data structures |
219 // allocated data structures |
219 set_osthread(NULL); |
220 set_osthread(NULL); |
220 set_resource_area(new (mtThread)ResourceArea()); |
221 set_resource_area(new (mtThread)ResourceArea()); |
221 set_handle_area(new (mtThread) HandleArea(NULL)); |
222 set_handle_area(new (mtThread) HandleArea(NULL)); |
|
223 set_metadata_handles(new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(300, true)); |
222 set_active_handles(NULL); |
224 set_active_handles(NULL); |
223 set_free_handle_block(NULL); |
225 set_free_handle_block(NULL); |
224 set_last_handle_mark(NULL); |
226 set_last_handle_mark(NULL); |
225 |
227 |
226 // This initial value ==> never claimed. |
228 // This initial value ==> never claimed. |
344 ParkEvent::Release (_SleepEvent) ; _SleepEvent = NULL ; |
346 ParkEvent::Release (_SleepEvent) ; _SleepEvent = NULL ; |
345 ParkEvent::Release (_MutexEvent) ; _MutexEvent = NULL ; |
347 ParkEvent::Release (_MutexEvent) ; _MutexEvent = NULL ; |
346 ParkEvent::Release (_MuxEvent) ; _MuxEvent = NULL ; |
348 ParkEvent::Release (_MuxEvent) ; _MuxEvent = NULL ; |
347 |
349 |
348 delete handle_area(); |
350 delete handle_area(); |
|
351 delete metadata_handles(); |
349 |
352 |
350 // osthread() can be NULL, if creation of thread failed. |
353 // osthread() can be NULL, if creation of thread failed. |
351 if (osthread() != NULL) os::free_thread(osthread()); |
354 if (osthread() != NULL) os::free_thread(osthread()); |
352 |
355 |
353 delete _SR_lock; |
356 delete _SR_lock; |
815 |
818 |
816 void Thread::nmethods_do(CodeBlobClosure* cf) { |
819 void Thread::nmethods_do(CodeBlobClosure* cf) { |
817 // no nmethods in a generic thread... |
820 // no nmethods in a generic thread... |
818 } |
821 } |
819 |
822 |
|
823 void Thread::metadata_do(void f(Metadata*)) { |
|
824 if (metadata_handles() != NULL) { |
|
825 for (int i = 0; i< metadata_handles()->length(); i++) { |
|
826 f(metadata_handles()->at(i)); |
|
827 } |
|
828 } |
|
829 } |
|
830 |
820 void Thread::print_on(outputStream* st) const { |
831 void Thread::print_on(outputStream* st) const { |
821 // get_priority assumes osthread initialized |
832 // get_priority assumes osthread initialized |
822 if (osthread() != NULL) { |
833 if (osthread() != NULL) { |
823 st->print("prio=%d tid=" INTPTR_FORMAT " ", get_priority(this), this); |
834 st->print("prio=%d tid=" INTPTR_FORMAT " ", get_priority(this), this); |
824 osthread()->print_on(st); |
835 osthread()->print_on(st); |
914 #endif |
925 #endif |
915 |
926 |
916 bool Thread::is_in_stack(address adr) const { |
927 bool Thread::is_in_stack(address adr) const { |
917 assert(Thread::current() == this, "is_in_stack can only be called from current thread"); |
928 assert(Thread::current() == this, "is_in_stack can only be called from current thread"); |
918 address end = os::current_stack_pointer(); |
929 address end = os::current_stack_pointer(); |
|
930 // Allow non Java threads to call this without stack_base |
|
931 if (_stack_base == NULL) return true; |
919 if (stack_base() >= adr && adr >= end) return true; |
932 if (stack_base() >= adr && adr >= end) return true; |
920 |
933 |
921 return false; |
934 return false; |
922 } |
935 } |
923 |
936 |
935 // NOTE: this must be called inside the main thread. |
948 // NOTE: this must be called inside the main thread. |
936 return os::create_main_thread((JavaThread*)this); |
949 return os::create_main_thread((JavaThread*)this); |
937 } |
950 } |
938 |
951 |
939 static void initialize_class(Symbol* class_name, TRAPS) { |
952 static void initialize_class(Symbol* class_name, TRAPS) { |
940 klassOop klass = SystemDictionary::resolve_or_fail(class_name, true, CHECK); |
953 Klass* klass = SystemDictionary::resolve_or_fail(class_name, true, CHECK); |
941 instanceKlass::cast(klass)->initialize(CHECK); |
954 InstanceKlass::cast(klass)->initialize(CHECK); |
942 } |
955 } |
943 |
956 |
944 |
957 |
945 // Creates the initial ThreadGroup |
958 // Creates the initial ThreadGroup |
946 static Handle create_initial_thread_group(TRAPS) { |
959 static Handle create_initial_thread_group(TRAPS) { |
947 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ThreadGroup(), true, CHECK_NH); |
960 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ThreadGroup(), true, CHECK_NH); |
948 instanceKlassHandle klass (THREAD, k); |
961 instanceKlassHandle klass (THREAD, k); |
949 |
962 |
950 Handle system_instance = klass->allocate_instance_handle(CHECK_NH); |
963 Handle system_instance = klass->allocate_instance_handle(CHECK_NH); |
951 { |
964 { |
952 JavaValue result(T_VOID); |
965 JavaValue result(T_VOID); |
975 return main_instance; |
988 return main_instance; |
976 } |
989 } |
977 |
990 |
978 // Creates the initial Thread |
991 // Creates the initial Thread |
979 static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) { |
992 static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) { |
980 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_NULL); |
993 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_NULL); |
981 instanceKlassHandle klass (THREAD, k); |
994 instanceKlassHandle klass (THREAD, k); |
982 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL); |
995 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL); |
983 |
996 |
984 java_lang_Thread::set_thread(thread_oop(), thread); |
997 java_lang_Thread::set_thread(thread_oop(), thread); |
985 java_lang_Thread::set_priority(thread_oop(), NormPriority); |
998 java_lang_Thread::set_priority(thread_oop(), NormPriority); |
997 CHECK_NULL); |
1010 CHECK_NULL); |
998 return thread_oop(); |
1011 return thread_oop(); |
999 } |
1012 } |
1000 |
1013 |
1001 static void call_initializeSystemClass(TRAPS) { |
1014 static void call_initializeSystemClass(TRAPS) { |
1002 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK); |
1015 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK); |
1003 instanceKlassHandle klass (THREAD, k); |
1016 instanceKlassHandle klass (THREAD, k); |
1004 |
1017 |
1005 JavaValue result(T_VOID); |
1018 JavaValue result(T_VOID); |
1006 JavaCalls::call_static(&result, klass, vmSymbols::initializeSystemClass_name(), |
1019 JavaCalls::call_static(&result, klass, vmSymbols::initializeSystemClass_name(), |
1007 vmSymbols::void_method_signature(), CHECK); |
1020 vmSymbols::void_method_signature(), CHECK); |
1009 |
1022 |
1010 char java_runtime_name[128] = ""; |
1023 char java_runtime_name[128] = ""; |
1011 |
1024 |
1012 // extract the JRE name from sun.misc.Version.java_runtime_name |
1025 // extract the JRE name from sun.misc.Version.java_runtime_name |
1013 static const char* get_java_runtime_name(TRAPS) { |
1026 static const char* get_java_runtime_name(TRAPS) { |
1014 klassOop k = SystemDictionary::find(vmSymbols::sun_misc_Version(), |
1027 Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(), |
1015 Handle(), Handle(), CHECK_AND_CLEAR_NULL); |
1028 Handle(), Handle(), CHECK_AND_CLEAR_NULL); |
1016 fieldDescriptor fd; |
1029 fieldDescriptor fd; |
1017 bool found = k != NULL && |
1030 bool found = k != NULL && |
1018 instanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_name_name(), |
1031 InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_name_name(), |
1019 vmSymbols::string_signature(), &fd); |
1032 vmSymbols::string_signature(), &fd); |
1020 if (found) { |
1033 if (found) { |
1021 oop name_oop = k->java_mirror()->obj_field(fd.offset()); |
1034 oop name_oop = k->java_mirror()->obj_field(fd.offset()); |
1022 if (name_oop == NULL) |
1035 if (name_oop == NULL) |
1023 return NULL; |
1036 return NULL; |
1031 } |
1044 } |
1032 |
1045 |
1033 // General purpose hook into Java code, run once when the VM is initialized. |
1046 // General purpose hook into Java code, run once when the VM is initialized. |
1034 // The Java library method itself may be changed independently from the VM. |
1047 // The Java library method itself may be changed independently from the VM. |
1035 static void call_postVMInitHook(TRAPS) { |
1048 static void call_postVMInitHook(TRAPS) { |
1036 klassOop k = SystemDictionary::PostVMInitHook_klass(); |
1049 Klass* k = SystemDictionary::PostVMInitHook_klass(); |
1037 instanceKlassHandle klass (THREAD, k); |
1050 instanceKlassHandle klass (THREAD, k); |
1038 if (klass.not_null()) { |
1051 if (klass.not_null()) { |
1039 JavaValue result(T_VOID); |
1052 JavaValue result(T_VOID); |
1040 JavaCalls::call_static(&result, klass, vmSymbols::run_method_name(), |
1053 JavaCalls::call_static(&result, klass, vmSymbols::run_method_name(), |
1041 vmSymbols::void_method_signature(), |
1054 vmSymbols::void_method_signature(), |
1047 // the vm info string |
1060 // the vm info string |
1048 ResourceMark rm(THREAD); |
1061 ResourceMark rm(THREAD); |
1049 const char *vm_info = VM_Version::vm_info_string(); |
1062 const char *vm_info = VM_Version::vm_info_string(); |
1050 |
1063 |
1051 // java.lang.System class |
1064 // java.lang.System class |
1052 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK); |
1065 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK); |
1053 instanceKlassHandle klass (THREAD, k); |
1066 instanceKlassHandle klass (THREAD, k); |
1054 |
1067 |
1055 // setProperty arguments |
1068 // setProperty arguments |
1056 Handle key_str = java_lang_String::create_from_str("java.vm.info", CHECK); |
1069 Handle key_str = java_lang_String::create_from_str("java.vm.info", CHECK); |
1057 Handle value_str = java_lang_String::create_from_str(vm_info, CHECK); |
1070 Handle value_str = java_lang_String::create_from_str(vm_info, CHECK); |
1072 |
1085 |
1073 void JavaThread::allocate_threadObj(Handle thread_group, char* thread_name, bool daemon, TRAPS) { |
1086 void JavaThread::allocate_threadObj(Handle thread_group, char* thread_name, bool daemon, TRAPS) { |
1074 assert(thread_group.not_null(), "thread group should be specified"); |
1087 assert(thread_group.not_null(), "thread group should be specified"); |
1075 assert(threadObj() == NULL, "should only create Java thread object once"); |
1088 assert(threadObj() == NULL, "should only create Java thread object once"); |
1076 |
1089 |
1077 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK); |
1090 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK); |
1078 instanceKlassHandle klass (THREAD, k); |
1091 instanceKlassHandle klass (THREAD, k); |
1079 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK); |
1092 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK); |
1080 |
1093 |
1081 java_lang_Thread::set_thread(thread_oop(), this); |
1094 java_lang_Thread::set_thread(thread_oop(), this); |
1082 java_lang_Thread::set_priority(thread_oop(), NormPriority); |
1095 java_lang_Thread::set_priority(thread_oop(), NormPriority); |
1980 tty->print("Async. exception installed at runtime exit (" INTPTR_FORMAT ")", this); |
1993 tty->print("Async. exception installed at runtime exit (" INTPTR_FORMAT ")", this); |
1981 if (has_last_Java_frame() ) { |
1994 if (has_last_Java_frame() ) { |
1982 frame f = last_frame(); |
1995 frame f = last_frame(); |
1983 tty->print(" (pc: " INTPTR_FORMAT " sp: " INTPTR_FORMAT " )", f.pc(), f.sp()); |
1996 tty->print(" (pc: " INTPTR_FORMAT " sp: " INTPTR_FORMAT " )", f.pc(), f.sp()); |
1984 } |
1997 } |
1985 tty->print_cr(" of type: %s", instanceKlass::cast(_pending_async_exception->klass())->external_name()); |
1998 tty->print_cr(" of type: %s", InstanceKlass::cast(_pending_async_exception->klass())->external_name()); |
1986 } |
1999 } |
1987 _pending_async_exception = NULL; |
2000 _pending_async_exception = NULL; |
1988 clear_has_async_exception(); |
2001 clear_has_async_exception(); |
1989 } |
2002 } |
1990 } |
2003 } |
2101 // Set async. pending exception in thread. |
2114 // Set async. pending exception in thread. |
2102 set_pending_async_exception(java_throwable); |
2115 set_pending_async_exception(java_throwable); |
2103 |
2116 |
2104 if (TraceExceptions) { |
2117 if (TraceExceptions) { |
2105 ResourceMark rm; |
2118 ResourceMark rm; |
2106 tty->print_cr("Pending Async. exception installed of type: %s", instanceKlass::cast(_pending_async_exception->klass())->external_name()); |
2119 tty->print_cr("Pending Async. exception installed of type: %s", InstanceKlass::cast(_pending_async_exception->klass())->external_name()); |
2107 } |
2120 } |
2108 // for AbortVMOnException flag |
2121 // for AbortVMOnException flag |
2109 NOT_PRODUCT(Exceptions::debug_check_abort(instanceKlass::cast(_pending_async_exception->klass())->external_name())); |
2122 NOT_PRODUCT(Exceptions::debug_check_abort(InstanceKlass::cast(_pending_async_exception->klass())->external_name())); |
2110 } |
2123 } |
2111 } |
2124 } |
2112 |
2125 |
2113 |
2126 |
2114 // Interrupt thread so it will wake up from a potential wait() |
2127 // Interrupt thread so it will wake up from a potential wait() |
2654 |
2667 |
2655 // Traverse instance variables at the end since the GC may be moving things |
2668 // Traverse instance variables at the end since the GC may be moving things |
2656 // around using this function |
2669 // around using this function |
2657 f->do_oop((oop*) &_threadObj); |
2670 f->do_oop((oop*) &_threadObj); |
2658 f->do_oop((oop*) &_vm_result); |
2671 f->do_oop((oop*) &_vm_result); |
2659 f->do_oop((oop*) &_vm_result_2); |
|
2660 f->do_oop((oop*) &_exception_oop); |
2672 f->do_oop((oop*) &_exception_oop); |
2661 f->do_oop((oop*) &_pending_async_exception); |
2673 f->do_oop((oop*) &_pending_async_exception); |
2662 |
2674 |
2663 if (jvmti_thread_state() != NULL) { |
2675 if (jvmti_thread_state() != NULL) { |
2664 jvmti_thread_state()->oops_do(f); |
2676 jvmti_thread_state()->oops_do(f); |
2673 |
2685 |
2674 if (has_last_Java_frame()) { |
2686 if (has_last_Java_frame()) { |
2675 // Traverse the execution stack |
2687 // Traverse the execution stack |
2676 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) { |
2688 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) { |
2677 fst.current()->nmethods_do(cf); |
2689 fst.current()->nmethods_do(cf); |
|
2690 } |
|
2691 } |
|
2692 } |
|
2693 |
|
2694 void JavaThread::metadata_do(void f(Metadata*)) { |
|
2695 Thread::metadata_do(f); |
|
2696 if (has_last_Java_frame()) { |
|
2697 // Traverse the execution stack to call f() on the methods in the stack |
|
2698 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) { |
|
2699 fst.current()->metadata_do(f); |
|
2700 } |
|
2701 } else if (is_Compiler_thread()) { |
|
2702 // need to walk ciMetadata in current compile tasks to keep alive. |
|
2703 CompilerThread* ct = (CompilerThread*)this; |
|
2704 if (ct->env() != NULL) { |
|
2705 ct->env()->metadata_do(f); |
2678 } |
2706 } |
2679 } |
2707 } |
2680 } |
2708 } |
2681 |
2709 |
2682 // Printing |
2710 // Printing |
2867 // Set the thread field (a JavaThread *) of the |
2895 // Set the thread field (a JavaThread *) of the |
2868 // oop representing the java_lang_Thread to the new thread (a JavaThread *). |
2896 // oop representing the java_lang_Thread to the new thread (a JavaThread *). |
2869 |
2897 |
2870 Handle thread_oop(Thread::current(), |
2898 Handle thread_oop(Thread::current(), |
2871 JNIHandles::resolve_non_null(jni_thread)); |
2899 JNIHandles::resolve_non_null(jni_thread)); |
2872 assert(instanceKlass::cast(thread_oop->klass())->is_linked(), |
2900 assert(InstanceKlass::cast(thread_oop->klass())->is_linked(), |
2873 "must be initialized"); |
2901 "must be initialized"); |
2874 set_threadObj(thread_oop()); |
2902 set_threadObj(thread_oop()); |
2875 java_lang_Thread::set_thread(thread_oop(), this); |
2903 java_lang_Thread::set_thread(thread_oop(), this); |
2876 |
2904 |
2877 if (prio == NoPriority) { |
2905 if (prio == NoPriority) { |
3121 JavaThread* Threads::_thread_list = NULL; |
3149 JavaThread* Threads::_thread_list = NULL; |
3122 int Threads::_number_of_threads = 0; |
3150 int Threads::_number_of_threads = 0; |
3123 int Threads::_number_of_non_daemon_threads = 0; |
3151 int Threads::_number_of_non_daemon_threads = 0; |
3124 int Threads::_return_code = 0; |
3152 int Threads::_return_code = 0; |
3125 size_t JavaThread::_stack_size_at_create = 0; |
3153 size_t JavaThread::_stack_size_at_create = 0; |
|
3154 #ifdef ASSERT |
|
3155 bool Threads::_vm_complete = false; |
|
3156 #endif |
3126 |
3157 |
3127 // All JavaThreads |
3158 // All JavaThreads |
3128 #define ALL_JAVA_THREADS(X) for (JavaThread* X = _thread_list; X; X = X->next()) |
3159 #define ALL_JAVA_THREADS(X) for (JavaThread* X = _thread_list; X; X = X->next()) |
3129 |
3160 |
3130 void os_stream(); |
3161 void os_stream(); |
3318 EXCEPTION_MARK; |
3349 EXCEPTION_MARK; |
3319 |
3350 |
3320 // At this point, the Universe is initialized, but we have not executed |
3351 // At this point, the Universe is initialized, but we have not executed |
3321 // any byte code. Now is a good time (the only time) to dump out the |
3352 // any byte code. Now is a good time (the only time) to dump out the |
3322 // internal state of the JVM for sharing. |
3353 // internal state of the JVM for sharing. |
3323 |
|
3324 if (DumpSharedSpaces) { |
3354 if (DumpSharedSpaces) { |
3325 Universe::heap()->preload_and_dump(CHECK_0); |
3355 MetaspaceShared::preload_and_dump(CHECK_0); |
3326 ShouldNotReachHere(); |
3356 ShouldNotReachHere(); |
3327 } |
3357 } |
3328 |
3358 |
3329 // Always call even when there are not JVMTI environments yet, since environments |
3359 // Always call even when there are not JVMTI environments yet, since environments |
3330 // may be attached late and JVMTI must track phases of VM execution |
3360 // may be attached late and JVMTI must track phases of VM execution |
3349 if (AggressiveOpts) { |
3379 if (AggressiveOpts) { |
3350 { |
3380 { |
3351 // Forcibly initialize java/util/HashMap and mutate the private |
3381 // Forcibly initialize java/util/HashMap and mutate the private |
3352 // static final "frontCacheEnabled" field before we start creating instances |
3382 // static final "frontCacheEnabled" field before we start creating instances |
3353 #ifdef ASSERT |
3383 #ifdef ASSERT |
3354 klassOop tmp_k = SystemDictionary::find(vmSymbols::java_util_HashMap(), Handle(), Handle(), CHECK_0); |
3384 Klass* tmp_k = SystemDictionary::find(vmSymbols::java_util_HashMap(), Handle(), Handle(), CHECK_0); |
3355 assert(tmp_k == NULL, "java/util/HashMap should not be loaded yet"); |
3385 assert(tmp_k == NULL, "java/util/HashMap should not be loaded yet"); |
3356 #endif |
3386 #endif |
3357 klassOop k_o = SystemDictionary::resolve_or_null(vmSymbols::java_util_HashMap(), Handle(), Handle(), CHECK_0); |
3387 Klass* k_o = SystemDictionary::resolve_or_null(vmSymbols::java_util_HashMap(), Handle(), Handle(), CHECK_0); |
3358 KlassHandle k = KlassHandle(THREAD, k_o); |
3388 KlassHandle k = KlassHandle(THREAD, k_o); |
3359 guarantee(k.not_null(), "Must find java/util/HashMap"); |
3389 guarantee(k.not_null(), "Must find java/util/HashMap"); |
3360 instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); |
3390 instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); |
3361 ik->initialize(CHECK_0); |
3391 ik->initialize(CHECK_0); |
3362 fieldDescriptor fd; |
3392 fieldDescriptor fd; |
3367 } |
3397 } |
3368 |
3398 |
3369 if (UseStringCache) { |
3399 if (UseStringCache) { |
3370 // Forcibly initialize java/lang/StringValue and mutate the private |
3400 // Forcibly initialize java/lang/StringValue and mutate the private |
3371 // static final "stringCacheEnabled" field before we start creating instances |
3401 // static final "stringCacheEnabled" field before we start creating instances |
3372 klassOop k_o = SystemDictionary::resolve_or_null(vmSymbols::java_lang_StringValue(), Handle(), Handle(), CHECK_0); |
3402 Klass* k_o = SystemDictionary::resolve_or_null(vmSymbols::java_lang_StringValue(), Handle(), Handle(), CHECK_0); |
3373 // Possible that StringValue isn't present: if so, silently don't break |
3403 // Possible that StringValue isn't present: if so, silently don't break |
3374 if (k_o != NULL) { |
3404 if (k_o != NULL) { |
3375 KlassHandle k = KlassHandle(THREAD, k_o); |
3405 KlassHandle k = KlassHandle(THREAD, k_o); |
3376 instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); |
3406 instanceKlassHandle ik = instanceKlassHandle(THREAD, k()); |
3377 ik->initialize(CHECK_0); |
3407 ik->initialize(CHECK_0); |
3779 if (this->has_pending_exception()) { |
3812 if (this->has_pending_exception()) { |
3780 this->clear_pending_exception(); |
3813 this->clear_pending_exception(); |
3781 } |
3814 } |
3782 |
3815 |
3783 EXCEPTION_MARK; |
3816 EXCEPTION_MARK; |
3784 klassOop k = |
3817 Klass* k = |
3785 SystemDictionary::resolve_or_null(vmSymbols::java_lang_Shutdown(), |
3818 SystemDictionary::resolve_or_null(vmSymbols::java_lang_Shutdown(), |
3786 THREAD); |
3819 THREAD); |
3787 if (k != NULL) { |
3820 if (k != NULL) { |
3788 // SystemDictionary::resolve_or_null will return null if there was |
3821 // SystemDictionary::resolve_or_null will return null if there was |
3789 // an exception. If we cannot load the Shutdown class, just don't |
3822 // an exception. If we cannot load the Shutdown class, just don't |
3838 // + Return to caller |
3871 // + Return to caller |
3839 |
3872 |
3840 bool Threads::destroy_vm() { |
3873 bool Threads::destroy_vm() { |
3841 JavaThread* thread = JavaThread::current(); |
3874 JavaThread* thread = JavaThread::current(); |
3842 |
3875 |
|
3876 #ifdef ASSERT |
|
3877 _vm_complete = false; |
|
3878 #endif |
3843 // Wait until we are the last non-daemon thread to execute |
3879 // Wait until we are the last non-daemon thread to execute |
3844 { MutexLocker nu(Threads_lock); |
3880 { MutexLocker nu(Threads_lock); |
3845 while (Threads::number_of_non_daemon_threads() > 1 ) |
3881 while (Threads::number_of_non_daemon_threads() > 1 ) |
3846 // This wait should make safepoint checks, wait without a timeout, |
3882 // This wait should make safepoint checks, wait without a timeout, |
3847 // and wait as a suspend-equivalent condition. |
3883 // and wait as a suspend-equivalent condition. |
4096 void Threads::nmethods_do(CodeBlobClosure* cf) { |
4132 void Threads::nmethods_do(CodeBlobClosure* cf) { |
4097 ALL_JAVA_THREADS(p) { |
4133 ALL_JAVA_THREADS(p) { |
4098 p->nmethods_do(cf); |
4134 p->nmethods_do(cf); |
4099 } |
4135 } |
4100 VMThread::vm_thread()->nmethods_do(cf); |
4136 VMThread::vm_thread()->nmethods_do(cf); |
|
4137 } |
|
4138 |
|
4139 void Threads::metadata_do(void f(Metadata*)) { |
|
4140 ALL_JAVA_THREADS(p) { |
|
4141 p->metadata_do(f); |
|
4142 } |
4101 } |
4143 } |
4102 |
4144 |
4103 void Threads::gc_epilogue() { |
4145 void Threads::gc_epilogue() { |
4104 ALL_JAVA_THREADS(p) { |
4146 ALL_JAVA_THREADS(p) { |
4105 p->gc_epilogue(); |
4147 p->gc_epilogue(); |