You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/12/27 13:21:06 UTC
svn commit: r607049 - in /harmony/enhanced/drlvm/trunk/vm/tests/unit/thread:
test_native_basic.c test_native_fat_monitor.c test_native_suspend.c
test_native_thin_monitor.c utils/thread_unit_test_utils.c
utils/thread_unit_test_utils.h
Author: gshimansky
Date: Thu Dec 27 04:21:05 2007
New Revision: 607049
URL: http://svn.apache.org/viewvc?rev=607049&view=rev
Log:
Applied tests patch from HARMONY-5349
[drlvm][thread] Thread.join() refactoring
Modified:
harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c
harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c
harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c
harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c
harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c
harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h
Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c?rev=607049&r1=607048&r2=607049&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c Thu Dec 27 04:21:05 2007
@@ -17,48 +17,88 @@
#include <stdio.h>
#include "testframe.h"
+#include "thread_unit_test_utils.h"
#include "thread_manager.h"
-int start_proc(void *);
-int start_proc_empty(void *);
+
+typedef struct proc_param {
+ hythread_group_t group;
+ UDATA stacksize;
+ jint priority;
+ hylatch_t start;
+ hylatch_t end;
+} proc_param;
+
+
+static int start_proc(void *args) {
+ proc_param *attrs = (proc_param *)args;
+ tf_assert_same(hythread_get_priority(hythread_self()), attrs->priority);
+ tf_assert_same(hythread_self()->group, attrs->group);
+ hylatch_count_down(attrs->end);
+ return 0;
+} // start_proc
+
+static int start_proc_empty(void *args) {
+ proc_param *attrs = (proc_param *)args;
+ hylatch_count_down(attrs->start);
+ hylatch_wait(attrs->end);
+ return 0;
+} // start_proc_empty
+
int test_hythread_self_base(void) {
hythread_t thread;
- //check that this thread is attached(tm_init called)
- ////
+
+ // check that this thread is attached to VM
tf_assert(thread = hythread_self());
-
- return 0;
-}
+
+ return 0;
+} // test_hythread_self_base
/*
- * Test tm_create(..)
- */
-int test_hythread_create(void){
- void **args;
+* Test tm_create(..)
+*/
+int test_hythread_create(void) {
+ proc_param *args;
hythread_t thread;
- IDATA res;
-
- args = (void**)calloc(2, sizeof(void *));
-
- hythread_group_create((hythread_group_t *)&args[0]);
-
- args[1] = calloc(1, sizeof(struct jthread_start_proc_data));
- ((jthread_start_proc_data_t)args[1])->stacksize = 1024000;
- ((jthread_start_proc_data_t)args[1])->priority = 1;
-
+ IDATA status;
+
+ args = (proc_param*)calloc(1, sizeof(proc_param));
+ tf_assert(args && "alloc proc_params failed");
+
+ status = hythread_group_create(&args->group);
+ tf_assert(status == TM_ERROR_NONE && "thread group creation failed");
+
+ status = hylatch_create(&args->end, 1);
+ tf_assert(status == TM_ERROR_NONE && "latch creation failed");
+
+ args->priority = 1;
+
thread = (hythread_t)calloc(1, hythread_get_struct_size());
assert(thread);
- res = hythread_create_ex(thread, args[0], 1024000, 1, NULL,
- (hythread_entrypoint_t)start_proc, args);
- tf_assert(res == TM_ERROR_NONE && "thread creation failed");
+ status = hythread_create_ex(thread, args->group, 1024000, 1, NULL,
+ (hythread_entrypoint_t)start_proc, (void*)args);
+ tf_assert(status == TM_ERROR_NONE && "thread creation failed");
+
+ // Wait util tested thread have finished.
+ status = hylatch_wait(args->end);
+ tf_assert(status == TM_ERROR_NONE && "thread finished failed");
+
+ status = hylatch_destroy(args->end);
+ tf_assert(status == TM_ERROR_NONE && "latch destroy failed");
+
+ hythread_sleep(SLEEP_TIME);
+ hythread_group_release(args->group);
+
+ free(args);
- res = hythread_join(thread);
- tf_assert(res == TM_ERROR_NONE && "thread join failed");
return TEST_PASSED;
}
-// Waits until count of running threads in specified group reaches 'count' or less
+/**
+* Waits until count of running threads in specified group
+* reaches 'count' or less
+*/
static void wait_for_all_treads_are_terminated(hythread_group_t group, int count)
{
int max_tries = 1000; // Maximum count of iterations
@@ -70,8 +110,7 @@
hythread_iterator_t iterator = hythread_iterator_create(group);
- while(hythread_iterator_has_next(iterator))
- {
+ while(hythread_iterator_has_next(iterator)) {
thread = hythread_iterator_next(&iterator);
if (!hythread_is_terminated(thread))
@@ -83,155 +122,202 @@
if (n <= count)
break;
- hythread_sleep(1); // 1ms
+ hythread_yield();
}
- hythread_sleep(100);// 0.1s to let system threads finish their work
-}
-
-hylatch_t start;
-hylatch_t end;
+ // 0.1s to let system threads finish their work
+ hythread_sleep(100);
+} // wait_for_all_treads_are_terminated
int test_hythread_iterator(void) {
- hythread_group_t group = NULL;
+ int i;
+ const int n = 100;
+ IDATA status;
+ proc_param *args;
hythread_t thread = NULL;
hythread_iterator_t iterator;
- const int n = 100;
- int i;
- hythread_group_create(&group);
- hylatch_create(&start, n);
- hylatch_create(&end, 1);
+ args = (proc_param*)calloc(1, sizeof(proc_param));
+ tf_assert(args && "alloc proc_params failed");
+
+ status = hythread_group_create(&args->group);
+ tf_assert(status == TM_ERROR_NONE && "create group failed");
+
+ status = hylatch_create(&args->start, n);
+ tf_assert(status == TM_ERROR_NONE && "latch creation failed");
+
+ status = hylatch_create(&args->end, 1);
+ tf_assert(status == TM_ERROR_NONE && "latch creation failed");
for (i = 0; i < n; i++) {
- IDATA status;
thread = (hythread_t)calloc(1, hythread_get_struct_size());
assert(thread);
- status = hythread_create_ex(thread, group, 0, 0, NULL,
- (hythread_entrypoint_t)start_proc_empty, NULL);
- tf_assert_same(status, TM_ERROR_NONE);
+ status = hythread_create_ex(thread, args->group, 0, 0, NULL,
+ (hythread_entrypoint_t)start_proc_empty, (void*)args);
+ tf_assert(status == TM_ERROR_NONE && "test thread creation failed");
}
// Wait util all threads have started.
- hylatch_wait(start);
- iterator = hythread_iterator_create(group);
- // Notify all threads
- hylatch_count_down(end);
+ status = hylatch_wait(args->start);
+ tf_assert(status == TM_ERROR_NONE && "start waiting failed");
+
+ iterator = hythread_iterator_create(args->group);
+ tf_assert(iterator && "interator creation failed");
printf ("iterator size: %d\n", (int)hythread_iterator_size(iterator));
- tf_assert(hythread_iterator_size(iterator) == n);
+ tf_assert(hythread_iterator_size(iterator) == n && "iterator size");
+
i = 0;
while(hythread_iterator_has_next(iterator)) {
i++;
thread = hythread_iterator_next(&iterator);
- tf_assert(hythread_is_alive(thread));
+ tf_assert(hythread_is_alive(thread) && "thread is not alive!");
}
- tf_assert(i == n);
+ tf_assert(i == n && "wrong number of tested threads");
- hythread_iterator_release(&iterator);
+ status = hythread_iterator_release(&iterator);
+ tf_assert(status == TM_ERROR_NONE && "release iterator failed");
- wait_for_all_treads_are_terminated(group, i - n);
+ // Notify all threads
+ status = hylatch_count_down(args->end);
+ tf_assert(status == TM_ERROR_NONE && "all threads notify failed");
- return 0;
-}
+ wait_for_all_treads_are_terminated(args->group, i - n);
+
+ status = hylatch_destroy(args->start);
+ tf_assert(status == TM_ERROR_NONE && "start latch destroy failed");
+
+ status = hylatch_destroy(args->end);
+ tf_assert(status == TM_ERROR_NONE && "end latch destroy failed");
+
+ hythread_sleep(SLEEP_TIME);
+ hythread_group_release(args->group);
+
+ free(args);
+
+ return TEST_PASSED;
+} // test_hythread_iterator
int test_hythread_iterator_default(void) {
+ int i;
+ const int n = 100;
+ IDATA status;
+ proc_param *args;
hythread_t thread = NULL;
hythread_iterator_t iterator;
- const int n = 100;
- int i;
- hylatch_create(&start, n);
- hylatch_create(&end, 1);
+ args = (proc_param*)calloc(1, sizeof(proc_param));
+ tf_assert(args && "alloc proc_params failed");
+
+ status = hylatch_create(&args->start, n);
+ tf_assert(status == TM_ERROR_NONE && "latch creation failed");
+
+ status = hylatch_create(&args->end, 1);
+ tf_assert(status == TM_ERROR_NONE && "latch creation failed");
for (i = 0; i < n; i++) {
- IDATA status;
status = hythread_create(NULL, 0, 0, 0,
- (hythread_entrypoint_t)start_proc_empty, NULL);
- tf_assert_same(status, TM_ERROR_NONE);
+ (hythread_entrypoint_t)start_proc_empty, (void*)args);
+ tf_assert(status == TM_ERROR_NONE && "test thread creation failed");
}
// Wait util all threads have started.
- hylatch_wait(start);
- iterator = hythread_iterator_create(NULL);
- // Notify all threads
- hylatch_count_down(end);
+ status = hylatch_wait(args->start);
+ tf_assert(status == TM_ERROR_NONE && "start waiting failed");
+
+ iterator = hythread_iterator_create(args->group);
+ tf_assert(iterator && "interator creation failed");
+
+ printf ("default group iterator size: %d\n", (int)hythread_iterator_size(iterator));
+ tf_assert(hythread_iterator_size(iterator) >= n && "iterator size");
- printf("default group iterator: %d\n", (int)hythread_iterator_size(iterator));
- tf_assert(hythread_iterator_size(iterator) >= n);
i = 0;
while(hythread_iterator_has_next(iterator)) {
- i++;
thread = hythread_iterator_next(&iterator);
+ if (hythread_is_alive(thread)) {
+ i++;
+ }
}
+ tf_assert(i >= n && "wrong number of tested threads");
- tf_assert(i >= n);
+ status = hythread_iterator_release(&iterator);
+ tf_assert(status == TM_ERROR_NONE && "release iterator failed");
- hythread_iterator_release(&iterator);
+ // Notify all threads
+ status = hylatch_count_down(args->end);
+ tf_assert(status == TM_ERROR_NONE && "all threads notify failed");
wait_for_all_treads_are_terminated(NULL, i - n);
- return 0;
-}
+ status = hylatch_destroy(args->start);
+ tf_assert(status == TM_ERROR_NONE && "start latch destroy failed");
+ status = hylatch_destroy(args->end);
+ tf_assert(status == TM_ERROR_NONE && "end latch destroy failed");
+ free(args);
+
+ return TEST_PASSED;
+} // test_hythread_iterator_default
/*
- * Test tm_create(..)
- */
+* Test tm_create(..)
+*/
int test_hythread_create_many(void){
- void **args;
- hythread_t thread = NULL;
- hythread_group_t group = NULL;
- IDATA res;
- int i = 10;
-
- hythread_group_create(&group);
- while(i--) {
- args = (void**)calloc(2, sizeof(void *));
-
- args[0] = group;
-
- args[1] = calloc(1, sizeof(struct jthread_start_proc_data));
- ((jthread_start_proc_data_t)args[1])->stacksize = 1024000;
- ((jthread_start_proc_data_t)args[1])->priority = 1;
-
+ int i;
+ const int n = 10;
+ IDATA status;
+ proc_param *args;
+ hythread_t thread;
+
+ args = (proc_param*)calloc(1, sizeof(proc_param));
+ tf_assert(args && "alloc proc_params failed");
+
+ status = hythread_group_create(&args->group);
+ tf_assert(status == TM_ERROR_NONE && "create group failed");
+
+ status = hylatch_create(&args->start, n);
+ tf_assert(status == TM_ERROR_NONE && "latch creation failed");
+
+ status = hylatch_create(&args->end, 1);
+ tf_assert(status == TM_ERROR_NONE && "latch creation failed");
+
+ for (i = 0; i < n; i++) {
thread = (hythread_t)calloc(1, hythread_get_struct_size());
assert(thread);
- res = hythread_create_ex(thread, group, 1024000, 1, NULL,
- (hythread_entrypoint_t)start_proc, args);
- tf_assert(res == TM_ERROR_NONE && "thread creation failed");
- res = hythread_join(thread);
- tf_assert(res == TM_ERROR_NONE && "thread join failed");
- }
-
- //check thread structures:
- //1. thread get group
- //2. check that group contains 10 threads
- //NOTE: native structures should not be freed untill tm_thread_destroy method
- ////
-
- //1.group
- ////
- tf_assert(group);
- //tf_assert(group->threads_count == 0);
+ status = hythread_create_ex(thread, args->group, 0, 0, NULL,
+ (hythread_entrypoint_t)start_proc_empty, (void*)args);
+ tf_assert(status == TM_ERROR_NONE && "test thread creation failed");
+ }
- return 0;
-}
+ // Wait util all threads have started.
+ status = hylatch_wait(args->start);
+ tf_assert(status == TM_ERROR_NONE && "start waiting failed");
-int start_proc(void *args) {
- void** attrs = (void **)args;
- tf_assert_same(hythread_get_priority(hythread_self()), ((jthread_start_proc_data_t)attrs[1])->priority);
- tf_assert_same(((HyThread_public*)hythread_self())->group, attrs[0]);
- return 0;
-}
+ // huck to get group_count from hythread_group_t structure
+ i = hythread_iterator_size((hythread_iterator_t)thread);
+ tf_assert(i == n && "incorrect threads count");
-int start_proc_empty(void *args) {
- hylatch_count_down(start);
- hylatch_wait(end);
- return 0;
-}
+ // Notify all threads
+ status = hylatch_count_down(args->end);
+ tf_assert(status == TM_ERROR_NONE && "all threads notify failed");
+
+ wait_for_all_treads_are_terminated(args->group, i - n);
+
+ status = hylatch_destroy(args->start);
+ tf_assert(status == TM_ERROR_NONE && "start latch destroy failed");
+
+ status = hylatch_destroy(args->end);
+ tf_assert(status == TM_ERROR_NONE && "end latch destroy failed");
+
+ hythread_sleep(SLEEP_TIME);
+ hythread_group_release(args->group);
+
+ free(args);
+
+ return TEST_PASSED;
+} // test_hythread_create_many
TEST_LIST_START
TEST(test_hythread_self_base)
Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c?rev=607049&r1=607048&r2=607049&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c Thu Dec 27 04:21:05 2007
@@ -16,8 +16,9 @@
*/
#include "thread_manager.h"
-#include "testframe.h"
#include <open/hythread_ext.h>
+#include "testframe.h"
+#include "thread_unit_test_utils.h"
#define NMB 5
@@ -73,14 +74,14 @@
status = hythread_monitor_exit(monitor);
tf_assert_same(status, TM_ERROR_NONE);
- hythread_sleep(100);
+ hythread_sleep(SLEEP_TIME);
}
status = hythread_monitor_exit(monitor);
// Send one signal per tested thread
for (i = 0; i < NMB; i++){
- jthread_sleep(100, 0);
+ hythread_sleep(SLEEP_TIME);
status = hythread_monitor_enter(monitor);
tf_assert_same(status, TM_ERROR_NONE);
@@ -92,8 +93,7 @@
tf_assert_same(status, TM_ERROR_NONE);
}
for (i = 0; i < NMB; i++){
- hythread_sleep(100);
- hythread_join(threads[i]);
+ test_thread_join(threads[i], i);
}
return 0;
}
Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c?rev=607049&r1=607048&r2=607049&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c Thu Dec 27 04:21:05 2007
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <open/hythread_ext.h>
#include "testframe.h"
+#include "thread_unit_test_utils.h"
#include "thread_manager.h"
int started_thread_count;
@@ -85,8 +86,7 @@
// resume thread
hythread_resume(thread);
- status = hythread_join(thread);
- tf_assert_same(status, TM_ERROR_NONE);
+ test_thread_join(thread, 1);
tf_assert_same((IDATA)args[2], 1);
@@ -170,8 +170,7 @@
log_info("resume all suspended threads");
for(i = 0; i < THREAD_COUNT; i++) {
- status = hythread_join(thread_list[i]);
- tf_assert_same(status, TM_ERROR_NONE);
+ test_thread_join(thread_list[i], i);
log_info("%d thread is terminated", i + 1);
}
Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c?rev=607049&r1=607048&r2=607049&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c Thu Dec 27 04:21:05 2007
@@ -16,8 +16,9 @@
*/
#include <stdio.h>
-#include "testframe.h"
#include <open/hythread_ext.h>
+#include "testframe.h"
+#include "thread_unit_test_utils.h"
int start_proc(void *);
/*
@@ -143,7 +144,7 @@
status = hythread_thin_monitor_exit(&lockword_ptr);
tf_assert_same(status, TM_ERROR_NONE);
hythread_suspend_enable();
- hythread_join(thread);
+ test_thread_join(thread, 1);
tf_assert_same((IDATA)args[1], 1);
hythread_suspend_disable();
@@ -162,7 +163,7 @@
hythread_suspend_enable();
tf_assert_same(status, TM_ERROR_NONE);
- hythread_join(thread);
+ test_thread_join(thread, 1);
tf_assert_same((IDATA)args[1], 1);
Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c?rev=607049&r1=607048&r2=607049&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c Thu Dec 27 04:21:05 2007
@@ -393,14 +393,21 @@
}
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));
- }
+ test_thread_join(tts->native_thread, tts->my_index);
+}
+
+void test_thread_join(hythread_t native_thread, int index) {
+ int i = 0;
+ do {
+ hythread_sleep(SLEEP_TIME);
+ if(!hythread_is_alive(native_thread)) {
+ break;
+ }
+ if ((i % (MAX_TIME_TO_WAIT / SLEEP_TIME)) == 0) {
+ printf("Thread %i isn't dead after %i milliseconds",
+ index, (++i * SLEEP_TIME));
+ }
+ } while(1);
}
int compare_threads(jthread *threads, int thread_nmb, int compare_from_end) {
Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h?rev=607049&r1=607048&r2=607049&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h Thu Dec 27 04:21:05 2007
@@ -113,6 +113,7 @@
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);
+void test_thread_join(hythread_t native_thread, int index);
int compare_threads(jthread *threads, int thread_nmb, int compare_from_end);
int compare_pointer_sets(void ** set_a, void ** set_b, int nmb);