35 * Method: criticalNative |
35 * Method: criticalNative |
36 * Signature: ([Z)Z |
36 * Signature: ([Z)Z |
37 */ |
37 */ |
38 JNIEXPORT jdouble JNICALL Java_nsk_share_gc_lock_jni_DoubleArrayCriticalLocker_criticalNative |
38 JNIEXPORT jdouble JNICALL Java_nsk_share_gc_lock_jni_DoubleArrayCriticalLocker_criticalNative |
39 (JNIEnv *jni_env, jobject o, jlong enterTime, jlong sleepTime) { |
39 (JNIEnv *jni_env, jobject o, jlong enterTime, jlong sleepTime) { |
40 ExceptionCheckingJniEnvPtr jni(jni_env); |
40 ExceptionCheckingJniEnvPtr ec_jni(jni_env); |
41 |
41 |
42 jsize size, i; |
42 jsize size, i; |
43 jdoubleArray arr; |
43 jdoubleArray arr; |
44 jdouble *pa; |
44 jdouble *pa; |
45 jdouble hash = 0; |
45 jdouble hash = 0; |
46 time_t start_time, current_time; |
46 time_t start_time, current_time; |
47 |
47 |
48 if (objFieldId == NULL) { |
48 if (objFieldId == NULL) { |
49 jclass klass = jni->GetObjectClass(o, TRACE_JNI_CALL); |
49 jclass klass = ec_jni->GetObjectClass(o, TRACE_JNI_CALL); |
50 objFieldId = jni->GetFieldID(klass, "obj", "Ljava/lang/Object;", TRACE_JNI_CALL); |
50 objFieldId = ec_jni->GetFieldID(klass, "obj", "Ljava/lang/Object;", TRACE_JNI_CALL); |
51 } |
51 } |
52 arr = (jdoubleArray) jni->GetObjectField(o, objFieldId, TRACE_JNI_CALL); |
52 arr = (jdoubleArray) ec_jni->GetObjectField(o, objFieldId, TRACE_JNI_CALL); |
53 jni->SetObjectField(o, objFieldId, NULL, TRACE_JNI_CALL); |
53 ec_jni->SetObjectField(o, objFieldId, NULL, TRACE_JNI_CALL); |
54 |
54 |
55 size = jni->GetArrayLength(arr, TRACE_JNI_CALL); |
55 size = ec_jni->GetArrayLength(arr, TRACE_JNI_CALL); |
56 start_time = time(NULL); |
56 start_time = time(NULL); |
57 enterTime /= 1000; |
57 enterTime /= 1000; |
58 current_time = 0; |
58 current_time = 0; |
59 while (current_time - start_time < enterTime) { |
59 while (current_time - start_time < enterTime) { |
60 pa = (jdouble*) jni->GetPrimitiveArrayCritical(arr, NULL, TRACE_JNI_CALL); |
60 pa = (jdouble*) ec_jni->GetPrimitiveArrayCritical(arr, NULL, TRACE_JNI_CALL); |
61 if (pa != NULL) { |
61 if (pa != NULL) { |
62 for (i = 0; i < size; ++i) |
62 for (i = 0; i < size; ++i) |
63 hash += pa[i]; |
63 hash += pa[i]; |
64 } else { |
64 } else { |
65 hash = 0; |
65 hash = 0; |
66 } |
66 } |
67 mssleep((long) sleepTime); |
67 mssleep((long) sleepTime); |
68 jni->ReleasePrimitiveArrayCritical(arr, pa, 0, TRACE_JNI_CALL); |
68 ec_jni->ReleasePrimitiveArrayCritical(arr, pa, 0, TRACE_JNI_CALL); |
69 mssleep((long) sleepTime); |
69 mssleep((long) sleepTime); |
70 current_time = time(NULL); |
70 current_time = time(NULL); |
71 } |
71 } |
72 jni->SetObjectField(o, objFieldId, arr, TRACE_JNI_CALL); |
72 ec_jni->SetObjectField(o, objFieldId, arr, TRACE_JNI_CALL); |
73 return hash; |
73 return hash; |
74 } |
74 } |
75 |
75 |
76 } |
76 } |