98
99 DBG(printf(">>> Tag %" LL "d has been visited %i times: %s\n", i, g_tagVisitCount[i], g_szTagInfo[i]));
100 }
101 }
102
103 return ok;
104 }
105
106 JNIEXPORT void JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_resetTags(JNIEnv* jni, jclass klass)
107 {
108 memset(g_szTagInfo, 0, sizeof(g_szTagInfo));
109 memset(g_tagFlags, 0, sizeof(g_tagFlags));
110 memset(g_tagVisitCount, 0, sizeof(g_tagVisitCount));
111 }
112
113 JNIEXPORT jboolean JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_setTag(JNIEnv* jni, jclass klass, jobject o, jlong tag, jstring sInfo)
114 {
115 jvmtiEnv * jvmti = nsk_jvmti_getAgentJVMTIEnv();
116 jint hashCode;
117
118 if ( ! NSK_VERIFY(NSK_CPP_STUB3(SetTag, jvmti, o, tag) == JVMTI_ERROR_NONE) ) {
119 NSK_COMPLAIN2("Can't set tag %li for object %lx\n", tag, o);
120 return JNI_FALSE;
121 }
122
123 if ( ! NSK_VERIFY(NSK_CPP_STUB3(GetObjectHashCode, jvmti, o, &hashCode) == JVMTI_ERROR_NONE) ) {
124 NSK_COMPLAIN1("Can't get hash object %lx\n", o);
125 return JNI_FALSE;
126 }
127
128 NSK_DISPLAY2("setTag: %08x <- % 3li", hashCode, tag);
129
130 if ( tag > 0 && tag < MAX_TAG ) {
131 jboolean fCopy;
132 const char * s;
133
134 if ( ! NSK_VERIFY((s = NSK_CPP_STUB3(GetStringUTFChars, jni, sInfo, &fCopy)) != NULL) ) {
135 NSK_COMPLAIN1("Can't get string at %#p\n", sInfo);
136 return JNI_FALSE;
137 }
138
139 if ( ! s ) {
140 NSK_COMPLAIN1("Can't get string at %#p: NULL\n", sInfo);
141 return JNI_FALSE;
142 }
143
144 g_szTagInfo[tag] = strdup(s);
145
146 NSK_CPP_STUB3(ReleaseStringUTFChars, jni, sInfo, s);
147
148 NSK_DISPLAY1(" // %s", g_szTagInfo[tag]);
149
150 }
151
152 markTagSet(tag);
153
154 return JNI_TRUE;
155 }
156
157 JNIEXPORT jlong JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_getTag(JNIEnv* jni, jclass klass, jobject o)
158 {
159 jvmtiEnv * jvmti = nsk_jvmti_getAgentJVMTIEnv();
160
161 jlong tag;
162 jvmtiError r;
163 if ( ! NSK_VERIFY((r = NSK_CPP_STUB3(GetTag, jvmti, o, &tag)) == JVMTI_ERROR_NONE) ) {
164 NSK_COMPLAIN2("Can't GetTag for object %lx. Return code: %i\n", o, r);
165 return -1;
166 }
167
168 return tag;
169 }
170
171 /* ============================================================================= */
172
173 int g_refsToVerifyCnt;
174
175 RefToVerify g_refsToVerify[MAX_REFS];
176
177 /* ============================================================================= */
178
179 JNIEXPORT void JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_resetRefsToVerify(JNIEnv* jni, jclass klass)
180 {
181 g_refsToVerifyCnt = 0;
182 }
183
207 }
208
209 pRefRec = &g_refsToVerify[g_refsToVerifyCnt++];
210
211 pRefRec->_tagFrom = tagFrom;
212 pRefRec->_tagTo = tagTo;
213 pRefRec->_refKind = refKind;
214 pRefRec->_expectedCount = expectedCount;
215 pRefRec->_actualCount = actualCount;
216
217 return JNI_TRUE;
218 }
219
220 JNIEXPORT jboolean JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_addRefToVerify(JNIEnv* jni, jclass klass, jobject from, jobject to, jint refKind, jint count)
221 {
222 jvmtiEnv * jvmti = nsk_jvmti_getAgentJVMTIEnv();
223 jvmtiError r;
224 jlong tagFrom, tagTo;
225 RefToVerify * pRefRec;
226
227 if ( ! NSK_VERIFY((r = NSK_CPP_STUB3(GetTag, jvmti, from, &tagFrom)) == JVMTI_ERROR_NONE) ) {
228 NSK_COMPLAIN2("TEST_BUG: Can't GetTag for object %lx. Return code: %i\n", from, r);
229 nsk_jvmti_setFailStatus();
230 return JNI_FALSE;
231 }
232
233
234 if ( ! NSK_VERIFY((r = NSK_CPP_STUB3(GetTag, jvmti, to, &tagTo)) == JVMTI_ERROR_NONE) ) {
235 NSK_COMPLAIN2("TEST_BUG: Can't GetTag for object %lx. Return code: %i\n", to, r);
236 nsk_jvmti_setFailStatus();
237 return JNI_FALSE;
238 }
239
240 if ( (pRefRec = findRefToVerify(tagFrom, tagTo, refKind)) != NULL ) {
241 pRefRec->_expectedCount += count;
242 return JNI_TRUE;
243 }
244
245 return addRefToVerify(tagFrom, tagTo, refKind, count, 0);
246 }
247
248 jboolean markRefToVerify(jlong tagFrom, jlong tagTo, int refKind)
249 {
250 RefToVerify * pRefRec;
251
252 if ( (pRefRec = findRefToVerify(tagFrom, tagTo, refKind)) != NULL ) {
253 pRefRec->_actualCount++;
254 return JNI_TRUE;
|
98
99 DBG(printf(">>> Tag %" LL "d has been visited %i times: %s\n", i, g_tagVisitCount[i], g_szTagInfo[i]));
100 }
101 }
102
103 return ok;
104 }
105
106 JNIEXPORT void JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_resetTags(JNIEnv* jni, jclass klass)
107 {
108 memset(g_szTagInfo, 0, sizeof(g_szTagInfo));
109 memset(g_tagFlags, 0, sizeof(g_tagFlags));
110 memset(g_tagVisitCount, 0, sizeof(g_tagVisitCount));
111 }
112
113 JNIEXPORT jboolean JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_setTag(JNIEnv* jni, jclass klass, jobject o, jlong tag, jstring sInfo)
114 {
115 jvmtiEnv * jvmti = nsk_jvmti_getAgentJVMTIEnv();
116 jint hashCode;
117
118 if ( ! NSK_VERIFY(jvmti->SetTag(o, tag) == JVMTI_ERROR_NONE) ) {
119 NSK_COMPLAIN2("Can't set tag %li for object %lx\n", tag, o);
120 return JNI_FALSE;
121 }
122
123 if ( ! NSK_VERIFY(jvmti->GetObjectHashCode(o, &hashCode) == JVMTI_ERROR_NONE) ) {
124 NSK_COMPLAIN1("Can't get hash object %lx\n", o);
125 return JNI_FALSE;
126 }
127
128 NSK_DISPLAY2("setTag: %08x <- % 3li", hashCode, tag);
129
130 if ( tag > 0 && tag < MAX_TAG ) {
131 jboolean fCopy;
132 const char * s;
133
134 if ( ! NSK_VERIFY((s = jni->GetStringUTFChars(sInfo, &fCopy)) != NULL) ) {
135 NSK_COMPLAIN1("Can't get string at %#p\n", sInfo);
136 return JNI_FALSE;
137 }
138
139 if ( ! s ) {
140 NSK_COMPLAIN1("Can't get string at %#p: NULL\n", sInfo);
141 return JNI_FALSE;
142 }
143
144 g_szTagInfo[tag] = strdup(s);
145
146 jni->ReleaseStringUTFChars(sInfo, s);
147
148 NSK_DISPLAY1(" // %s", g_szTagInfo[tag]);
149
150 }
151
152 markTagSet(tag);
153
154 return JNI_TRUE;
155 }
156
157 JNIEXPORT jlong JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_getTag(JNIEnv* jni, jclass klass, jobject o)
158 {
159 jvmtiEnv * jvmti = nsk_jvmti_getAgentJVMTIEnv();
160
161 jlong tag;
162 jvmtiError r;
163 if ( ! NSK_VERIFY((r = jvmti->GetTag(o, &tag)) == JVMTI_ERROR_NONE) ) {
164 NSK_COMPLAIN2("Can't GetTag for object %lx. Return code: %i\n", o, r);
165 return -1;
166 }
167
168 return tag;
169 }
170
171 /* ============================================================================= */
172
173 int g_refsToVerifyCnt;
174
175 RefToVerify g_refsToVerify[MAX_REFS];
176
177 /* ============================================================================= */
178
179 JNIEXPORT void JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_resetRefsToVerify(JNIEnv* jni, jclass klass)
180 {
181 g_refsToVerifyCnt = 0;
182 }
183
207 }
208
209 pRefRec = &g_refsToVerify[g_refsToVerifyCnt++];
210
211 pRefRec->_tagFrom = tagFrom;
212 pRefRec->_tagTo = tagTo;
213 pRefRec->_refKind = refKind;
214 pRefRec->_expectedCount = expectedCount;
215 pRefRec->_actualCount = actualCount;
216
217 return JNI_TRUE;
218 }
219
220 JNIEXPORT jboolean JNICALL Java_nsk_jvmti_unit_FollowReferences_FollowRefObjects_addRefToVerify(JNIEnv* jni, jclass klass, jobject from, jobject to, jint refKind, jint count)
221 {
222 jvmtiEnv * jvmti = nsk_jvmti_getAgentJVMTIEnv();
223 jvmtiError r;
224 jlong tagFrom, tagTo;
225 RefToVerify * pRefRec;
226
227 if ( ! NSK_VERIFY((r = jvmti->GetTag(from, &tagFrom)) == JVMTI_ERROR_NONE) ) {
228 NSK_COMPLAIN2("TEST_BUG: Can't GetTag for object %lx. Return code: %i\n", from, r);
229 nsk_jvmti_setFailStatus();
230 return JNI_FALSE;
231 }
232
233
234 if ( ! NSK_VERIFY((r = jvmti->GetTag(to, &tagTo)) == JVMTI_ERROR_NONE) ) {
235 NSK_COMPLAIN2("TEST_BUG: Can't GetTag for object %lx. Return code: %i\n", to, r);
236 nsk_jvmti_setFailStatus();
237 return JNI_FALSE;
238 }
239
240 if ( (pRefRec = findRefToVerify(tagFrom, tagTo, refKind)) != NULL ) {
241 pRefRec->_expectedCount += count;
242 return JNI_TRUE;
243 }
244
245 return addRefToVerify(tagFrom, tagTo, refKind, count, 0);
246 }
247
248 jboolean markRefToVerify(jlong tagFrom, jlong tagTo, int refKind)
249 {
250 RefToVerify * pRefRec;
251
252 if ( (pRefRec = findRefToVerify(tagFrom, tagTo, refKind)) != NULL ) {
253 pRefRec->_actualCount++;
254 return JNI_TRUE;
|