@@ -74,6 +74,7 @@ static volatile int eventsEnd = 0;
74
74
/* testcase(s) */
75
75
static int prepare ();
76
76
static int checkThreads (const char * kind);
77
+ static int waitSuspended (const char * kind);
77
78
static int resumeThreads (const char * kind);
78
79
static int clean ();
79
80
@@ -125,14 +126,19 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* agentJNI, void* arg) {
125
126
nsk_jvmti_setFailStatus ();
126
127
}
127
128
128
- /* check if all threads suspended on THREAD_START events */
129
+ /* check if all THREAD_START events are generated */
129
130
if (eventsStart != THREADS_COUNT) {
130
131
NSK_COMPLAIN2 (" Unexpected number of THREAD_START events:\n "
131
132
" # received: %d\n "
132
133
" # expected: %d\n " ,
133
134
eventsStart, THREADS_COUNT);
134
135
}
135
136
137
+ /* wait until all threads are suspended */
138
+ if (!NSK_VERIFY(waitSuspended (" starting" ))) {
139
+ return ;
140
+ }
141
+
136
142
NSK_DISPLAY0 (" Testcase #1: check threads on THREAD_START\n " );
137
143
if (!NSK_VERIFY(checkThreads (" starting" )))
138
144
return ;
@@ -175,14 +181,19 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* agentJNI, void* arg) {
175
181
nsk_jvmti_setFailStatus ();
176
182
}
177
183
178
- /* check ia all threads suspended on THREAD_END event */
184
+ /* check if all THREAD_END event are generated */
179
185
if (eventsEnd != THREADS_COUNT) {
180
186
NSK_COMPLAIN2 (" Unexpected number of THREAD_END events:\n "
181
187
" # received: %d\n "
182
188
" # expected: %d\n " ,
183
189
eventsEnd, THREADS_COUNT);
184
190
}
185
191
192
+ /* wait until all threads are suspended */
193
+ if (!NSK_VERIFY(waitSuspended (" finishing" ))) {
194
+ return ;
195
+ }
196
+
186
197
NSK_DISPLAY0 (" Testcase #2: check threads on THREAD_END\n " );
187
198
if (!NSK_VERIFY(checkThreads (" finishing" )))
188
199
return ;
@@ -210,6 +221,31 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* agentJNI, void* arg) {
210
221
211
222
/* ============================================================================= */
212
223
224
+ static int waitSuspended (const char * kind) {
225
+ NSK_DISPLAY1 (" Wait for %s threads to be suspended\n " , kind);
226
+ for (int i = 0 ; i < THREADS_COUNT; i++) {
227
+ for (int j = 0 ; j * TIMEOUT_DELTA < timeout; j++) {
228
+ jint state = 0 ;
229
+ if (!NSK_JVMTI_VERIFY(jvmti->GetThreadState (threadsList[i], &state))) {
230
+ nsk_jvmti_setFailStatus ();
231
+ break ;
232
+ }
233
+ if ((state & JVMTI_THREAD_STATE_ALIVE) == 0 ) {
234
+ NSK_COMPLAIN3 (" %s thread %s is not alive: %x\n " , kind, threadsName[i], (int )state);
235
+ nsk_jvmti_setFailStatus ();
236
+ break ;
237
+ }
238
+ if ((state & JVMTI_THREAD_STATE_SUSPENDED) != 0 ) {
239
+ NSK_DISPLAY2 (" OK: %s thread %s is suspended\n " , kind, threadsName[i]);
240
+ break ;
241
+ }
242
+ NSK_DISPLAY2 (" %s thread %s is not suspended, waiting\n " , kind, threadsName[i]);
243
+ nsk_jvmti_sleep (TIMEOUT_DELTA);
244
+ }
245
+ }
246
+ return NSK_TRUE; // continue execution
247
+ }
248
+
213
249
/* *
214
250
* Resume all threads in given state.
215
251
*/
0 commit comments