1b8e80941Smrg/************************************************************************** 2b8e80941Smrg * 3b8e80941Smrg * Copyright 2014 VMware, Inc. 4b8e80941Smrg * All Rights Reserved. 5b8e80941Smrg * 6b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a 7b8e80941Smrg * copy of this software and associated documentation files (the 8b8e80941Smrg * "Software"), to deal in the Software without restriction, including 9b8e80941Smrg * without limitation the rights to use, copy, modify, merge, publish, 10b8e80941Smrg * distribute, sub license, and/or sell copies of the Software, and to 11b8e80941Smrg * permit persons to whom the Software is furnished to do so, subject to 12b8e80941Smrg * the following conditions: 13b8e80941Smrg * 14b8e80941Smrg * The above copyright notice and this permission notice (including the 15b8e80941Smrg * next paragraph) shall be included in all copies or substantial portions 16b8e80941Smrg * of the Software. 17b8e80941Smrg * 18b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19b8e80941Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20b8e80941Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21b8e80941Smrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22b8e80941Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23b8e80941Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24b8e80941Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25b8e80941Smrg * 26b8e80941Smrg **************************************************************************/ 27b8e80941Smrg 28b8e80941Smrg 29b8e80941Smrg/* Force assertions, even on release builds. */ 30b8e80941Smrg#undef NDEBUG 31b8e80941Smrg 32b8e80941Smrg 33b8e80941Smrg#include <stdint.h> 34b8e80941Smrg#include <inttypes.h> 35b8e80941Smrg#include <assert.h> 36b8e80941Smrg 37b8e80941Smrg#include "u_atomic.h" 38b8e80941Smrg 39b8e80941Smrg#ifdef _MSC_VER 40b8e80941Smrg#pragma warning( disable : 28112 ) /* Accessing a local variable via an Interlocked function */ 41b8e80941Smrg#pragma warning( disable : 28113 ) /* A variable which is accessed via an Interlocked function must always be accessed via an Interlocked function */ 42b8e80941Smrg#endif 43b8e80941Smrg 44b8e80941Smrg 45b8e80941Smrg/* Test only assignment-like operations, which are supported on all types */ 46b8e80941Smrg#define test_atomic_assign(type, ones) \ 47b8e80941Smrg static void test_atomic_assign_##type (void) { \ 48b8e80941Smrg type v, r; \ 49b8e80941Smrg \ 50b8e80941Smrg p_atomic_set(&v, ones); \ 51b8e80941Smrg assert(v == ones && "p_atomic_set"); \ 52b8e80941Smrg \ 53b8e80941Smrg r = p_atomic_read(&v); \ 54b8e80941Smrg assert(r == ones && "p_atomic_read"); \ 55b8e80941Smrg \ 56b8e80941Smrg v = ones; \ 57b8e80941Smrg r = p_atomic_cmpxchg(&v, 0, 1); \ 58b8e80941Smrg assert(v == ones && "p_atomic_cmpxchg"); \ 59b8e80941Smrg assert(r == ones && "p_atomic_cmpxchg"); \ 60b8e80941Smrg r = p_atomic_cmpxchg(&v, ones, 0); \ 61b8e80941Smrg assert(v == 0 && "p_atomic_cmpxchg"); \ 62b8e80941Smrg assert(r == ones && "p_atomic_cmpxchg"); \ 63b8e80941Smrg \ 64b8e80941Smrg (void) r; \ 65b8e80941Smrg } 66b8e80941Smrg 67b8e80941Smrg 68b8e80941Smrg/* Test arithmetic operations that are supported on 8 bits integer types */ 69b8e80941Smrg#define test_atomic_8bits(type, ones) \ 70b8e80941Smrg test_atomic_assign(type, ones) \ 71b8e80941Smrg \ 72b8e80941Smrg static void test_atomic_8bits_##type (void) { \ 73b8e80941Smrg type v, r; \ 74b8e80941Smrg \ 75b8e80941Smrg test_atomic_assign_##type(); \ 76b8e80941Smrg \ 77b8e80941Smrg v = 23; \ 78b8e80941Smrg p_atomic_add(&v, 42); \ 79b8e80941Smrg r = p_atomic_read(&v); \ 80b8e80941Smrg assert(r == 65 && "p_atomic_add"); \ 81b8e80941Smrg \ 82b8e80941Smrg (void) r; \ 83b8e80941Smrg } 84b8e80941Smrg 85b8e80941Smrg 86b8e80941Smrg/* Test all operations */ 87b8e80941Smrg#define test_atomic(type, ones) \ 88b8e80941Smrg test_atomic_8bits(type, ones) \ 89b8e80941Smrg \ 90b8e80941Smrg static void test_atomic_##type (void) { \ 91b8e80941Smrg type v, r; \ 92b8e80941Smrg bool b; \ 93b8e80941Smrg \ 94b8e80941Smrg test_atomic_8bits_##type(); \ 95b8e80941Smrg \ 96b8e80941Smrg v = 2; \ 97b8e80941Smrg b = p_atomic_dec_zero(&v); \ 98b8e80941Smrg assert(v == 1 && "p_atomic_dec_zero"); \ 99b8e80941Smrg assert(b == false && "p_atomic_dec_zero"); \ 100b8e80941Smrg b = p_atomic_dec_zero(&v); \ 101b8e80941Smrg assert(v == 0 && "p_atomic_dec_zero"); \ 102b8e80941Smrg assert(b == true && "p_atomic_dec_zero"); \ 103b8e80941Smrg b = p_atomic_dec_zero(&v); \ 104b8e80941Smrg assert(v == ones && "p_atomic_dec_zero"); \ 105b8e80941Smrg assert(b == false && "p_atomic_dec_zero"); \ 106b8e80941Smrg \ 107b8e80941Smrg v = ones; \ 108b8e80941Smrg p_atomic_inc(&v); \ 109b8e80941Smrg assert(v == 0 && "p_atomic_inc"); \ 110b8e80941Smrg \ 111b8e80941Smrg v = ones; \ 112b8e80941Smrg r = p_atomic_inc_return(&v); \ 113b8e80941Smrg assert(v == 0 && "p_atomic_inc_return"); \ 114b8e80941Smrg assert(r == v && "p_atomic_inc_return"); \ 115b8e80941Smrg \ 116b8e80941Smrg v = 0; \ 117b8e80941Smrg p_atomic_dec(&v); \ 118b8e80941Smrg assert(v == ones && "p_atomic_dec"); \ 119b8e80941Smrg \ 120b8e80941Smrg v = 0; \ 121b8e80941Smrg r = p_atomic_dec_return(&v); \ 122b8e80941Smrg assert(v == ones && "p_atomic_dec_return"); \ 123b8e80941Smrg assert(r == v && "p_atomic_dec_return"); \ 124b8e80941Smrg \ 125b8e80941Smrg (void) r; \ 126b8e80941Smrg (void) b; \ 127b8e80941Smrg } 128b8e80941Smrg 129b8e80941Smrg 130b8e80941Smrgtest_atomic(int, -1) 131b8e80941Smrgtest_atomic(unsigned, ~0U) 132b8e80941Smrg 133b8e80941Smrgtest_atomic(int16_t, INT16_C(-1)) 134b8e80941Smrgtest_atomic(uint16_t, UINT16_C(0xffff)) 135b8e80941Smrgtest_atomic(int32_t, INT32_C(-1)) 136b8e80941Smrgtest_atomic(uint32_t, UINT32_C(0xffffffff)) 137b8e80941Smrgtest_atomic(int64_t, INT64_C(-1)) 138b8e80941Smrgtest_atomic(uint64_t, UINT64_C(0xffffffffffffffff)) 139b8e80941Smrg 140b8e80941Smrgtest_atomic_8bits(int8_t, INT8_C(-1)) 141b8e80941Smrgtest_atomic_8bits(uint8_t, UINT8_C(0xff)) 142b8e80941Smrgtest_atomic_assign(bool, true) 143b8e80941Smrg 144b8e80941Smrgint 145b8e80941Smrgmain() 146b8e80941Smrg{ 147b8e80941Smrg test_atomic_int(); 148b8e80941Smrg test_atomic_unsigned(); 149b8e80941Smrg 150b8e80941Smrg test_atomic_int16_t(); 151b8e80941Smrg test_atomic_uint16_t(); 152b8e80941Smrg test_atomic_int32_t(); 153b8e80941Smrg test_atomic_uint32_t(); 154b8e80941Smrg test_atomic_int64_t(); 155b8e80941Smrg test_atomic_uint64_t(); 156b8e80941Smrg 157b8e80941Smrg test_atomic_8bits_int8_t(); 158b8e80941Smrg test_atomic_8bits_uint8_t(); 159b8e80941Smrg test_atomic_assign_bool(); 160b8e80941Smrg 161b8e80941Smrg return 0; 162b8e80941Smrg} 163