aboutsummaryrefslogtreecommitdiff
path: root/test/validation
diff options
context:
space:
mode:
authorStuart Haslam <stuart.haslam@linaro.org>2015-07-20 18:31:04 +0100
committerMaxim Uvarov <maxim.uvarov@linaro.org>2015-07-23 19:21:52 +0300
commit0538ea85a51f33ea477d2cb152c8b13d399e9456 (patch)
tree520b4b8d26588b9b01e9922fcae8c40c0dd07fa9 /test/validation
parent1a56ad5876d266dcf780f873fabf9dd6052df252 (diff)
validation: thrmask: test worker and control APIs
Add tests for odp_thrmask_worker() and odp_thrmask_control() Change-Id: Idf7ef8b8ec5b20b7aeab11b849076efbcdcbd544 Signed-off-by: Stuart Haslam <stuart.haslam@linaro.org> Reviewed-by: Christophe Milard <christophe.milard@linaro.org>
Diffstat (limited to 'test/validation')
-rw-r--r--test/validation/thread/thread.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/test/validation/thread/thread.c b/test/validation/thread/thread.c
index d8ea8b0ba..6fbdaef45 100644
--- a/test/validation/thread/thread.c
+++ b/test/validation/thread/thread.c
@@ -7,11 +7,16 @@
#include <odp.h>
#include <odp_cunit_common.h>
#include <mask_common.h>
+#include <test_debug.h>
#include "thread.h"
/* Helper macro for CU_TestInfo initialization */
#define _CU_TEST_INFO(test_func) {#test_func, test_func}
+/* Test thread entry and exit synchronization barriers */
+odp_barrier_t bar_entry;
+odp_barrier_t bar_exit;
+
static void thread_test_odp_cpu_id(void)
{
(void)odp_cpu_id();
@@ -30,6 +35,69 @@ static void thread_test_odp_thread_count(void)
CU_PASS();
}
+static void *thread_func(void *arg TEST_UNUSED)
+{
+ /* indicate that thread has started */
+ odp_barrier_wait(&bar_entry);
+
+ CU_ASSERT(odp_thread_type() == ODP_THREAD_WORKER);
+
+ /* wait for indication that we can exit */
+ odp_barrier_wait(&bar_exit);
+
+ return NULL;
+}
+
+static void thread_test_odp_thrmask_worker(void)
+{
+ odp_thrmask_t mask;
+ int ret;
+ pthrd_arg args = { .testcase = 0, .numthrds = 1 };
+
+ CU_ASSERT_FATAL(odp_thread_type() == ODP_THREAD_CONTROL);
+
+ odp_barrier_init(&bar_entry, args.numthrds + 1);
+ odp_barrier_init(&bar_exit, args.numthrds + 1);
+
+ /* should start out with 0 worker threads */
+ ret = odp_thrmask_worker(&mask);
+ CU_ASSERT(ret == odp_thrmask_count(&mask));
+ CU_ASSERT(ret == 0);
+
+ /* start the test thread(s) */
+ ret = odp_cunit_thread_create(thread_func, &args);
+ CU_ASSERT(ret == args.numthrds);
+
+ if (ret != args.numthrds)
+ return;
+
+ /* wait for thread(s) to start */
+ odp_barrier_wait(&bar_entry);
+
+ ret = odp_thrmask_worker(&mask);
+ CU_ASSERT(ret == odp_thrmask_count(&mask));
+ CU_ASSERT(ret == args.numthrds);
+ CU_ASSERT(ret <= ODP_CONFIG_MAX_THREADS);
+
+ /* allow thread(s) to exit */
+ odp_barrier_wait(&bar_exit);
+
+ odp_cunit_thread_exit(&args);
+}
+
+static void thread_test_odp_thrmask_control(void)
+{
+ odp_thrmask_t mask;
+ int ret;
+
+ CU_ASSERT(odp_thread_type() == ODP_THREAD_CONTROL);
+
+ /* should start out with 1 worker thread */
+ ret = odp_thrmask_control(&mask);
+ CU_ASSERT(ret == odp_thrmask_count(&mask));
+ CU_ASSERT(ret == 1);
+}
+
static CU_TestInfo thread_suite[] = {
_CU_TEST_INFO(thread_test_odp_cpu_id),
_CU_TEST_INFO(thread_test_odp_thread_id),
@@ -48,6 +116,8 @@ static CU_TestInfo thread_suite[] = {
_CU_TEST_INFO(thread_test_odp_thrmask_first),
_CU_TEST_INFO(thread_test_odp_thrmask_last),
_CU_TEST_INFO(thread_test_odp_thrmask_next),
+ _CU_TEST_INFO(thread_test_odp_thrmask_worker),
+ _CU_TEST_INFO(thread_test_odp_thrmask_control),
CU_TEST_INFO_NULL,
};