34 * In this test the same agent library is attached 3 times, but with
35 * different options. In such scenario functions nsk_jvmti_aod_addMultiagentsOptions and
36 * nsk_jvmti_aod_getMultiagentsOptions are used.
37 *
38 * Each agent from ClassLoad event handler tries to redefine class ClassToRedefine and
39 * finishes work.
40 */
41
42 #define REDEFINED_CLASS_NAME "Lnsk/jvmti/AttachOnDemand/attach046/ClassToRedefine;"
43 #define REDEFINED_CLASS_FILE_NAME "nsk/jvmti/AttachOnDemand/attach046/ClassToRedefine"
44
45 void JNICALL classLoadHandler(
46 jvmtiEnv *jvmti,
47 JNIEnv* jni,
48 jthread thread,
49 jclass klass) {
50 char className[MAX_STRING_LENGTH];
51 const char* agentName;
52 Options* options;
53
54 if (!NSK_VERIFY((options = nsk_jvmti_aod_getMultiagentsOptions(jvmti)) != NULL)) {
55 NSK_COMPLAIN0("Failed to get agents's options\n");
56 nsk_jvmti_aod_disableEvent(jvmti, JVMTI_EVENT_CLASS_LOAD);
57 // can't call nsk_aod_agentFinished because of without options can't get agent's name
58 return;
59 }
60
61 agentName = nsk_aod_getOptionValue(options, NSK_AOD_AGENT_NAME_OPTION);
62
63 if (!nsk_jvmti_aod_getClassName(jvmti, klass, className)) {
64 nsk_jvmti_aod_disableEventAndFinish(agentName, JVMTI_EVENT_CLASS_LOAD, 0, jvmti, jni);
65 return;
66 }
67
68 NSK_DISPLAY2("%s: ClassLoad event was received for class '%s'\n", agentName, className);
69
70 if (!strcmp(className, REDEFINED_CLASS_NAME)) {
71
72 NSK_DISPLAY1("%s: redefining class\n", agentName);
73
74 if (!NSK_VERIFY(nsk_jvmti_aod_redefineClass(options, jvmti, klass, REDEFINED_CLASS_FILE_NAME))) {
83 #ifdef STATIC_BUILD
84 JNIEXPORT jint JNI_OnLoad_attach046Agent00(JavaVM *jvm, char *options, void *reserved) {
85 return JNI_VERSION_1_8;
86 }
87 #endif
88
89 JNIEXPORT jint JNICALL
90 #ifdef STATIC_BUILD
91 Agent_OnAttach_attach046Agent00(JavaVM *vm, char *optionsString, void *reserved)
92 #else
93 Agent_OnAttach(JavaVM *vm, char *optionsString, void *reserved)
94 #endif
95 {
96 jvmtiEventCallbacks eventCallbacks;
97 jvmtiCapabilities caps;
98 jvmtiEnv* jvmti = NULL;
99 JNIEnv* jni = NULL;
100 Options* options;
101 const char* agentName;
102
103 if (!NSK_VERIFY((options = (Options*) nsk_aod_createOptions(optionsString)) != NULL))
104 return JNI_ERR;
105
106 agentName = nsk_aod_getOptionValue(options, NSK_AOD_AGENT_NAME_OPTION);
107
108 if ((jni = (JNIEnv*) nsk_aod_createJNIEnv(vm)) == NULL)
109 return NSK_FALSE;
110
111 if (!NSK_VERIFY((jvmti = nsk_jvmti_createJVMTIEnv(vm, reserved)) != NULL))
112 return JNI_ERR;
113
114 memset(&caps, 0, sizeof(caps));
115 caps.can_redefine_classes = 1;
116 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps))) {
117 return JNI_ERR;
118 }
119
120 memset(&eventCallbacks,0, sizeof(eventCallbacks));
121 eventCallbacks.ClassLoad = classLoadHandler;
122 if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&eventCallbacks, sizeof(eventCallbacks)))) {
123 return JNI_ERR;
124 }
125
126 if (!(nsk_jvmti_aod_enableEvent(jvmti, JVMTI_EVENT_CLASS_LOAD))) {
127 return JNI_ERR;
128 }
129
130 if (!NSK_VERIFY(nsk_jvmti_aod_addMultiagentsOptions(jvmti, options))) {
131 return JNI_ERR;
|
34 * In this test the same agent library is attached 3 times, but with
35 * different options. In such scenario functions nsk_jvmti_aod_addMultiagentsOptions and
36 * nsk_jvmti_aod_getMultiagentsOptions are used.
37 *
38 * Each agent from ClassLoad event handler tries to redefine class ClassToRedefine and
39 * finishes work.
40 */
41
42 #define REDEFINED_CLASS_NAME "Lnsk/jvmti/AttachOnDemand/attach046/ClassToRedefine;"
43 #define REDEFINED_CLASS_FILE_NAME "nsk/jvmti/AttachOnDemand/attach046/ClassToRedefine"
44
45 void JNICALL classLoadHandler(
46 jvmtiEnv *jvmti,
47 JNIEnv* jni,
48 jthread thread,
49 jclass klass) {
50 char className[MAX_STRING_LENGTH];
51 const char* agentName;
52 Options* options;
53
54 options = nsk_jvmti_aod_getMultiagentsOptions(jvmti);
55 if (!NSK_VERIFY(options != NULL)) {
56 NSK_COMPLAIN0("Failed to get agents's options\n");
57 nsk_jvmti_aod_disableEvent(jvmti, JVMTI_EVENT_CLASS_LOAD);
58 // can't call nsk_aod_agentFinished because of without options can't get agent's name
59 return;
60 }
61
62 agentName = nsk_aod_getOptionValue(options, NSK_AOD_AGENT_NAME_OPTION);
63
64 if (!nsk_jvmti_aod_getClassName(jvmti, klass, className)) {
65 nsk_jvmti_aod_disableEventAndFinish(agentName, JVMTI_EVENT_CLASS_LOAD, 0, jvmti, jni);
66 return;
67 }
68
69 NSK_DISPLAY2("%s: ClassLoad event was received for class '%s'\n", agentName, className);
70
71 if (!strcmp(className, REDEFINED_CLASS_NAME)) {
72
73 NSK_DISPLAY1("%s: redefining class\n", agentName);
74
75 if (!NSK_VERIFY(nsk_jvmti_aod_redefineClass(options, jvmti, klass, REDEFINED_CLASS_FILE_NAME))) {
84 #ifdef STATIC_BUILD
85 JNIEXPORT jint JNI_OnLoad_attach046Agent00(JavaVM *jvm, char *options, void *reserved) {
86 return JNI_VERSION_1_8;
87 }
88 #endif
89
90 JNIEXPORT jint JNICALL
91 #ifdef STATIC_BUILD
92 Agent_OnAttach_attach046Agent00(JavaVM *vm, char *optionsString, void *reserved)
93 #else
94 Agent_OnAttach(JavaVM *vm, char *optionsString, void *reserved)
95 #endif
96 {
97 jvmtiEventCallbacks eventCallbacks;
98 jvmtiCapabilities caps;
99 jvmtiEnv* jvmti = NULL;
100 JNIEnv* jni = NULL;
101 Options* options;
102 const char* agentName;
103
104 options = (Options*) nsk_aod_createOptions(optionsString);
105 if (!NSK_VERIFY(options != NULL))
106 return JNI_ERR;
107
108 agentName = nsk_aod_getOptionValue(options, NSK_AOD_AGENT_NAME_OPTION);
109
110 jni = (JNIEnv*) nsk_aod_createJNIEnv(vm);
111 if (jni == NULL)
112 return NSK_FALSE;
113
114 jvmti = nsk_jvmti_createJVMTIEnv(vm, reserved);
115 if (!NSK_VERIFY(jvmti != NULL))
116 return JNI_ERR;
117
118 memset(&caps, 0, sizeof(caps));
119 caps.can_redefine_classes = 1;
120 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps))) {
121 return JNI_ERR;
122 }
123
124 memset(&eventCallbacks,0, sizeof(eventCallbacks));
125 eventCallbacks.ClassLoad = classLoadHandler;
126 if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&eventCallbacks, sizeof(eventCallbacks)))) {
127 return JNI_ERR;
128 }
129
130 if (!(nsk_jvmti_aod_enableEvent(jvmti, JVMTI_EVENT_CLASS_LOAD))) {
131 return JNI_ERR;
132 }
133
134 if (!NSK_VERIFY(nsk_jvmti_aod_addMultiagentsOptions(jvmti, options))) {
135 return JNI_ERR;
|