1
1
/*
2
- * Copyright (c) 2004, 2018 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2004, 2019 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
@@ -39,177 +39,87 @@ static jvmtiEnv *jvmti = NULL;
39
39
static jvmtiCapabilities caps;
40
40
static jvmtiEventCallbacks callbacks;
41
41
static jrawMonitorID access_lock;
42
+ static jrawMonitorID wait_lock;
42
43
static jint result = PASSED;
43
- static jboolean printdump = JNI_FALSE;
44
44
static jthread thr_ptr = NULL ;
45
+
45
46
static jint state[] = {
46
47
JVMTI_THREAD_STATE_RUNNABLE,
47
48
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER,
48
49
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
49
50
};
50
51
51
- static int entry_count = 0 ;
52
- static int entry_error_count = 0 ;
53
- static int exit_count = 0 ;
54
- static int exit_error_count = 0 ;
55
-
56
- void JNICALL VMInit (jvmtiEnv *jvmti_env, JNIEnv *env, jthread thr) {
57
- jvmtiError err;
58
-
59
- err = jvmti_env->SetEventNotificationMode (JVMTI_ENABLE,
60
- JVMTI_EVENT_THREAD_START, NULL );
52
+ static void
53
+ lock (const char * func_name, jrawMonitorID lock) {
54
+ jvmtiError err = jvmti->RawMonitorEnter (lock);
61
55
if (err != JVMTI_ERROR_NONE) {
62
- printf (" Failed to enable THREAD_START event : %s (%d)\n " ,
63
- TranslateError (err), err);
56
+ printf (" %s: unexpected error in RawMonitorEnter : %s (%d)\n " ,
57
+ func_name, TranslateError (err), err);
64
58
result = STATUS_FAILED;
65
59
}
66
-
67
- if (caps.can_generate_method_entry_events ) {
68
- err = jvmti_env->SetEventNotificationMode (JVMTI_ENABLE,
69
- JVMTI_EVENT_METHOD_ENTRY, NULL );
70
- if (err != JVMTI_ERROR_NONE) {
71
- printf (" Failed to enable METHOD_ENTRY event: %s (%d)\n " ,
72
- TranslateError (err), err);
73
- result = STATUS_FAILED;
74
- }
75
- }
76
-
77
- if (caps.can_generate_method_exit_events ) {
78
- err = jvmti_env->SetEventNotificationMode (JVMTI_ENABLE,
79
- JVMTI_EVENT_METHOD_EXIT, NULL );
80
- if (err != JVMTI_ERROR_NONE) {
81
- printf (" Failed to enable METHOD_EXIT event: %s (%d)\n " ,
82
- TranslateError (err), err);
83
- result = STATUS_FAILED;
84
- }
85
- }
86
60
}
87
61
88
- void JNICALL
89
- ThreadStart (jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread) {
90
- jvmtiError err;
91
- jvmtiThreadInfo thrInfo;
92
-
93
- err = jvmti_env->RawMonitorEnter (access_lock);
94
- if (err != JVMTI_ERROR_NONE) {
95
- printf (" (RawMonitorEnter#TS) unexpected error: %s (%d)\n " ,
96
- TranslateError (err), err);
97
- result = STATUS_FAILED;
98
- }
99
-
100
- err = jvmti_env->GetThreadInfo (thread, &thrInfo);
101
- if (err != JVMTI_ERROR_NONE) {
102
- printf (" (GetThreadInfo#TS) unexpected error: %s (%d)\n " ,
103
- TranslateError (err), err);
104
- result = STATUS_FAILED;
105
- }
106
- if (thrInfo.name != NULL && strcmp (thrInfo.name , " thr1" ) == 0 ) {
107
- thr_ptr = env->NewGlobalRef (thread);
108
- if (printdump == JNI_TRUE) {
109
- printf (" >>> ThreadStart: \" %s\" , 0x%p\n " , thrInfo.name , thr_ptr);
110
- }
111
- }
112
-
113
- err = jvmti_env->RawMonitorExit (access_lock);
62
+ static void
63
+ unlock (const char * func_name, jrawMonitorID lock) {
64
+ jvmtiError err = jvmti->RawMonitorExit (lock);
114
65
if (err != JVMTI_ERROR_NONE) {
115
- printf (" (RawMonitorExit#TS) unexpected error: %s (%d)\n " ,
116
- TranslateError (err), err);
66
+ printf (" %s: unexpected error in RawMonitorExit : %s (%d)\n " ,
67
+ func_name, TranslateError (err), err);
117
68
result = STATUS_FAILED;
118
69
}
119
70
}
120
71
121
- void JNICALL MethodEntry (jvmtiEnv *jvmti_env, JNIEnv *env,
122
- jthread thread, jmethodID mid) {
123
- jvmtiError err;
124
- jvmtiThreadInfo thrInfo;
125
- jint thrState;
126
-
127
- err = jvmti_env->RawMonitorEnter (access_lock);
72
+ static void
73
+ wait (const char * func_name, jrawMonitorID lock, jint millis) {
74
+ jvmtiError err = jvmti->RawMonitorWait (lock, (jlong)millis);
128
75
if (err != JVMTI_ERROR_NONE) {
129
- printf (" (RawMonitorEnter#ME) unexpected error: %s (%d)\n " ,
130
- TranslateError (err), err);
76
+ printf (" %s: unexpected error in RawMonitorWait : %s (%d)\n " ,
77
+ func_name, TranslateError (err), err);
131
78
result = STATUS_FAILED;
132
79
}
80
+ }
133
81
134
- entry_count++;
135
- err = jvmti_env->GetThreadState (thread, &thrState);
136
- if (err != JVMTI_ERROR_NONE) {
137
- printf (" (GetThreadState#ME) unexpected error: %s (%d)\n " ,
138
- TranslateError (err), err);
139
- result = STATUS_FAILED;
140
- }
141
- if ((thrState & JVMTI_THREAD_STATE_RUNNABLE) == 0 ) {
142
- if (entry_error_count == 0 ) {
143
- err = jvmti_env->GetThreadInfo (thread, &thrInfo);
144
- if (err != JVMTI_ERROR_NONE) {
145
- printf (" (GetThreadInfo#ME) unexpected error: %s (%d)\n " ,
146
- TranslateError (err), err);
147
- result = STATUS_FAILED;
148
- }
149
- printf (" Wrong thread \" %s\" state on MethodEntry event:\n " ,
150
- thrInfo.name );
151
- printf (" expected: JVMTI_THREAD_STATE_RUNNABLE\n " );
152
- printf (" got: %s (%d)\n " ,
153
- TranslateState (thrState), thrState);
154
- }
155
- entry_error_count++;
156
- result = STATUS_FAILED;
157
- }
82
+ static void
83
+ set_notification_mode (const char * event_name,
84
+ jvmtiEventMode mode,
85
+ jvmtiEvent event_type,
86
+ jthread event_thread) {
87
+ const char * action = (mode == JVMTI_ENABLE) ? " enable" : " disable" ;
88
+ jvmtiError err = jvmti->SetEventNotificationMode (mode, event_type, event_thread);
158
89
159
- err = jvmti_env->RawMonitorExit (access_lock);
160
90
if (err != JVMTI_ERROR_NONE) {
161
- printf (" (RawMonitorExit#ME) unexpected error : %s (%d)\n " ,
162
- TranslateError (err), err);
91
+ printf (" Failed to %s %s event : %s (%d)\n " ,
92
+ action, event_name, TranslateError (err), err);
163
93
result = STATUS_FAILED;
164
94
}
95
+ }
165
96
97
+ void JNICALL VMInit (jvmtiEnv *jvmti_env, JNIEnv *env, jthread thr) {
98
+ set_notification_mode (" JVMTI_EVENT_THREAD_START" , JVMTI_ENABLE,
99
+ JVMTI_EVENT_THREAD_START, NULL );
166
100
}
167
101
168
- void JNICALL MethodExit (jvmtiEnv *jvmti_env, JNIEnv *env,
169
- jthread thread, jmethodID mid,
170
- jboolean was_poped_by_exception, jvalue return_value) {
102
+ void JNICALL
103
+ ThreadStart (jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread) {
171
104
jvmtiError err;
172
105
jvmtiThreadInfo thrInfo;
173
- jint thrState;
174
106
175
- err = jvmti_env->RawMonitorEnter (access_lock);
176
- if (err != JVMTI_ERROR_NONE) {
177
- printf (" (RawMonitorEnter#MX) unexpected error: %s (%d)\n " ,
178
- TranslateError (err), err);
179
- result = STATUS_FAILED;
180
- }
107
+ lock (" ThreadStart" , access_lock);
181
108
182
- exit_count++;
183
- err = jvmti_env->GetThreadState (thread, &thrState);
109
+ err = jvmti_env->GetThreadInfo (thread, &thrInfo);
184
110
if (err != JVMTI_ERROR_NONE) {
185
- printf (" (GetThreadState#MX ) unexpected error: %s (%d)\n " ,
186
- TranslateError (err), err);
111
+ printf (" (GetThreadInfo#TS ) unexpected error: %s (%d)\n " ,
112
+ TranslateError (err), err);
187
113
result = STATUS_FAILED;
188
114
}
189
- if ((thrState & JVMTI_THREAD_STATE_RUNNABLE) == 0 ) {
190
- if (exit_error_count == 0 ) {
191
- err = jvmti_env->GetThreadInfo (thread, &thrInfo);
192
- if (err != JVMTI_ERROR_NONE) {
193
- printf (" (GetThreadInfo#MX) unexpected error: %s (%d)\n " ,
194
- TranslateError (err), err);
195
- result = STATUS_FAILED;
196
- }
197
- printf (" Wrong thread \" %s\" state on MethodExit event:\n " ,
198
- thrInfo.name );
199
- printf (" expected: JVMTI_THREAD_STATE_RUNNABLE\n " );
200
- printf (" got: %s (%d)\n " ,
201
- TranslateState (thrState), thrState);
202
- }
203
- exit_error_count++;
204
- result = STATUS_FAILED;
115
+ if (thrInfo.name != NULL && strcmp (thrInfo.name , " thr1" ) == 0 ) {
116
+ thr_ptr = env->NewGlobalRef (thread);
117
+ printf (" >>> ThreadStart: \" %s\" , 0x%p\n " , thrInfo.name , thr_ptr);
118
+ set_notification_mode (" JVMTI_EVENT_THREAD_START" , JVMTI_DISABLE,
119
+ JVMTI_EVENT_THREAD_START, NULL );
205
120
}
206
121
207
- err = jvmti_env->RawMonitorExit (access_lock);
208
- if (err != JVMTI_ERROR_NONE) {
209
- printf (" (RawMonitorExit#MX) unexpected error: %s (%d)\n " ,
210
- TranslateError (err), err);
211
- result = STATUS_FAILED;
212
- }
122
+ unlock (" ThreadStart" , access_lock);
213
123
}
214
124
215
125
#ifdef STATIC_BUILD
@@ -223,13 +133,12 @@ JNIEXPORT jint JNI_OnLoad_thrstat001(JavaVM *jvm, char *options, void *reserved)
223
133
return JNI_VERSION_1_8;
224
134
}
225
135
#endif
136
+
226
137
jint Agent_Initialize (JavaVM *jvm, char *options, void *reserved) {
227
138
jint res;
228
139
jvmtiError err;
229
140
230
- if (options != NULL && strcmp (options, " printdump" ) == 0 ) {
231
- printdump = JNI_TRUE;
232
- }
141
+ printf (" Agent_Initialize started\n " );
233
142
234
143
res = jvm->GetEnv ((void **) &jvmti, JVMTI_VERSION_1_1);
235
144
if (res != JNI_OK || jvmti == NULL ) {
@@ -260,49 +169,42 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
260
169
261
170
err = jvmti->CreateRawMonitor (" _access_lock" , &access_lock);
262
171
if (err != JVMTI_ERROR_NONE) {
263
- printf (" (CreateRawMonitor) unexpected error: %s (%d)\n " ,
172
+ printf (" (CreateRawMonitor)#access_lock unexpected error: %s (%d)\n " ,
173
+ TranslateError (err), err);
174
+ return JNI_ERR;
175
+ }
176
+
177
+ err = jvmti->CreateRawMonitor (" _wait_lock" , &wait_lock);
178
+ if (err != JVMTI_ERROR_NONE) {
179
+ printf (" (CreateRawMonitor#wait_lock) unexpected error: %s (%d)\n " ,
264
180
TranslateError (err), err);
265
181
return JNI_ERR;
266
182
}
267
183
268
184
callbacks.VMInit = &VMInit;
269
185
callbacks.ThreadStart = &ThreadStart;
270
- if (caps.can_generate_method_entry_events ) {
271
- callbacks.MethodEntry = &MethodEntry;
272
- } else {
273
- printf (" Warning: MethodEntry event is not implemented\n " );
274
- }
275
- if (caps.can_generate_method_exit_events ) {
276
- callbacks.MethodExit = &MethodExit;
277
- } else {
278
- printf (" Warning: MethodExit event is not implemented\n " );
279
- }
280
186
err = jvmti->SetEventCallbacks (&callbacks, sizeof (callbacks));
281
187
if (err != JVMTI_ERROR_NONE) {
282
188
printf (" (SetEventCallbacks) unexpected error: %s (%d)\n " ,
283
189
TranslateError (err), err);
284
190
return JNI_ERR;
285
191
}
286
192
287
- err = jvmti->SetEventNotificationMode (JVMTI_ENABLE,
288
- JVMTI_EVENT_VM_INIT, NULL );
289
- if (err != JVMTI_ERROR_NONE) {
290
- printf (" Failed to enable VM_INIT event: %s (%d)\n " ,
291
- TranslateError (err), err);
292
- result = STATUS_FAILED;
293
- }
193
+ set_notification_mode (" JVMTI_EVENT_VM_INIT" , JVMTI_ENABLE,
194
+ JVMTI_EVENT_VM_INIT, NULL );
294
195
196
+ printf (" Agent_Initialize finished\n\n " );
295
197
return JNI_OK;
296
198
}
297
199
298
200
JNIEXPORT void JNICALL
299
201
Java_nsk_jvmti_GetThreadState_thrstat001_checkStatus (JNIEnv *env,
300
202
jclass cls, jint statInd) {
301
203
jvmtiError err;
302
- jrawMonitorID wait_lock;
303
204
jint thrState;
304
205
jint millis;
305
206
207
+ printf (" native method checkStatus started\n " );
306
208
if (jvmti == NULL ) {
307
209
printf (" JVMTI client was not properly loaded!\n " );
308
210
result = STATUS_FAILED;
@@ -316,12 +218,6 @@ Java_nsk_jvmti_GetThreadState_thrstat001_checkStatus(JNIEnv *env,
316
218
}
317
219
318
220
/* wait until thread gets an expected state */
319
- err = jvmti->CreateRawMonitor (" _wait_lock" , &wait_lock);
320
- if (err != JVMTI_ERROR_NONE) {
321
- printf (" (CreateRawMonitor) unexpected error: %s (%d)\n " ,
322
- TranslateError (err), err);
323
- result = STATUS_FAILED;
324
- }
325
221
for (millis = WAIT_START; millis < WAIT_TIME; millis <<= 1 ) {
326
222
err = jvmti->GetThreadState (thr_ptr, &thrState);
327
223
if (err != JVMTI_ERROR_NONE) {
@@ -332,36 +228,13 @@ Java_nsk_jvmti_GetThreadState_thrstat001_checkStatus(JNIEnv *env,
332
228
if ((thrState & state[statInd]) != 0 ) {
333
229
break ;
334
230
}
335
- err = jvmti->RawMonitorEnter (wait_lock);
336
- if (err != JVMTI_ERROR_NONE) {
337
- printf (" (RawMonitorEnter) unexpected error: %s (%d)\n " ,
338
- TranslateError (err), err);
339
- result = STATUS_FAILED;
340
- }
341
- err = jvmti->RawMonitorWait (wait_lock, (jlong)millis);
342
- if (err != JVMTI_ERROR_NONE) {
343
- printf (" (RawMonitorWait) unexpected error: %s (%d)\n " ,
344
- TranslateError (err), err);
345
- result = STATUS_FAILED;
346
- }
347
- err = jvmti->RawMonitorExit (wait_lock);
348
- if (err != JVMTI_ERROR_NONE) {
349
- printf (" (RawMonitorExit) unexpected error: %s (%d)\n " ,
350
- TranslateError (err), err);
351
- result = STATUS_FAILED;
352
- }
353
- }
354
- err = jvmti->DestroyRawMonitor (wait_lock);
355
- if (err != JVMTI_ERROR_NONE) {
356
- printf (" (DestroyRawMonitor) unexpected error: %s (%d)\n " ,
357
- TranslateError (err), err);
358
- result = STATUS_FAILED;
231
+ lock (" checkStatus" , wait_lock);
232
+ wait (" checkStatus" , wait_lock, millis);
233
+ unlock (" checkStatus" , wait_lock);
359
234
}
360
235
361
- if (printdump == JNI_TRUE) {
362
- printf (" >>> thread \" thr1\" (0x%p) state: %s (%d)\n " ,
236
+ printf (" >>> thread \" thr1\" (0x%p) state: %s (%d)\n " ,
363
237
thr_ptr, TranslateState (thrState), thrState);
364
- }
365
238
366
239
if ((thrState & state[statInd]) == 0 ) {
367
240
printf (" Wrong thread \" thr1\" (0x%p) state:\n " , thr_ptr);
@@ -371,55 +244,12 @@ Java_nsk_jvmti_GetThreadState_thrstat001_checkStatus(JNIEnv *env,
371
244
TranslateState (thrState), thrState);
372
245
result = STATUS_FAILED;
373
246
}
247
+ printf (" native method checkStatus finished\n\n " );
374
248
}
375
249
376
250
JNIEXPORT jint JNICALL
377
251
Java_nsk_jvmti_GetThreadState_thrstat001_getRes (JNIEnv *env, jclass cls) {
378
- jvmtiError err;
379
-
380
- err = jvmti->SetEventNotificationMode (JVMTI_DISABLE,
381
- JVMTI_EVENT_THREAD_START, NULL );
382
- if (err != JVMTI_ERROR_NONE) {
383
- printf (" Failed to disable THREAD_START event: %s (%d)\n " ,
384
- TranslateError (err), err);
385
- result = STATUS_FAILED;
386
- }
387
-
388
- if (caps.can_generate_method_entry_events ) {
389
- err = jvmti->SetEventNotificationMode (JVMTI_DISABLE,
390
- JVMTI_EVENT_METHOD_ENTRY, NULL );
391
- if (err != JVMTI_ERROR_NONE) {
392
- printf (" Failed to disable METHOD_ENTRY event: %s (%d)\n " ,
393
- TranslateError (err), err);
394
- result = STATUS_FAILED;
395
- }
396
- }
397
-
398
- if (caps.can_generate_method_exit_events ) {
399
- err = jvmti->SetEventNotificationMode (JVMTI_DISABLE,
400
- JVMTI_EVENT_METHOD_EXIT, NULL );
401
- if (err != JVMTI_ERROR_NONE) {
402
- printf (" Failed to disable METHOD_EXIT event: %s (%d)\n " ,
403
- TranslateError (err), err);
404
- result = STATUS_FAILED;
405
- }
406
- }
407
-
408
- if (printdump == JNI_TRUE) {
409
- printf (" >>> total number of method entry events = %d\n " , entry_count);
410
- printf (" >>> total number of method exit events = %d\n " , exit_count);
411
- }
412
-
413
- if (entry_error_count != 0 ) {
414
- printf (" Total number of errors on METHOD_ENTRY: %d of %d events\n " ,
415
- entry_error_count, entry_count);
416
- }
417
-
418
- if (exit_error_count != 0 ) {
419
- printf (" Total number of errors on METHOD_EXIT: %d of %d events\n " ,
420
- exit_error_count, exit_count);
421
- }
422
-
252
+ printf (" native method getRes: result: %d\n\n " , result);
423
253
return result;
424
254
}
425
255
0 commit comments