diff --git a/src/util/meson.build b/src/util/meson.build index 1f51ec5de8a..292cbe9ebba 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -294,18 +294,6 @@ if with_tests ) endif - test( - 'u_atomic', - executable( - 'u_atomic_test', - files('u_atomic_test.c'), - include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux], - dependencies : idep_mesautil, - c_args : [c_msvc_compat_args], - ), - suite : ['util'], - ) - test( 'blob', executable( @@ -367,6 +355,7 @@ if with_tests 'tests/int_min_max.cpp', 'tests/set_test.cpp', 'tests/vector_test.cpp', + 'u_atomic_test.cpp', 'u_debug_stack_test.cpp', 'u_qsort_test.cpp', ) diff --git a/src/util/u_atomic_test.c b/src/util/u_atomic_test.c deleted file mode 100644 index 7a77768c966..00000000000 --- a/src/util/u_atomic_test.c +++ /dev/null @@ -1,162 +0,0 @@ -/************************************************************************** - * - * Copyright 2014 VMware, Inc. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - **************************************************************************/ - - -/* Force assertions, even on release builds. */ -#undef NDEBUG - - -#include -#include -#include - -#include "u_atomic.h" - -#ifdef _MSC_VER -#pragma warning( disable : 28112 ) /* Accessing a local variable via an Interlocked function */ -#pragma warning( disable : 28113 ) /* A variable which is accessed via an Interlocked function must always be accessed via an Interlocked function */ -#endif - - -/* Test only assignment-like operations, which are supported on all types */ -#define test_atomic_assign(type, ones) \ - static void test_atomic_assign_##type (void) { \ - type v, r; \ - \ - p_atomic_set(&v, ones); \ - assert(v == ones && "p_atomic_set"); \ - \ - r = p_atomic_read(&v); \ - assert(r == ones && "p_atomic_read"); \ - \ - v = ones; \ - r = p_atomic_cmpxchg(&v, 0, 1); \ - assert(v == ones && "p_atomic_cmpxchg"); \ - assert(r == ones && "p_atomic_cmpxchg"); \ - r = p_atomic_cmpxchg(&v, ones, 0); \ - assert(v == 0 && "p_atomic_cmpxchg"); \ - assert(r == ones && "p_atomic_cmpxchg"); \ - \ - (void) r; \ - } - - -/* Test arithmetic operations that are supported on 8 bits integer types */ -#define test_atomic_8bits(type, ones) \ - test_atomic_assign(type, ones) \ - \ - static void test_atomic_8bits_##type (void) { \ - type v, r; \ - \ - test_atomic_assign_##type(); \ - \ - v = 23; \ - p_atomic_add(&v, 42); \ - r = p_atomic_read(&v); \ - assert(r == 65 && "p_atomic_add"); \ - \ - (void) r; \ - } - - -/* Test all operations */ -#define test_atomic(type, ones) \ - test_atomic_8bits(type, ones) \ - \ - static void test_atomic_##type (void) { \ - type v, r; \ - bool b; \ - \ - test_atomic_8bits_##type(); \ - \ - v = 2; \ - b = p_atomic_dec_zero(&v); \ - assert(v == 1 && "p_atomic_dec_zero"); \ - assert(b == false && "p_atomic_dec_zero"); \ - b = p_atomic_dec_zero(&v); \ - assert(v == 0 && "p_atomic_dec_zero"); \ - assert(b == true && "p_atomic_dec_zero"); \ - b = p_atomic_dec_zero(&v); \ - assert(v == ones && "p_atomic_dec_zero"); \ - assert(b == false && "p_atomic_dec_zero"); \ - \ - v = ones; \ - p_atomic_inc(&v); \ - assert(v == 0 && "p_atomic_inc"); \ - \ - v = ones; \ - r = p_atomic_inc_return(&v); \ - assert(v == 0 && "p_atomic_inc_return"); \ - assert(r == v && "p_atomic_inc_return"); \ - \ - v = 0; \ - p_atomic_dec(&v); \ - assert(v == ones && "p_atomic_dec"); \ - \ - v = 0; \ - r = p_atomic_dec_return(&v); \ - assert(v == ones && "p_atomic_dec_return"); \ - assert(r == v && "p_atomic_dec_return"); \ - \ - (void) r; \ - (void) b; \ - } - - -test_atomic(int, -1) -test_atomic(unsigned, ~0U) - -test_atomic(int16_t, INT16_C(-1)) -test_atomic(uint16_t, UINT16_C(0xffff)) -test_atomic(int32_t, INT32_C(-1)) -test_atomic(uint32_t, UINT32_C(0xffffffff)) -test_atomic(int64_t, INT64_C(-1)) -test_atomic(uint64_t, UINT64_C(0xffffffffffffffff)) - -test_atomic_8bits(int8_t, INT8_C(-1)) -test_atomic_8bits(uint8_t, UINT8_C(0xff)) -test_atomic_assign(bool, true) - -int -main() -{ - test_atomic_int(); - test_atomic_unsigned(); - - test_atomic_int16_t(); - test_atomic_uint16_t(); - test_atomic_int32_t(); - test_atomic_uint32_t(); - test_atomic_int64_t(); - test_atomic_uint64_t(); - - test_atomic_8bits_int8_t(); - test_atomic_8bits_uint8_t(); - test_atomic_assign_bool(); - - return 0; -} diff --git a/src/util/u_atomic_test.cpp b/src/util/u_atomic_test.cpp new file mode 100644 index 00000000000..151ef08c7d6 --- /dev/null +++ b/src/util/u_atomic_test.cpp @@ -0,0 +1,138 @@ +/************************************************************************** + * + * Copyright 2014 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#include +#include +#include + +#include "u_atomic.h" + +#ifdef _MSC_VER +#pragma warning( disable : 28112 ) /* Accessing a local variable via an Interlocked function */ +#pragma warning( disable : 28113 ) /* A variable which is accessed via an Interlocked function must always be accessed via an Interlocked function */ +#endif + +template class AtomicAssignment : public testing::Test {}; + +using AtomicAssignmentTypes = + testing::Types; + +TYPED_TEST_SUITE(AtomicAssignment, AtomicAssignmentTypes); + +TYPED_TEST(AtomicAssignment, Test) +{ + TypeParam v, r; + const TypeParam ones = TypeParam(-1); + + p_atomic_set(&v, ones); + ASSERT_EQ(v, ones) << "p_atomic_set"; + + r = p_atomic_read(&v); + ASSERT_EQ(r, ones) << "p_atomic_read"; + + v = ones; + r = p_atomic_cmpxchg(&v, 0, 1); + ASSERT_EQ(v, ones) << "p_atomic_cmpxchg"; + ASSERT_EQ(r, ones) << "p_atomic_cmpxchg"; + + r = p_atomic_cmpxchg(&v, ones, 0); + ASSERT_EQ(v, 0) << "p_atomic_cmpxchg"; + ASSERT_EQ(r, ones) << "p_atomic_cmpxchg"; +} + + +template class AtomicIncrementDecrement : public testing::Test {}; + +using AtomicIncrementDecrementTypes = + testing::Types; + +TYPED_TEST_SUITE(AtomicIncrementDecrement, AtomicIncrementDecrementTypes); + +TYPED_TEST(AtomicIncrementDecrement, Test) +{ + TypeParam v, r; + bool b; + + const TypeParam ones = TypeParam(-1); + + v = 2; + + b = p_atomic_dec_zero(&v); + ASSERT_EQ(v, 1) << "p_atomic_dec_zero"; + ASSERT_FALSE(b) << "p_atomic_dec_zero"; + + b = p_atomic_dec_zero(&v); + ASSERT_EQ(v, 0) << "p_atomic_dec_zero"; + ASSERT_TRUE(b) << "p_atomic_dec_zero"; + + b = p_atomic_dec_zero(&v); + ASSERT_EQ(v, ones) << "p_atomic_dec_zero"; + ASSERT_FALSE(b) << "p_atomic_dec_zero"; + + v = ones; + p_atomic_inc(&v); + ASSERT_EQ(v, 0) << "p_atomic_inc"; + + v = ones; + r = p_atomic_inc_return(&v); + ASSERT_EQ(v, 0) << "p_atomic_inc_return"; + ASSERT_EQ(r, v) << "p_atomic_inc_return"; + + v = 0; + p_atomic_dec(&v); + ASSERT_EQ(v, ones) << "p_atomic_dec"; + + v = 0; + r = p_atomic_dec_return(&v); + ASSERT_EQ(v, ones) << "p_atomic_dec_return"; + ASSERT_EQ(v, r) << "p_atomic_dec_return"; +} + +template class AtomicAdd : public testing::Test {}; + +using AtomicAddTypes = + testing::Types; + +TYPED_TEST_SUITE(AtomicAdd, AtomicAddTypes); + +TYPED_TEST(AtomicAdd, Test) +{ + TypeParam v, r; + + v = 23; + + p_atomic_add(&v, 42); + r = p_atomic_read(&v); + + ASSERT_EQ(r, 65) << "p_atomic_add"; +}