84 #endif
85 fflush(stdout);
86 }
87
88 #ifdef STATIC_BUILD
89 JNIEXPORT jint JNICALL Agent_OnLoad_thrstat005(JavaVM *jvm, char *options, void *reserved) {
90 return Agent_Initialize(jvm, options, reserved);
91 }
92 JNIEXPORT jint JNICALL Agent_OnAttach_thrstat005(JavaVM *jvm, char *options, void *reserved) {
93 return Agent_Initialize(jvm, options, reserved);
94 }
95 JNIEXPORT jint JNI_OnLoad_thrstat005(JavaVM *jvm, char *options, void *reserved) {
96 return JNI_VERSION_1_8;
97 }
98 #endif
99 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
100 jvmtiError error;
101 jint res;
102
103 res = jvm->GetEnv((void **) &g_ppJvmtiEnv, JVMTI_VERSION_1_1);
104 if ( res != JNI_OK || ! g_ppJvmtiEnv ) {
105 printf("Agent_OnLoad: Error: GetEnv returned error or NULL\n");
106 return JNI_ERR;
107 }
108
109 error = g_ppJvmtiEnv->CreateRawMonitor("beast", &g_waitMon);
110 if ( error != JVMTI_ERROR_NONE ) {
111 reportError("Agent_OnLoad: error creating raw monitor", error);
112 return JNI_ERR;
113 }
114
115 return JNI_OK;
116 }
117
118 JNIEXPORT void JNICALL
119 Java_nsk_jvmti_GetThreadState_thrstat005_setWaitTime(JNIEnv * pEnv, jclass klass, jint waitTime) {
120 g_waitTime = waitTime;
121 }
122
123 JNIEXPORT jboolean JNICALL
124 Java_nsk_jvmti_GetThreadState_thrstat005_checkThreadState(JNIEnv * pEnv, jclass klass, jthread thread, jint stateIdx) {
125
126 jint thrState;
127 jint maskedThrState;
128 int waitTime = 10;
129
130 /* Repeat querying status until waitTime < g_waitTime */
131 do {
132 jvmtiError res = g_ppJvmtiEnv->GetThreadState(thread, &thrState);
133 if (res != JVMTI_ERROR_NONE) {
134 reportError("GetThreadState: unexpected error", res);
135 return JNI_FALSE;
136 }
137
138 maskedThrState = thrState & THREAD_STATE_MASK;
139 printf("GetThreadState = %x. Masked: %x. Must be: %x\n", thrState, maskedThrState, g_ThreadState[stateIdx]);
140 fflush(stdout);
141
142 if ( maskedThrState == g_ThreadState[stateIdx] )
143 return JNI_TRUE;
144
145 printf("checkThreadState: wait %d ms\n", waitTime);
146 fflush(stdout);
147 if ( (res = g_ppJvmtiEnv->RawMonitorEnter(g_waitMon)) != JVMTI_ERROR_NONE
148 || (res = g_ppJvmtiEnv->RawMonitorWait(g_waitMon, waitTime)) != JVMTI_ERROR_NONE
149 || (res = g_ppJvmtiEnv->RawMonitorExit(g_waitMon)) != JVMTI_ERROR_NONE ) {
150 reportError("GetThreadState: unexpected error", res);
151 return JNI_FALSE;
152 }
153
154 waitTime <<= 1;
155
156 } while ( waitTime < g_waitTime );
157
158 return JNI_FALSE;
159 }
160
161 }
|
84 #endif
85 fflush(stdout);
86 }
87
88 #ifdef STATIC_BUILD
89 JNIEXPORT jint JNICALL Agent_OnLoad_thrstat005(JavaVM *jvm, char *options, void *reserved) {
90 return Agent_Initialize(jvm, options, reserved);
91 }
92 JNIEXPORT jint JNICALL Agent_OnAttach_thrstat005(JavaVM *jvm, char *options, void *reserved) {
93 return Agent_Initialize(jvm, options, reserved);
94 }
95 JNIEXPORT jint JNI_OnLoad_thrstat005(JavaVM *jvm, char *options, void *reserved) {
96 return JNI_VERSION_1_8;
97 }
98 #endif
99 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
100 jvmtiError error;
101 jint res;
102
103 res = jvm->GetEnv((void **) &g_ppJvmtiEnv, JVMTI_VERSION_1_1);
104 if (res != JNI_OK || !g_ppJvmtiEnv) {
105 printf("Agent_OnLoad: Error: GetEnv returned error or NULL\n");
106 return JNI_ERR;
107 }
108
109 error = g_ppJvmtiEnv->CreateRawMonitor("beast", &g_waitMon);
110 if (error != JVMTI_ERROR_NONE) {
111 reportError("Agent_OnLoad: error creating raw monitor", error);
112 return JNI_ERR;
113 }
114
115 return JNI_OK;
116 }
117
118 JNIEXPORT void JNICALL
119 Java_nsk_jvmti_GetThreadState_thrstat005_setWaitTime(JNIEnv * pEnv, jclass klass, jint waitTime) {
120 g_waitTime = waitTime;
121 }
122
123 JNIEXPORT jboolean JNICALL
124 Java_nsk_jvmti_GetThreadState_thrstat005_checkThreadState(JNIEnv * pEnv, jclass klass, jthread thread, jint stateIdx) {
125
126 jint thrState;
127 jint maskedThrState;
128 int waitTime = 10;
129
130 /* Repeat querying status until waitTime < g_waitTime */
131 do {
132 jvmtiError res = g_ppJvmtiEnv->GetThreadState(thread, &thrState);
133 if (res != JVMTI_ERROR_NONE) {
134 reportError("GetThreadState: unexpected error", res);
135 return JNI_FALSE;
136 }
137
138 maskedThrState = thrState & THREAD_STATE_MASK;
139 printf("GetThreadState = %x. Masked: %x. Must be: %x\n", thrState, maskedThrState, g_ThreadState[stateIdx]);
140 fflush(stdout);
141
142 if (maskedThrState == g_ThreadState[stateIdx])
143 return JNI_TRUE;
144
145 printf("checkThreadState: wait %d ms\n", waitTime);
146 fflush(stdout);
147 if ((res = g_ppJvmtiEnv->RawMonitorEnter(g_waitMon)) != JVMTI_ERROR_NONE
148 || (res = g_ppJvmtiEnv->RawMonitorWait(g_waitMon, waitTime)) != JVMTI_ERROR_NONE
149 || (res = g_ppJvmtiEnv->RawMonitorExit(g_waitMon)) != JVMTI_ERROR_NONE) {
150 reportError("GetThreadState: unexpected error", res);
151 return JNI_FALSE;
152 }
153
154 waitTime <<= 1;
155
156 } while (waitTime < g_waitTime);
157
158 return JNI_FALSE;
159 }
160
161 }
|