You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/10/25 00:05:58 UTC
svn commit: r467506 [2/2] - in
/incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread: ./ utils/
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_raw_monitors.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_raw_monitors.c?view=diff&rev=467506&r1=467505&r2=467506
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_raw_monitors.c (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_raw_monitors.c Tue Oct 24 15:05:57 2006
@@ -87,33 +87,31 @@
* ------------------------ HELPERS -----------------------
*/
+hysem_t mon_enter;
/*
* Test jthread_raw_monitor_enter(...)
* Test jthread_raw_monitor_exit(...)
*/
//?????????????????????????????? jthread_raw_monitor_init and not init
//?????????????????????????????? jthread_raw_monitor_exit without enter
-void JNICALL run_for_helper_jthread_raw_monitor_enter_exit(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_helper_jthread_raw_monitor_enter_exit(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
jrawMonitorID monitor = tts->raw_monitor;
IDATA status;
tts->phase = TT_PHASE_WAITING_ON_MONITOR;
+ tested_thread_started(tts);
status = jthread_raw_monitor_enter(monitor);
// Begin critical section
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_IN_CRITICAL_SECTON : TT_PHASE_ERROR);
- while(1){
- tts->clicks++;
- sleep_a_click();
- if (tts->stop) {
- break;
- }
- }
+ hysem_set(mon_enter, 1);
+ tested_thread_wait_for_stop_request(tts);
status = jthread_raw_monitor_exit(monitor);
// End critical section
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR);
+ tested_thread_ended(tts);
}
int helper_jthread_raw_monitor_enter_exit(void) {
@@ -123,6 +121,8 @@
int i;
int waiting_on_monitor_nmb;
+ hysem_create(&mon_enter, 0, 1);
+
// Initialize tts structures and run all tested threads
tested_threads_run(run_for_helper_jthread_raw_monitor_enter_exit);
@@ -131,9 +131,10 @@
waiting_on_monitor_nmb = 0;
critical_tts = NULL;
+ hysem_wait(mon_enter);
+
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- check_tested_thread_phase(tts, TT_PHASE_ANY); // to make thread running
if (tts->phase == TT_PHASE_IN_CRITICAL_SECTON){
tf_assert(critical_tts == NULL); // error if two threads in critical section
critical_tts = tts;
@@ -145,7 +146,8 @@
if (MAX_TESTED_THREAD_NUMBER - waiting_on_monitor_nmb - i != 1){
tf_fail("Wrong number waiting on monitor threads");
}
- critical_tts->stop = 1;
+ tested_thread_send_stop_request(critical_tts);
+ tested_thread_wait_ended(critical_tts);
check_tested_thread_phase(critical_tts, TT_PHASE_DEAD);
}
// Terminate all threads and clear tts structures
@@ -158,9 +160,9 @@
* Test jthread_raw_wait(...)
* Test jthread_raw_notify(...)
*/
-void JNICALL run_for_helper_jthread_raw_wait_notify(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_helper_jthread_raw_wait_notify(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
jrawMonitorID monitor = tts->raw_monitor;
IDATA status;
int64 msec = 1000000;
@@ -168,22 +170,20 @@
status = jthread_raw_monitor_enter(monitor);
if (status != TM_ERROR_NONE){
tts->phase = TT_PHASE_ERROR;
+ tested_thread_ended(tts);
return;
}
// Begin critical section
tts->phase = TT_PHASE_WAITING_ON_WAIT;
+ tested_thread_started(tts);
status = jthread_raw_monitor_wait(monitor, msec);
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_IN_CRITICAL_SECTON : TT_PHASE_ERROR);
- while(1){
- tts->clicks++;
- sleep_a_click();
- if (tts->stop) {
- break;
- }
- }
+ hysem_set(mon_enter, 1);
+ tested_thread_wait_for_stop_request(tts);
status = jthread_raw_monitor_exit(monitor);
// End critical section
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR);
+ tested_thread_ended(tts);
}
int helper_jthread_raw_wait_notify(void) {
@@ -191,10 +191,11 @@
tested_thread_sturct_t *tts;
tested_thread_sturct_t *critical_tts;
jrawMonitorID monitor;
- int64 msec = 1000000;
int i;
int waiting_on_wait_nmb;
+ hysem_create(&mon_enter, 0, 1);
+
// Initialize tts structures and run all tested threads
tested_threads_run(run_for_helper_jthread_raw_wait_notify);
@@ -210,13 +211,12 @@
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- check_tested_thread_phase(tts, TT_PHASE_ANY); // to make thread running
tf_assert(tts->phase != TT_PHASE_IN_CRITICAL_SECTON);
}
tf_assert_same(jthread_raw_monitor_notify(monitor), TM_ERROR_NONE);
+ hysem_wait(mon_enter);
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- check_tested_thread_phase(tts, TT_PHASE_ANY); // to make thread running
if (tts->phase == TT_PHASE_IN_CRITICAL_SECTON){
tf_assert(critical_tts == NULL); // error if two threads in critical section
critical_tts = tts;
@@ -228,7 +228,8 @@
if (MAX_TESTED_THREAD_NUMBER - waiting_on_wait_nmb - i != 1){
tf_fail("Wrong number waiting on monitor threads");
}
- critical_tts->stop = 1;
+ tested_thread_send_stop_request(critical_tts);
+ tested_thread_wait_ended(critical_tts);
check_tested_thread_phase(critical_tts, TT_PHASE_DEAD);
}
// Terminate all threads and clear tts structures
@@ -241,34 +242,6 @@
* Test jthread_raw_wait(...)
* Test jthread_raw_notify_all(...)
*/
-void JNICALL run_for_helper_jthread_raw_wait_notify_all(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
-
- tested_thread_sturct_t * tts = current_thread_tts;
- jrawMonitorID monitor = tts->raw_monitor;
- int64 msec = 1000000;
- IDATA status;
-
- tts->phase = TT_PHASE_WAITING_ON_MONITOR;
- status = jthread_raw_monitor_enter(monitor);
- if (status != TM_ERROR_NONE){
- tts->phase = TT_PHASE_ERROR;
- return;
- }
- // Begin critical section
- tts->phase = TT_PHASE_WAITING_ON_WAIT;
- status = jthread_raw_monitor_wait(monitor, msec);
- tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_IN_CRITICAL_SECTON : TT_PHASE_ERROR);
- while(1){
- tts->clicks++;
- sleep_a_click();
- if (tts->stop) {
- break;
- }
- }
- status = jthread_raw_monitor_exit(monitor);
- // Exit critical section
- tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR);
-}
int helper_jthread_raw_wait_notify_all(void) {
@@ -278,8 +251,10 @@
int i;
int waiting_on_wait_nmb;
+ hysem_create(&mon_enter, 0, 1);
+
// Initialize tts structures and run all tested threads
- tested_threads_run(run_for_helper_jthread_raw_wait_notify_all);
+ tested_threads_run(run_for_helper_jthread_raw_wait_notify);
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
@@ -295,9 +270,10 @@
waiting_on_wait_nmb = 0;
critical_tts = NULL;
+ hysem_wait(mon_enter);
+
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- check_tested_thread_phase(tts, TT_PHASE_ANY); // to make thread running
if (tts->phase == TT_PHASE_IN_CRITICAL_SECTON){
tf_assert(critical_tts == NULL); // error if two threads in critical section
critical_tts = tts;
@@ -309,7 +285,8 @@
if (MAX_TESTED_THREAD_NUMBER - waiting_on_wait_nmb - i != 1){
tf_fail("Wrong number waiting on monitor threads");
}
- critical_tts->stop = 1;
+ tested_thread_send_stop_request(critical_tts);
+ tested_thread_wait_ended(critical_tts);
check_tested_thread_phase(critical_tts, TT_PHASE_DEAD);
}
// Terminate all threads and clear tts structures
@@ -318,13 +295,14 @@
return TEST_PASSED;
}
-void JNICALL run_for_helper_jthread_raw_monitor_try_enter(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_helper_jthread_raw_monitor_try_enter(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
jrawMonitorID monitor = tts->raw_monitor;
IDATA status;
tts->phase = TT_PHASE_WAITING_ON_MONITOR;
+ tested_thread_started(tts);
status = jthread_raw_monitor_try_enter(monitor);
while (status == TM_ERROR_EBUSY){
status = jthread_raw_monitor_try_enter(monitor);
@@ -332,16 +310,12 @@
}
// Begin critical section
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_IN_CRITICAL_SECTON : TT_PHASE_ERROR);
- while(1){
- tts->clicks++;
- sleep_a_click();
- if (tts->stop) {
- break;
- }
- }
+ hysem_set(mon_enter, 1);
+ tested_thread_wait_for_stop_request(tts);
status = jthread_raw_monitor_exit(monitor);
// End critical section
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR);
+ tested_thread_ended(tts);
}
int helper_jthread_raw_monitor_try_enter(void) {
@@ -351,6 +325,8 @@
int i;
int waiting_on_monitor_nmb;
+ hysem_create(&mon_enter, 0, 1);
+
// Initialize tts structures and run all tested threads
tested_threads_run(run_for_helper_jthread_raw_monitor_try_enter);
@@ -359,9 +335,10 @@
waiting_on_monitor_nmb = 0;
critical_tts = NULL;
+ hysem_wait(mon_enter);
+
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- check_tested_thread_phase(tts, TT_PHASE_ANY); // to make thread running
if (tts->phase == TT_PHASE_IN_CRITICAL_SECTON){
tf_assert(critical_tts == NULL); // error if two threads in critical section
critical_tts = tts;
@@ -373,7 +350,8 @@
if (MAX_TESTED_THREAD_NUMBER - waiting_on_monitor_nmb - i != 1){
tf_fail("Wrong number waiting on monitor threads");
}
- critical_tts->stop = 1;
+ tested_thread_send_stop_request(critical_tts);
+ tested_thread_wait_ended(critical_tts);
check_tested_thread_phase(critical_tts, TT_PHASE_DEAD);
}
// Terminate all threads and clear tts structures
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_state.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_state.c?view=diff&rev=467506&r1=467505&r2=467506
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_state.c (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_state.c Tue Oct 24 15:05:57 2006
@@ -34,20 +34,18 @@
* jthread_clear_interrupted() ALIVE | RUNNABLE
* DEAD
*/
-void JNICALL run_for_test_jthread_get_state_1(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_test_jthread_get_state_1(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
tts->phase = TT_PHASE_RUNNING;
- while(1){
+ tested_thread_started(tts);
+ while(tested_thread_wait_for_stop_request_timed(tts, SLEEP_TIME) == TM_ERROR_TIMEOUT){
hythread_safe_point();
- tts->clicks++;
hythread_yield();
- if (tts->stop) {
- break;
- }
}
tts->phase = TT_PHASE_DEAD;
+ tested_thread_ended(tts);
}
int test_jthread_get_state_1(void) {
@@ -74,7 +72,7 @@
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- check_tested_thread_phase(tts, TT_PHASE_RUNNING);
+ tested_thread_wait_running(tts);
tf_assert_same(jthread_get_state(tts->java_thread, &state), TM_ERROR_NONE);
ref_state = 0x5;
if(tts->my_index == 0){
@@ -98,7 +96,8 @@
}
//tf_assert_same(state, ref_state);
- tts->stop = 1;
+ tested_thread_send_stop_request(tts);
+ tested_thread_wait_ended(tts);
check_tested_thread_phase(tts, TT_PHASE_DEAD);
tf_assert_same(jthread_get_state(tts->java_thread, &state), TM_ERROR_NONE);
ref_state = 0x2;
@@ -116,16 +115,18 @@
/*
* Test jthread_get_state(...)
*/
-void JNICALL run_for_test_jthread_get_state_2(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_test_jthread_get_state_2(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
jobject monitor = tts->monitor;
IDATA status;
tts->phase = TT_PHASE_WAITING_ON_MONITOR;
+ tested_thread_started(tts);
status = jthread_monitor_enter(monitor);
if (status != TM_ERROR_NONE){
tts->phase = TT_PHASE_ERROR;
+ tested_thread_ended(tts);
return;
}
// Begin critical section
@@ -138,15 +139,12 @@
status = jthread_monitor_exit(monitor);
// Exit critical section
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_RUNNING : TT_PHASE_ERROR);
- while(1){
+ while(tested_thread_wait_for_stop_request_timed(tts, SLEEP_TIME) == TM_ERROR_TIMEOUT){
hythread_safe_point();
- tts->clicks++;
hythread_yield();
- if (tts->stop) {
- break;
- }
}
tts->phase = TT_PHASE_DEAD;
+ tested_thread_ended(tts);
}
int test_jthread_get_state_2(void) {
@@ -231,16 +229,18 @@
/*
* Test jthread_get_state(...)
*/
-void JNICALL run_for_test_jthread_get_state_3(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_test_jthread_get_state_3(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
jobject monitor = tts->monitor;
IDATA status;
tts->phase = TT_PHASE_WAITING_ON_MONITOR;
+ tested_thread_started(tts);
status = jthread_monitor_enter(monitor);
if (status != TM_ERROR_NONE){
tts->phase = TT_PHASE_ERROR;
+ tested_thread_ended(tts);
return;
}
// Begin critical section
@@ -248,11 +248,13 @@
status = jthread_monitor_timed_wait(monitor, 1000000, 100);
if (status != TM_ERROR_INTERRUPT){
tts->phase = TT_PHASE_ERROR;
+ tested_thread_ended(tts);
return;
}
status = jthread_monitor_exit(monitor);
// Exit critical section
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR);
+ tested_thread_ended(tts);
}
int test_jthread_get_state_3(void) {
@@ -288,16 +290,18 @@
/*
* Test jthread_get_state(...)
*/
-void JNICALL run_for_test_jthread_get_state_4(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_test_jthread_get_state_4(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
jobject monitor = tts->monitor;
IDATA status;
tts->phase = TT_PHASE_WAITING_ON_MONITOR;
+ tested_thread_started(tts);
status = jthread_monitor_enter(monitor);
if (status != TM_ERROR_NONE){
tts->phase = TT_PHASE_ERROR;
+ tested_thread_ended(tts);
return;
}
// Begin critical section
@@ -305,11 +309,13 @@
status = jthread_monitor_timed_wait(monitor, CLICK_TIME_MSEC, 0);
if (status != TM_ERROR_TIMEOUT){
tts->phase = TT_PHASE_ERROR;
+ tested_thread_ended(tts);
return;
}
status = jthread_monitor_exit(monitor);
// Exit critical section
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR);
+ tested_thread_ended(tts);
}
int test_jthread_get_state_4(void) {
@@ -342,14 +348,16 @@
/*
* Test jthread_get_state(...)
*/
-void JNICALL run_for_test_jthread_get_state_5(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_test_jthread_get_state_5(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
IDATA status;
tts->phase = TT_PHASE_SLEEPING;
+ tested_thread_started(tts);
status = hythread_sleep(1000000);
tts->phase = (status == TM_ERROR_INTERRUPT ? TT_PHASE_DEAD : TT_PHASE_ERROR);
+ tested_thread_ended(tts);
}
int test_jthread_get_state_5(void) {
@@ -385,14 +393,16 @@
/*
* Test jthread_get_state(...)
*/
-void JNICALL run_for_test_jthread_get_state_6(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_test_jthread_get_state_6(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
IDATA status;
tts->phase = TT_PHASE_SLEEPING;
+ tested_thread_started(tts);
status = hythread_sleep(CLICK_TIME_MSEC);
tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR);
+ tested_thread_ended(tts);
}
int test_jthread_get_state_6(void) {
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_timing.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_timing.c?view=diff&rev=467506&r1=467505&r2=467506
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_timing.c (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_ti_timing.c Tue Oct 24 15:05:57 2006
@@ -64,23 +64,18 @@
return helper_hythread_cpu_timing();
}
-void JNICALL run_for_helper_hythread_cpu_timing(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg){
+void JNICALL run_for_helper_hythread_cpu_timing(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){
- tested_thread_sturct_t * tts = current_thread_tts;
- int i;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args;
int num = 0;
tts->phase = TT_PHASE_RUNNING;
- while(1){
- for (i = 0; i < 1000; i++){
- num = num + 1;
- }
- if (tts->stop) {
- break;
- }
- sleep_a_click();
+ tested_thread_started(tts);
+ while(tested_thread_wait_for_stop_request_timed(tts, SLEEP_TIME) == TM_ERROR_TIMEOUT) {
+ ++num;
}
tts->phase = TT_PHASE_DEAD;
+ tested_thread_ended(tts);
}
int helper_hythread_cpu_timing(void) {
@@ -100,7 +95,8 @@
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- tts->stop = 1;
+ tested_thread_send_stop_request(tts);
+ tested_thread_wait_ended(tts);
check_tested_thread_phase(tts, TT_PHASE_DEAD);
tf_assert_same(jthread_get_thread_cpu_time(tts->java_thread, &cpu_time), TM_ERROR_NONE);
@@ -110,6 +106,7 @@
tf_assert_same(jthread_get_thread_cpu_timer_info(&timer_info), TM_ERROR_NONE);
tf_assert(user_cpu_time > 0);
+ /*
printf("=================================================== %08x\n", cpu_time);
printf("cpu_time = %i \n", cpu_time);
printf("user_cpu_time = %i \n", user_cpu_time);
@@ -122,6 +119,7 @@
printf("may_skip_forward = %i \n", timer_info.may_skip_forward);
printf("may_skip_backward = %i \n", timer_info.may_skip_backward);
printf("kind = %i \n", timer_info.kind);
+ */
}
// Terminate all threads and clear tts structures
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c?view=diff&rev=467506&r1=467505&r2=467506
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c Tue Oct 24 15:05:57 2006
@@ -23,6 +23,7 @@
#include <open/hythread.h>
#include <open/hythread_ext.h>
#include <open/ti_thread.h>
+#include <open/thread_externals.h>
#include "apr_time.h"
@@ -30,10 +31,10 @@
* Utilities for thread manager unit tests
*/
-tested_thread_sturct_t * current_thread_tts;
tested_thread_sturct_t dummy_tts_struct;
tested_thread_sturct_t * dummy_tts = &dummy_tts_struct;
tested_thread_sturct_t tested_threads[MAX_TESTED_THREAD_NUMBER];
+JavaVM * GLOBAL_VM = NULL;
apr_pool_t *pool = NULL;
@@ -41,7 +42,7 @@
apr_sleep(CLICK_TIME_MSEC * 1000);
}
-jthread new_jthread_jobject(JNIEnv * jni_env) {
+jthread new_jobject_thread(JNIEnv * jni_env) {
const char * name = "<init>";
const char * sig = "()V";
jmethodID constructor = NULL;
@@ -52,6 +53,17 @@
return (*jni_env)->NewObject(jni_env, thread_class, constructor);
}
+jobject new_jobject_thread_death(JNIEnv * jni_env) {
+ const char * name = "<init>";
+ const char * sig = "()V";
+ jmethodID constructor = NULL;
+ jclass thread_death_class;
+
+ thread_death_class = (*jni_env)->FindClass(jni_env, "java/lang/ThreadDeath");
+ constructor = (*jni_env)->GetMethodID(jni_env, thread_death_class, name, sig);
+ return (*jni_env)->NewObject(jni_env, thread_death_class, constructor);
+}
+
jthread new_jobject(){
apr_status_t status;
@@ -78,7 +90,6 @@
void test_java_thread_setup(int argc, char *argv[]) {
JavaVMInitArgs args;
- JavaVM * java_vm;
JNIEnv * jni_env;
int i;
@@ -93,8 +104,9 @@
log_debug("test_java_thread_init()");
+ hythread_sleep(1000);
apr_initialize();
- JNI_CreateJavaVM(&java_vm, &jni_env, &args);
+ JNI_CreateJavaVM(&GLOBAL_VM, &jni_env, &args);
}
void test_java_thread_teardown(void) {
@@ -140,14 +152,15 @@
for (i = 0; i < MAX_TESTED_THREAD_NUMBER; i++){
tts = &tested_threads[i];
tts->my_index = i;
- //tf_assert_null(tts->java_thread);
- tts->java_thread = new_jthread_jobject(jni_env);
- //tf_assert_null(tts->jni_env);
+ tts->java_thread = new_jobject_thread(jni_env);
+ tts->native_thread = NULL;
//tts->attrs.priority = 5;
tts->jvmti_start_proc_arg = &tts->jvmti_start_proc_arg;
- tts->clicks = 0;
+ hysem_create(&tts->started, 0, 1);
+ hysem_create(&tts->running, 0, 1);
+ hysem_create(&tts->stop_request, 0, 1);
+ hysem_create(&tts->ended, 0, 1);
tts->phase = TT_PHASE_NONE;
- tts->stop = 0;
if (mode == TTS_INIT_DIFFERENT_MONITORS){
monitor = new_jobject();
status = jthread_monitor_init(monitor);
@@ -230,10 +243,9 @@
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- current_thread_tts = tts;
- tf_assert_same_v(jthread_create_with_function(jni_env, tts->java_thread, &tts->attrs, run_method_param, NULL), TM_ERROR_NONE);
- check_tested_thread_phase(tts, TT_PHASE_ANY);
- check_tested_thread_structures(tts);
+ tf_assert_same_v(jthread_create_with_function(jni_env, tts->java_thread, &tts->attrs, run_method_param, tts), TM_ERROR_NONE);
+ tested_thread_wait_started(tts);
+ tts->native_thread = (hythread_t) vm_jthread_get_tm_data(tts->java_thread);
}
}
@@ -249,85 +261,88 @@
tested_threads_run_common(run_method_param);
}
-void tested_threads_run_with_jvmti_start_proc(jvmtiStartFunction jvmti_start_proc){
+void tested_os_threads_run(hythread_entrypoint_t run_method_param){
+
tested_thread_sturct_t *tts;
- JNIEnv * jni_env;
+ IDATA status;
- jni_env = jthread_get_JNI_env(jthread_self());
-
tested_threads_init(TTS_INIT_COMMON_MONITOR);
reset_tested_thread_iterator(&tts);
while(next_tested_thread(&tts)){
- current_thread_tts = tts;
- tf_assert_same_v(jthread_create_with_function(jni_env, tts->java_thread, &tts->attrs,
- jvmti_start_proc, tts->jvmti_start_proc_arg), TM_ERROR_NONE);
- check_tested_thread_phase(tts, TT_PHASE_ANY);
+ // Create thread
+ status = hythread_create(&tts->native_thread, // new thread OS handle
+ 0, 5, 0,
+ run_method_param, // start proc
+ tts);
+ tf_assert_v(status == TM_ERROR_NONE);
+ tested_thread_wait_started(tts);
}
}
-void tested_os_threads_run(apr_thread_start_t run_method_param){
+void tested_thread_started(tested_thread_sturct_t * tts) {
+ hysem_set(tts->started, 1);
+}
+
+void tested_thread_ended(tested_thread_sturct_t * tts) {
+ hysem_set(tts->ended, 1);
+}
- tested_thread_sturct_t *tts;
- apr_thread_t *apr_thread;
- apr_threadattr_t *apr_attrs = NULL;
- apr_status_t status;
- apr_pool_t *pool;
+void tested_thread_send_stop_request(tested_thread_sturct_t * tts) {
+ hysem_set(tts->stop_request, 1);
+}
- status = apr_pool_create(&pool, NULL);
- tf_assert_v(status == APR_SUCCESS);
- tested_threads_init(TTS_INIT_COMMON_MONITOR);
- reset_tested_thread_iterator(&tts);
- while(next_tested_thread(&tts)){
- current_thread_tts = tts;
- apr_thread = NULL;
- // Create APR thread
- status = apr_thread_create(
- &apr_thread, // new thread OS handle
- apr_attrs,
- run_method_param, // start proc
- NULL, // start proc arg
- pool
- );
- tf_assert_v(status == APR_SUCCESS);
- check_tested_thread_phase(tts, TT_PHASE_ANY);
- }
+void tested_thread_wait_for_stop_request(tested_thread_sturct_t * tts) {
+ IDATA status;
+ do {
+ hysem_set(tts->running, 1);
+ status = hysem_wait_timed(tts->stop_request, SLEEP_TIME, 0);
+ } while (status == TM_ERROR_TIMEOUT);
+}
+
+IDATA tested_thread_wait_for_stop_request_timed(tested_thread_sturct_t * tts, I_64 sleep_time) {
+ hysem_set(tts->running, 1);
+ return hysem_wait_timed(tts->stop_request, sleep_time, 0);
}
-int tested_threads_stop(){
+int tested_threads_stop() {
tested_thread_sturct_t *tts;
reset_tested_thread_iterator(&tts);
- while(next_tested_thread(&tts)){
- if (check_tested_thread_phase(tts, TT_PHASE_DEAD) != TEST_PASSED){
- tts->stop = 1;
- check_tested_thread_phase(tts, TT_PHASE_DEAD);
- //Sleep(1000);
- }
+ while (next_tested_thread(&tts)) {
+ tested_thread_send_stop_request(tts);
+ }
+ while (next_tested_thread(&tts)) {
+ tested_thread_wait_ended(tts);
}
return TEST_PASSED;
}
-int tested_threads_destroy(){
+int tested_threads_destroy() {
tested_thread_sturct_t *tts;
reset_tested_thread_iterator(&tts);
- while(next_tested_thread(&tts)){
- tts->stop = 1;
- check_tested_thread_phase(tts, TT_PHASE_DEAD);
+ while (next_tested_thread(&tts)) {
+ tested_thread_send_stop_request(tts);
+ }
+ reset_tested_thread_iterator(&tts);
+ while (next_tested_thread(&tts)) {
+ tested_thread_wait_dead(tts);
}
+
return TEST_PASSED;
}
-int check_tested_thread_structures(tested_thread_sturct_t *tts){
+
+int check_structure(tested_thread_sturct_t *tts){
jthread java_thread = tts->java_thread;
jvmti_thread_t jvmti_thread;
hythread_t hythread;
- hythread = vm_jthread_get_tm_data(java_thread);
- tf_assert(hythread);
+ hythread = (hythread_t) vm_jthread_get_tm_data(java_thread);
+ tf_assert_same(hythread, tts->native_thread);
jvmti_thread = hythread_get_private_data(hythread);
tf_assert(jvmti_thread);
/*
@@ -339,41 +354,65 @@
//if(jvmti_thread->stop_exception != stop_exception){
// return TEST_FAILED; ????????????????????????????????????????????
//}
-
return TEST_PASSED;
}
-int check_tested_thread_phase(tested_thread_sturct_t *tts, int phase){
+int check_phase(tested_thread_sturct_t *tts, int phase) {
+
+ tf_assert(tts->phase != TT_PHASE_ERROR);
+ if (phase == TT_PHASE_ANY) {
+ tf_assert(tts->phase != TT_PHASE_NONE);
+ } else {
+ tf_assert_same(tts->phase, phase);
+ }
+ return TEST_PASSED;
+}
+void tested_thread_wait_started(tested_thread_sturct_t *tts) {
int i;
- for (i = 0; i < MAX_CLICKS_TO_WAIT; i++){
- sleep_a_click(); // must be here to give tested thread to change phase
-
- tf_assert(tts->phase != TT_PHASE_ERROR);
- if (phase == tts->phase){
- return 0;
- }
- if (phase == TT_PHASE_ANY && tts->phase != TT_PHASE_NONE){
- return 0;
- }
+
+ i = 0;
+ while (hysem_wait_timed(tts->started, MAX_TIME_TO_WAIT, 0) == TM_ERROR_TIMEOUT) {
+ i++;
+ printf("Thread %i hasn't started for %i milliseconds",
+ tts->my_index, (i * MAX_TIME_TO_WAIT));
}
- // tf_assert_same(phase, tts->phase);
- return 0;
+ hysem_post(tts->started);
}
-int tested_thread_is_running(tested_thread_sturct_t *tts){
+void tested_thread_wait_running(tested_thread_sturct_t *tts) {
+ int i;
+
+ i = 0;
+ while (hysem_wait_timed(tts->running, MAX_TIME_TO_WAIT, 0) == TM_ERROR_TIMEOUT) {
+ i++;
+ printf("Thread %i isn't running after %i milliseconds",
+ tts->my_index, (i * MAX_TIME_TO_WAIT));
+ }
+}
- int clicks = tts->clicks;
+void tested_thread_wait_ended(tested_thread_sturct_t *tts) {
int i;
+
+ i = 0;
+ while (hysem_wait_timed(tts->ended, MAX_TIME_TO_WAIT, 0) == TM_ERROR_TIMEOUT) {
+ i++;
+ printf("Thread %i hasn't ended for %i milliseconds",
+ tts->my_index, (i * MAX_TIME_TO_WAIT));
+ }
+ hysem_post(tts->ended);
+}
- for (i = 0; i < MAX_CLICKS_TO_WAIT; i++){
- sleep_a_click();
- if (clicks != tts->clicks){
- return 1;
- }
+void tested_thread_wait_dead(tested_thread_sturct_t *tts) {
+ int i;
+
+ i = 0;
+ while (hythread_join_timed(tts->native_thread, MAX_TIME_TO_WAIT, 0) == TM_ERROR_TIMEOUT) {
+ i++;
+ printf("Thread %i isn't dead after %i milliseconds",
+ tts->my_index, (i * MAX_TIME_TO_WAIT));
}
- return 0;
}
int compare_threads(jthread *threads, int thread_nmb, int compare_from_end) {
@@ -433,16 +472,12 @@
void JNICALL default_run_for_test(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg) {
- tested_thread_sturct_t * tts = current_thread_tts;
+ tested_thread_sturct_t * tts = (tested_thread_sturct_t *)arg;
tts->phase = TT_PHASE_RUNNING;
- while(1){
- tts->clicks++;
- sleep_a_click();
- if (tts->stop) {
- break;
- }
- }
+ tested_thread_started(tts);
+ tested_thread_wait_for_stop_request(tts);
tts->phase = TT_PHASE_DEAD;
+ tested_thread_ended(tts);
}
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h?view=diff&rev=467506&r1=467505&r2=467506
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h Tue Oct 24 15:05:57 2006
@@ -44,10 +44,12 @@
#define TTS_INIT_DIFFERENT_MONITORS 1
#define MAX_TESTED_THREAD_NUMBER 5
-#define MAX_CLICKS_TO_WAIT 30
-#define CLICK_TIME_MSEC 10
+#define MAX_TIME_TO_WAIT 1000
#define MAX_OWNED_MONITORS_NMB 2
-#define SLEEP_MSEC 10
+#define SLEEP_TIME 100
+#define CLICK_TIME_MSEC 10
+
+extern JavaVM * GLOBAL_VM;
typedef struct _jjobject{
void *data;
@@ -63,20 +65,20 @@
typedef struct {
int my_index;
jthread java_thread;
+ hythread_t native_thread;
jobject monitor;
jrawMonitorID raw_monitor;
void * jvmti_start_proc_arg;
- int clicks;
+ hysem_t started;
+ hysem_t running;
+ hysem_t stop_request;
+ hysem_t ended;
int phase;
- int stop;
jint peak_count;
jthread_threadattr_t attrs;
jclass excn;
-}tested_thread_sturct_t;
+} tested_thread_sturct_t;
-extern tested_thread_sturct_t *current_thread_tts;
-extern tested_thread_sturct_t *dummy_tts;
-void jni_init();
void sleep_a_click(void);
void test_java_thread_setup(int argc, char *argv[]);
void test_java_thread_teardown(void);
@@ -85,20 +87,38 @@
void tested_threads_run_common(jvmtiStartFunction run_method_param);
void tested_threads_run_with_different_monitors(jvmtiStartFunction run_method_param);
void tested_threads_run_with_jvmti_start_proc(jvmtiStartFunction jvmti_start_proc);
-void tested_os_threads_run(apr_thread_start_t run_method_param);
+void tested_os_threads_run(hythread_entrypoint_t run_method_param);
+
int tested_threads_destroy();
int tested_threads_stop();
+
tested_thread_sturct_t *get_tts(int tts_index);
int next_tested_thread(tested_thread_sturct_t **tts);
int prev_tested_thread(tested_thread_sturct_t **tts);
void reset_tested_thread_iterator(tested_thread_sturct_t ** tts);
-int check_tested_thread_structures(tested_thread_sturct_t *tts);
-int check_tested_thread_phase(tested_thread_sturct_t *tts, int phase);
-int tested_thread_is_running(tested_thread_sturct_t *tts);
+
+#define check_tested_thread_phase(tts, phase) if (check_phase(tts, phase) != TEST_PASSED) return TEST_FAILED;
+#define check_tested_thread_structures(tts) if (check_structure(tts) != TEST_PASSED) return TEST_FAILED;
+int check_structure(tested_thread_sturct_t *tts);
+int check_phase(tested_thread_sturct_t *tts, int phase);
+
+void tested_thread_started(tested_thread_sturct_t * tts);
+void tested_thread_ended(tested_thread_sturct_t * tts);
+void tested_thread_send_stop_request(tested_thread_sturct_t * tts);
+void tested_thread_wait_for_stop_request(tested_thread_sturct_t * tts);
+IDATA tested_thread_wait_for_stop_request_timed(tested_thread_sturct_t * tts, I_64 sleep_time);
+
+void tested_thread_wait_started(tested_thread_sturct_t *tts);
+void tested_thread_wait_running(tested_thread_sturct_t *tts);
+void tested_thread_wait_ended(tested_thread_sturct_t *tts);
+void tested_thread_wait_dead(tested_thread_sturct_t *tts);
+
int compare_threads(jthread *threads, int thread_nmb, int compare_from_end);
int compare_pointer_sets(void ** set_a, void ** set_b, int nmb);
int check_exception(jobject excn);
-jobject new_jobject();
-void delete_jobject(jobject obj);
void set_phase(tested_thread_sturct_t *tts, int phase);
void JNICALL default_run_for_test(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg);
+jthread new_jobject_thread(JNIEnv * jni_env);
+jobject new_jobject_thread_death(JNIEnv * jni_env);
+jthread new_jobject();
+void delete_jobject(jobject obj);