Added validation test for CAS operations. Maintained the structure
of other atomic tests: one function increments and another decrements
a variable.

Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com>
---
 test/validation/synchronizers/synchronizers.c | 83 +++++++++++++++++++++++++++
 test/validation/synchronizers/synchronizers.h |  1 +
 2 files changed, 84 insertions(+)

diff --git a/test/validation/synchronizers/synchronizers.c 
b/test/validation/synchronizers/synchronizers.c
index 1454264..ece9d4f 100644
--- a/test/validation/synchronizers/synchronizers.c
+++ b/test/validation/synchronizers/synchronizers.c
@@ -1252,6 +1252,58 @@ static void test_atomic_max_64(void)
        }
 }
 
+static void test_atomic_cas_inc_32(void)
+{
+       int i;
+       uint32_t old;
+
+       for (i = 0; i < CNT; i++) {
+               old = odp_atomic_load_u32(&a32u);
+
+               while (odp_atomic_cas_u32(&a32u, &old, old + 1) == 0)
+                       ;
+       }
+}
+
+static void test_atomic_cas_dec_32(void)
+{
+       int i;
+       uint32_t old;
+
+       for (i = 0; i < CNT; i++) {
+               old = odp_atomic_load_u32(&a32u);
+
+               while (odp_atomic_cas_u32(&a32u, &old, old - 1) == 0)
+                       ;
+       }
+}
+
+static void test_atomic_cas_inc_64(void)
+{
+       int i;
+       uint64_t old;
+
+       for (i = 0; i < CNT; i++) {
+               old = odp_atomic_load_u64(&a64u);
+
+               while (odp_atomic_cas_u64(&a64u, &old, old + 1) == 0)
+                       ;
+       }
+}
+
+static void test_atomic_cas_dec_64(void)
+{
+       int i;
+       uint64_t old;
+
+       for (i = 0; i < CNT; i++) {
+               old = odp_atomic_load_u64(&a64u);
+
+               while (odp_atomic_cas_u64(&a64u, &old, old - 1) == 0)
+                       ;
+       }
+}
+
 static void test_atomic_inc_dec_32(void)
 {
        test_atomic_inc_32();
@@ -1312,6 +1364,18 @@ static void test_atomic_max_min_64(void)
        test_atomic_min_64();
 }
 
+static void test_atomic_cas_inc_dec_32(void)
+{
+       test_atomic_cas_inc_32();
+       test_atomic_cas_dec_32();
+}
+
+static void test_atomic_cas_inc_dec_64(void)
+{
+       test_atomic_cas_inc_64();
+       test_atomic_cas_dec_64();
+}
+
 static void test_atomic_init(void)
 {
        odp_atomic_init_u32(&a32u, 0);
@@ -1665,6 +1729,19 @@ static void *test_atomic_max_min_thread(void *arg UNUSED)
        return NULL;
 }
 
+static void *test_atomic_cas_inc_dec_thread(void *arg UNUSED)
+{
+       per_thread_mem_t *per_thread_mem;
+
+       per_thread_mem = thread_init();
+       test_atomic_cas_inc_dec_32();
+       test_atomic_cas_inc_dec_64();
+
+       thread_finalize(per_thread_mem);
+
+       return NULL;
+}
+
 static void test_atomic_functional(void *func_ptr(void *), int check)
 {
        pthrd_arg arg;
@@ -1702,12 +1779,18 @@ void synchronizers_test_atomic_max_min(void)
        test_atomic_functional(test_atomic_max_min_thread, CHECK_MAX_MIN);
 }
 
+void synchronizers_test_atomic_cas_inc_dec(void)
+{
+       test_atomic_functional(test_atomic_cas_inc_dec_thread, 0);
+}
+
 odp_testinfo_t synchronizers_suite_atomic[] = {
        ODP_TEST_INFO(synchronizers_test_atomic_inc_dec),
        ODP_TEST_INFO(synchronizers_test_atomic_add_sub),
        ODP_TEST_INFO(synchronizers_test_atomic_fetch_inc_dec),
        ODP_TEST_INFO(synchronizers_test_atomic_fetch_add_sub),
        ODP_TEST_INFO(synchronizers_test_atomic_max_min),
+       ODP_TEST_INFO(synchronizers_test_atomic_cas_inc_dec),
        ODP_TEST_INFO_NULL,
 };
 
diff --git a/test/validation/synchronizers/synchronizers.h 
b/test/validation/synchronizers/synchronizers.h
index b7531a0..4561d82 100644
--- a/test/validation/synchronizers/synchronizers.h
+++ b/test/validation/synchronizers/synchronizers.h
@@ -29,6 +29,7 @@ void synchronizers_test_atomic_add_sub(void);
 void synchronizers_test_atomic_fetch_inc_dec(void);
 void synchronizers_test_atomic_fetch_add_sub(void);
 void synchronizers_test_atomic_max_min(void);
+void synchronizers_test_atomic_cas_inc_dec(void);
 
 /* test arrays: */
 extern odp_testinfo_t synchronizers_suite_barrier[];
-- 
2.6.3

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to