| /* |
| * Copyright (c) 2015 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <ztest.h> |
| #include <atomic.h> |
| |
| /** |
| * @addtogroup kernel_common_tests |
| * @{ |
| */ |
| |
| /** |
| * @brief Verify automic functionalities |
| * |
| * @see atomic_cas(), atomic_add(), atomic_sub(), |
| * atomic_inc(), atomic_dec(), atomic_get(), atomic_set(), |
| * atomic_clear(), atomic_or(), atomic_and(), atomic_xor(), |
| * atomic_nand(), atomic_test_bit(), atomic_test_and_clear_bit(), |
| * atomic_test_and_set_bit(), atomic_clear_bit(), atomic_set_bit() |
| */ |
| void test_atomic(void) |
| { |
| int i; |
| |
| atomic_t target, orig; |
| atomic_val_t value; |
| atomic_val_t oldvalue; |
| |
| target = 4; |
| value = 5; |
| oldvalue = 6; |
| |
| /* atomic_cas() */ |
| zassert_true((atomic_cas(&target, oldvalue, value) == 0), "atomic_cas"); |
| target = 6; |
| zassert_true((atomic_cas(&target, oldvalue, value) == 1), "atomic_cas"); |
| zassert_true((target == value), "atomic_cas"); |
| |
| /* atomic_add() */ |
| target = 1; |
| value = 2; |
| zassert_true((atomic_add(&target, value) == 1), "atomic_add"); |
| zassert_true((target == 3), "atomic_add"); |
| |
| /* atomic_sub() */ |
| target = 10; |
| value = 2; |
| zassert_true((atomic_sub(&target, value) == 10), "atomic_sub"); |
| zassert_true((target == 8), "atomic_sub"); |
| |
| /* atomic_inc() */ |
| target = 5; |
| zassert_true((atomic_inc(&target) == 5), "atomic_inc"); |
| zassert_true((target == 6), "atomic_inc"); |
| |
| /* atomic_dec() */ |
| target = 2; |
| zassert_true((atomic_dec(&target) == 2), "atomic_dec"); |
| zassert_true((target == 1), "atomic_dec"); |
| |
| /* atomic_get() */ |
| target = 50; |
| zassert_true((atomic_get(&target) == 50), "atomic_get"); |
| |
| /* atomic_set() */ |
| target = 42; |
| value = 77; |
| zassert_true((atomic_set(&target, value) == 42), "atomic_set"); |
| zassert_true((target == value), "atomic_set"); |
| |
| /* atomic_clear() */ |
| target = 100; |
| zassert_true((atomic_clear(&target) == 100), "atomic_clear"); |
| zassert_true((target == 0), "atomic_clear"); |
| |
| /* atomic_or() */ |
| target = 0xFF00; |
| value = 0x0F0F; |
| zassert_true((atomic_or(&target, value) == 0xFF00), "atomic_or"); |
| zassert_true((target == 0xFF0F), "atomic_or"); |
| |
| /* atomic_xor() */ |
| target = 0xFF00; |
| value = 0x0F0F; |
| zassert_true((atomic_xor(&target, value) == 0xFF00), "atomic_xor"); |
| zassert_true((target == 0xF00F), "atomic_xor"); |
| |
| /* atomic_and() */ |
| target = 0xFF00; |
| value = 0x0F0F; |
| zassert_true((atomic_and(&target, value) == 0xFF00), "atomic_and"); |
| zassert_true((target == 0x0F00), "atomic_and"); |
| |
| |
| /* atomic_nand() */ |
| target = 0xFF00; |
| value = 0x0F0F; |
| zassert_true((atomic_nand(&target, value) == 0xFF00), "atomic_nand"); |
| zassert_true((target == 0xFFFFF0FF), "atomic_nand"); |
| |
| /* atomic_test_bit() */ |
| for (i = 0; i < 32; i++) { |
| target = 0x0F0F0F0F; |
| zassert_true(!!(atomic_test_bit(&target, i) == !!(target & (1 << i))), |
| "atomic_test_bit"); |
| } |
| |
| /* atomic_test_and_clear_bit() */ |
| for (i = 0; i < 32; i++) { |
| orig = 0x0F0F0F0F; |
| target = orig; |
| zassert_true(!!(atomic_test_and_clear_bit(&target, i)) == !!(orig & (1 << i)), |
| "atomic_test_and_clear_bit"); |
| zassert_true(target == (orig & ~(1 << i)), "atomic_test_and_clear_bit"); |
| } |
| |
| /* atomic_test_and_set_bit() */ |
| for (i = 0; i < 32; i++) { |
| orig = 0x0F0F0F0F; |
| target = orig; |
| zassert_true(!!(atomic_test_and_set_bit(&target, i)) == !!(orig & (1 << i)), |
| "atomic_test_and_set_bit"); |
| zassert_true(target == (orig | (1 << i)), "atomic_test_and_set_bit"); |
| } |
| |
| /* atomic_clear_bit() */ |
| for (i = 0; i < 32; i++) { |
| orig = 0x0F0F0F0F; |
| target = orig; |
| atomic_clear_bit(&target, i); |
| zassert_true(target == (orig & ~(1 << i)), "atomic_clear_bit"); |
| } |
| |
| /* atomic_set_bit() */ |
| for (i = 0; i < 32; i++) { |
| orig = 0x0F0F0F0F; |
| target = orig; |
| atomic_set_bit(&target, i); |
| zassert_true(target == (orig | (1 << i)), "atomic_set_bit"); |
| } |
| |
| /* atomic_set_bit_to(&target, i, false) */ |
| for (i = 0; i < 32; i++) { |
| orig = 0x0F0F0F0F; |
| target = orig; |
| atomic_set_bit_to(&target, i, false); |
| zassert_true(target == (orig & ~(1 << i)), "atomic_set_bit_to"); |
| } |
| |
| /* atomic_set_bit_to(&target, i, true) */ |
| for (i = 0; i < 32; i++) { |
| orig = 0x0F0F0F0F; |
| target = orig; |
| atomic_set_bit_to(&target, i, true); |
| zassert_true(target == (orig | (1 << i)), "atomic_set_bit_to"); |
| } |
| } |
| /** |
| * @} |
| */ |