41 // Implementation of "properties" command. |
41 // Implementation of "properties" command. |
42 // |
42 // |
43 // Invokes sun.misc.VMSupport.serializePropertiesToByteArray to serialize |
43 // Invokes sun.misc.VMSupport.serializePropertiesToByteArray to serialize |
44 // the system properties into a byte array. |
44 // the system properties into a byte array. |
45 |
45 |
46 static klassOop load_and_initialize_klass(symbolHandle sh, TRAPS) { |
46 static klassOop load_and_initialize_klass(Symbol* sh, TRAPS) { |
47 klassOop k = SystemDictionary::resolve_or_fail(sh, true, CHECK_NULL); |
47 klassOop k = SystemDictionary::resolve_or_fail(sh, true, CHECK_NULL); |
48 instanceKlassHandle ik (THREAD, k); |
48 instanceKlassHandle ik (THREAD, k); |
49 if (ik->should_be_initialized()) { |
49 if (ik->should_be_initialized()) { |
50 ik->initialize(CHECK_NULL); |
50 ik->initialize(CHECK_NULL); |
51 } |
51 } |
52 return ik(); |
52 return ik(); |
53 } |
53 } |
54 |
54 |
55 static jint get_properties(AttachOperation* op, outputStream* out, symbolHandle serializePropertiesMethod) { |
55 static jint get_properties(AttachOperation* op, outputStream* out, Symbol* serializePropertiesMethod) { |
56 Thread* THREAD = Thread::current(); |
56 Thread* THREAD = Thread::current(); |
57 HandleMark hm; |
57 HandleMark hm; |
58 |
58 |
59 // load sun.misc.VMSupport |
59 // load sun.misc.VMSupport |
60 symbolHandle klass = vmSymbolHandles::sun_misc_VMSupport(); |
60 Symbol* klass = vmSymbols::sun_misc_VMSupport(); |
61 klassOop k = load_and_initialize_klass(klass, THREAD); |
61 klassOop k = load_and_initialize_klass(klass, THREAD); |
62 if (HAS_PENDING_EXCEPTION) { |
62 if (HAS_PENDING_EXCEPTION) { |
63 java_lang_Throwable::print(PENDING_EXCEPTION, out); |
63 java_lang_Throwable::print(PENDING_EXCEPTION, out); |
64 CLEAR_PENDING_EXCEPTION; |
64 CLEAR_PENDING_EXCEPTION; |
65 return JNI_ERR; |
65 return JNI_ERR; |
69 // invoke the serializePropertiesToByteArray method |
69 // invoke the serializePropertiesToByteArray method |
70 JavaValue result(T_OBJECT); |
70 JavaValue result(T_OBJECT); |
71 JavaCallArguments args; |
71 JavaCallArguments args; |
72 |
72 |
73 |
73 |
74 symbolHandle signature = vmSymbolHandles::serializePropertiesToByteArray_signature(); |
74 Symbol* signature = vmSymbols::serializePropertiesToByteArray_signature(); |
75 JavaCalls::call_static(&result, |
75 JavaCalls::call_static(&result, |
76 ik, |
76 ik, |
77 serializePropertiesMethod, |
77 serializePropertiesMethod, |
78 signature, |
78 signature, |
79 &args, |
79 &args, |
97 return JNI_OK; |
97 return JNI_OK; |
98 } |
98 } |
99 |
99 |
100 // Implementation of "properties" command. |
100 // Implementation of "properties" command. |
101 static jint get_system_properties(AttachOperation* op, outputStream* out) { |
101 static jint get_system_properties(AttachOperation* op, outputStream* out) { |
102 return get_properties(op, out, vmSymbolHandles::serializePropertiesToByteArray_name()); |
102 return get_properties(op, out, vmSymbols::serializePropertiesToByteArray_name()); |
103 } |
103 } |
104 |
104 |
105 // Implementation of "agent_properties" command. |
105 // Implementation of "agent_properties" command. |
106 static jint get_agent_properties(AttachOperation* op, outputStream* out) { |
106 static jint get_agent_properties(AttachOperation* op, outputStream* out) { |
107 return get_properties(op, out, vmSymbolHandles::serializeAgentPropertiesToByteArray_name()); |
107 return get_properties(op, out, vmSymbols::serializeAgentPropertiesToByteArray_name()); |
108 } |
108 } |
109 |
109 |
110 // Implementation of "datadump" command. |
110 // Implementation of "datadump" command. |
111 // |
111 // |
112 // Raises a SIGBREAK signal so that VM dump threads, does deadlock detection, |
112 // Raises a SIGBREAK signal so that VM dump threads, does deadlock detection, |
428 } |
428 } |
429 |
429 |
430 // Starts the Attach Listener thread |
430 // Starts the Attach Listener thread |
431 void AttachListener::init() { |
431 void AttachListener::init() { |
432 EXCEPTION_MARK; |
432 EXCEPTION_MARK; |
433 klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_Thread(), true, CHECK); |
433 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK); |
434 instanceKlassHandle klass (THREAD, k); |
434 instanceKlassHandle klass (THREAD, k); |
435 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK); |
435 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK); |
436 |
436 |
437 const char thread_name[] = "Attach Listener"; |
437 const char thread_name[] = "Attach Listener"; |
438 Handle string = java_lang_String::create_from_str(thread_name, CHECK); |
438 Handle string = java_lang_String::create_from_str(thread_name, CHECK); |
440 // Initialize thread_oop to put it into the system threadGroup |
440 // Initialize thread_oop to put it into the system threadGroup |
441 Handle thread_group (THREAD, Universe::system_thread_group()); |
441 Handle thread_group (THREAD, Universe::system_thread_group()); |
442 JavaValue result(T_VOID); |
442 JavaValue result(T_VOID); |
443 JavaCalls::call_special(&result, thread_oop, |
443 JavaCalls::call_special(&result, thread_oop, |
444 klass, |
444 klass, |
445 vmSymbolHandles::object_initializer_name(), |
445 vmSymbols::object_initializer_name(), |
446 vmSymbolHandles::threadgroup_string_void_signature(), |
446 vmSymbols::threadgroup_string_void_signature(), |
447 thread_group, |
447 thread_group, |
448 string, |
448 string, |
449 CHECK); |
449 CHECK); |
450 |
450 |
451 KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass()); |
451 KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass()); |
452 JavaCalls::call_special(&result, |
452 JavaCalls::call_special(&result, |
453 thread_group, |
453 thread_group, |
454 group, |
454 group, |
455 vmSymbolHandles::add_method_name(), |
455 vmSymbols::add_method_name(), |
456 vmSymbolHandles::thread_void_signature(), |
456 vmSymbols::thread_void_signature(), |
457 thread_oop, // ARG 1 |
457 thread_oop, // ARG 1 |
458 CHECK); |
458 CHECK); |
459 |
459 |
460 { MutexLocker mu(Threads_lock); |
460 { MutexLocker mu(Threads_lock); |
461 JavaThread* listener_thread = new JavaThread(&attach_listener_thread_entry); |
461 JavaThread* listener_thread = new JavaThread(&attach_listener_thread_entry); |