80 if (read_bytes != classDef.class_byte_count) {
81 NSK_COMPLAIN0("error reading file\n");
82 return NSK_FALSE;
83 }
84
85 return NSK_TRUE;
86 }
87
88 /* ============================================================================= */
89
90 /** Agent algorithm. */
91 static void JNICALL
92 agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
93
94 /*Wait for debuggee to set classes to be redefined nsk_jvmti_waitForSync#4*/
95 NSK_DISPLAY0("Wait for debuggee to set classes to be redefined nsk_jvmti_waitForSync#4\n");
96 if (!nsk_jvmti_waitForSync(timeout))
97 return;
98
99 NSK_DISPLAY1("Find class: %s\n", TESTED_CLASS_NAME);
100 if (!NSK_JNI_VERIFY(jni, (classDef.klass = jni->FindClass(TESTED_CLASS_NAME)) != NULL)) {
101 nsk_jvmti_setFailStatus();
102 return;
103 }
104
105 if (!NSK_JNI_VERIFY(jni, (classDef.klass = (jclass)
106 jni->NewGlobalRef(classDef.klass)) != NULL)) {
107 nsk_jvmti_setFailStatus();
108 return;
109 }
110
111 NSK_DISPLAY0("Redfine class with new byte code\n");
112 NSK_DISPLAY3("class definition:\n\t0x%p, 0x%p:%d\n",
113 classDef.klass,
114 classDef.class_bytes,
115 classDef.class_byte_count);
116 if (nsk_getVerboseMode()) {
117 nsk_printHexBytes(" ", 16, classDef.class_byte_count,
118 classDef.class_bytes);
119 }
120 if (!NSK_JVMTI_VERIFY(jvmti->RedefineClasses(1, &classDef))) {
121 nsk_jvmti_setFailStatus();
122 return;
123 }
124
125 jni->DeleteGlobalRef(classDef.klass);
126
133 /** Agent library initialization. */
134 #ifdef STATIC_BUILD
135 JNIEXPORT jint JNICALL Agent_OnLoad_bi04t002(JavaVM *jvm, char *options, void *reserved) {
136 return Agent_Initialize(jvm, options, reserved);
137 }
138 JNIEXPORT jint JNICALL Agent_OnAttach_bi04t002(JavaVM *jvm, char *options, void *reserved) {
139 return Agent_Initialize(jvm, options, reserved);
140 }
141 JNIEXPORT jint JNI_OnLoad_bi04t002(JavaVM *jvm, char *options, void *reserved) {
142 return JNI_VERSION_1_8;
143 }
144 #endif
145 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
146 jvmtiEnv *jvmti = NULL;
147
148 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
149 return JNI_ERR;
150
151 timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
152
153 if (!NSK_VERIFY((jvmti = nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))
154 return JNI_ERR;
155
156 {
157 jvmtiCapabilities caps;
158 memset(&caps, 0, sizeof(caps));
159
160 caps.can_redefine_classes = 1;
161 caps.can_redefine_any_class = 1;
162 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps)))
163 return JNI_ERR;
164 }
165
166 if (!NSK_VERIFY(readNewBytecode(jvmti)))
167 return JNI_ERR;
168
169 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))
170 return JNI_ERR;
171
172 return JNI_OK;
173 }
|
80 if (read_bytes != classDef.class_byte_count) {
81 NSK_COMPLAIN0("error reading file\n");
82 return NSK_FALSE;
83 }
84
85 return NSK_TRUE;
86 }
87
88 /* ============================================================================= */
89
90 /** Agent algorithm. */
91 static void JNICALL
92 agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
93
94 /*Wait for debuggee to set classes to be redefined nsk_jvmti_waitForSync#4*/
95 NSK_DISPLAY0("Wait for debuggee to set classes to be redefined nsk_jvmti_waitForSync#4\n");
96 if (!nsk_jvmti_waitForSync(timeout))
97 return;
98
99 NSK_DISPLAY1("Find class: %s\n", TESTED_CLASS_NAME);
100 classDef.klass = jni->FindClass(TESTED_CLASS_NAME);
101 if (!NSK_JNI_VERIFY(jni, classDef.klass != NULL)) {
102 nsk_jvmti_setFailStatus();
103 return;
104 }
105
106 classDef.klass = (jclass) jni->NewGlobalRef(classDef.klass);
107 if (!NSK_JNI_VERIFY(jni, classDef.klass != NULL)) {
108 nsk_jvmti_setFailStatus();
109 return;
110 }
111
112 NSK_DISPLAY0("Redfine class with new byte code\n");
113 NSK_DISPLAY3("class definition:\n\t0x%p, 0x%p:%d\n",
114 classDef.klass,
115 classDef.class_bytes,
116 classDef.class_byte_count);
117 if (nsk_getVerboseMode()) {
118 nsk_printHexBytes(" ", 16, classDef.class_byte_count,
119 classDef.class_bytes);
120 }
121 if (!NSK_JVMTI_VERIFY(jvmti->RedefineClasses(1, &classDef))) {
122 nsk_jvmti_setFailStatus();
123 return;
124 }
125
126 jni->DeleteGlobalRef(classDef.klass);
127
134 /** Agent library initialization. */
135 #ifdef STATIC_BUILD
136 JNIEXPORT jint JNICALL Agent_OnLoad_bi04t002(JavaVM *jvm, char *options, void *reserved) {
137 return Agent_Initialize(jvm, options, reserved);
138 }
139 JNIEXPORT jint JNICALL Agent_OnAttach_bi04t002(JavaVM *jvm, char *options, void *reserved) {
140 return Agent_Initialize(jvm, options, reserved);
141 }
142 JNIEXPORT jint JNI_OnLoad_bi04t002(JavaVM *jvm, char *options, void *reserved) {
143 return JNI_VERSION_1_8;
144 }
145 #endif
146 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
147 jvmtiEnv *jvmti = NULL;
148
149 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
150 return JNI_ERR;
151
152 timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
153
154 jvmti = nsk_jvmti_createJVMTIEnv(jvm, reserved);
155 if (!NSK_VERIFY(jvmti != NULL))
156 return JNI_ERR;
157
158 {
159 jvmtiCapabilities caps;
160 memset(&caps, 0, sizeof(caps));
161
162 caps.can_redefine_classes = 1;
163 caps.can_redefine_any_class = 1;
164 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps)))
165 return JNI_ERR;
166 }
167
168 if (!NSK_VERIFY(readNewBytecode(jvmti)))
169 return JNI_ERR;
170
171 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))
172 return JNI_ERR;
173
174 return JNI_OK;
175 }
|