129 void* user_data)
130 {
131 printf("stringPrimitiveValueCallback: class_tag=%-3ld, tag=%-3ld, len=%d\n",
132 (long) class_tag,
133 (long) DEREF(tag_ptr),
134 (int ) value_length);
135 fflush(0);
136
137 markTagVisited(DEREF(tag_ptr));
138
139 return JVMTI_VISIT_OBJECTS;
140
141 } /* stringPrimitiveValueCallback */
142
143 /* ============================================================================= */
144
145 static void createGlobalRefs(JNIEnv * jni)
146 {
147 jclass klass;
148
149 if ( ! NSK_JNI_VERIFY(jni, (klass = NSK_CPP_STUB2(FindClass, jni, JAVA_LANG_STRING_CLASS_NAME)) != NULL) ) {
150 nsk_jvmti_setFailStatus();
151 return;
152 }
153
154 if ( ! NSK_JNI_VERIFY(jni, (g_jniGlobalRef = NSK_CPP_STUB2(NewGlobalRef, jni, klass)) != NULL) ) {
155 nsk_jvmti_setFailStatus();
156 }
157
158 if ( ! NSK_JNI_VERIFY(jni, (g_jniWeakGlobalRef = NSK_CPP_STUB2(NewWeakGlobalRef, jni, klass)) != NULL) ) {
159 nsk_jvmti_setFailStatus();
160 }
161
162 } /* createGlobalRefs */
163
164 /** Agent algorithm. */
165
166 static void JNICALL agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg)
167 {
168 jvmtiError retCode;
169
170 printf(">>> Sync with Java code\n");
171 fflush(0);
172
173 if (!NSK_VERIFY(nsk_jvmti_waitForSync(g_timeout))) {
174 return;
175 }
176
177 printf(">>> Create JNI global references\n");
178 fflush(0);
179
180 createGlobalRefs(jni);
181
182 retCode = NSK_CPP_STUB6(FollowReferences,
183 jvmti,
184 (jint) 0, /* heap filter */
185 NULL, /* class */
186 NULL, /* inital object */
187 &g_heapCallbacks,
188 (const void *) &g_fakeUserData);
189
190 if ( ! NSK_VERIFY(retCode == JVMTI_ERROR_NONE) ) {
191 nsk_jvmti_setFailStatus();
192 }
193
194 checkThatAllTagsVisited();
195
196 printf(">>> Let debugee to finish\n");
197 fflush(0);
198
199 if (!NSK_VERIFY(nsk_jvmti_resumeSync())) {
200 return;
201 }
202
203 } /* agentProc */
204
230
231 if (!NSK_VERIFY((jvmti = nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL)) {
232 return JNI_ERR;
233 }
234
235 /* Setting Heap Callbacks */
236 memset(&g_heapCallbacks, 0, sizeof(g_heapCallbacks));
237 g_heapCallbacks.heap_iteration_callback = NULL;
238 g_heapCallbacks.heap_reference_callback = heapReferenceCallback;
239 g_heapCallbacks.primitive_field_callback = primitiveFieldCallback;
240 g_heapCallbacks.array_primitive_value_callback = arrayPrimitiveValueCallback;
241 g_heapCallbacks.string_primitive_value_callback = stringPrimitiveValueCallback;
242
243 jvmti_FollowRefObject_init();
244
245 {
246 jvmtiCapabilities caps;
247
248 memset(&caps, 0, sizeof(caps));
249 caps.can_tag_objects = 1;
250 if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB2(AddCapabilities, jvmti, &caps))) {
251 return JNI_ERR;
252 }
253 }
254
255 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL))) {
256 return JNI_ERR;
257 }
258
259 return JNI_OK;
260
261 } /* Agent_OnLoad */
262
263
264 /* ============================================================================= */
265
266 }
|
129 void* user_data)
130 {
131 printf("stringPrimitiveValueCallback: class_tag=%-3ld, tag=%-3ld, len=%d\n",
132 (long) class_tag,
133 (long) DEREF(tag_ptr),
134 (int ) value_length);
135 fflush(0);
136
137 markTagVisited(DEREF(tag_ptr));
138
139 return JVMTI_VISIT_OBJECTS;
140
141 } /* stringPrimitiveValueCallback */
142
143 /* ============================================================================= */
144
145 static void createGlobalRefs(JNIEnv * jni)
146 {
147 jclass klass;
148
149 if ( ! NSK_JNI_VERIFY(jni, (klass = jni->FindClass(JAVA_LANG_STRING_CLASS_NAME)) != NULL) ) {
150 nsk_jvmti_setFailStatus();
151 return;
152 }
153
154 if ( ! NSK_JNI_VERIFY(jni, (g_jniGlobalRef = jni->NewGlobalRef(klass)) != NULL) ) {
155 nsk_jvmti_setFailStatus();
156 }
157
158 if ( ! NSK_JNI_VERIFY(jni, (g_jniWeakGlobalRef = jni->NewWeakGlobalRef(klass)) != NULL) ) {
159 nsk_jvmti_setFailStatus();
160 }
161
162 } /* createGlobalRefs */
163
164 /** Agent algorithm. */
165
166 static void JNICALL agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg)
167 {
168 jvmtiError retCode;
169
170 printf(">>> Sync with Java code\n");
171 fflush(0);
172
173 if (!NSK_VERIFY(nsk_jvmti_waitForSync(g_timeout))) {
174 return;
175 }
176
177 printf(">>> Create JNI global references\n");
178 fflush(0);
179
180 createGlobalRefs(jni);
181
182 retCode = jvmti->FollowReferences((jint) 0, /* heap filter */
183 NULL, /* class */
184 NULL, /* inital object */
185 &g_heapCallbacks,
186 (const void *) &g_fakeUserData);
187
188 if ( ! NSK_VERIFY(retCode == JVMTI_ERROR_NONE) ) {
189 nsk_jvmti_setFailStatus();
190 }
191
192 checkThatAllTagsVisited();
193
194 printf(">>> Let debugee to finish\n");
195 fflush(0);
196
197 if (!NSK_VERIFY(nsk_jvmti_resumeSync())) {
198 return;
199 }
200
201 } /* agentProc */
202
228
229 if (!NSK_VERIFY((jvmti = nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL)) {
230 return JNI_ERR;
231 }
232
233 /* Setting Heap Callbacks */
234 memset(&g_heapCallbacks, 0, sizeof(g_heapCallbacks));
235 g_heapCallbacks.heap_iteration_callback = NULL;
236 g_heapCallbacks.heap_reference_callback = heapReferenceCallback;
237 g_heapCallbacks.primitive_field_callback = primitiveFieldCallback;
238 g_heapCallbacks.array_primitive_value_callback = arrayPrimitiveValueCallback;
239 g_heapCallbacks.string_primitive_value_callback = stringPrimitiveValueCallback;
240
241 jvmti_FollowRefObject_init();
242
243 {
244 jvmtiCapabilities caps;
245
246 memset(&caps, 0, sizeof(caps));
247 caps.can_tag_objects = 1;
248 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps))) {
249 return JNI_ERR;
250 }
251 }
252
253 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL))) {
254 return JNI_ERR;
255 }
256
257 return JNI_OK;
258
259 } /* Agent_OnLoad */
260
261
262 /* ============================================================================= */
263
264 }
|