1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/nsprpub/pr/tests/atomic.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,183 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "prio.h" 1.10 +#include "prprf.h" 1.11 +#include "pratom.h" 1.12 + 1.13 +/* 1.14 + * TODO: create a macro to generate the six lines of code that are repeated 1.15 + * for every test. Also rewrite the statement 1.16 + * result = result | ((EXPRESSION) ? 0 : 1); 1.17 + * as 1.18 + * result |= !(EXPRESSION); 1.19 + */ 1.20 + 1.21 +int main(int argc, char **argv) 1.22 +{ 1.23 + PRInt32 rv, oldval, test, result = 0; 1.24 + PRFileDesc *output = PR_GetSpecialFD(PR_StandardOutput); 1.25 + 1.26 + /***********************/ 1.27 + /* Test the functions. */ 1.28 + /***********************/ 1.29 + 1.30 + oldval = test = -2; 1.31 + rv = PR_AtomicIncrement(&test); 1.32 + result = result | ((rv == -1) ? 0 : 1); 1.33 + PR_fprintf( 1.34 + output, "PR_AtomicIncrement(%d) == %d: %s\n", 1.35 + oldval, rv, (rv == -1) ? "PASSED" : "FAILED"); 1.36 + oldval = test; 1.37 + rv = PR_AtomicIncrement(&test); 1.38 + result = result | ((rv == 0) ? 0 : 1); 1.39 + PR_fprintf( 1.40 + output, "PR_AtomicIncrement(%d) == %d: %s\n", 1.41 + oldval, rv, (rv == 0) ? "PASSED" : "FAILED"); 1.42 + oldval = test; 1.43 + rv = PR_AtomicIncrement(&test); 1.44 + result = result | ((rv == 1) ? 0 : 1); 1.45 + PR_fprintf( 1.46 + output, "PR_AtomicIncrement(%d) == %d: %s\n", 1.47 + oldval, rv, (rv == 1) ? "PASSED" : "FAILED"); 1.48 + 1.49 + oldval = test = -2; 1.50 + rv = PR_AtomicAdd(&test,1); 1.51 + result = result | ((rv == -1) ? 0 : 1); 1.52 + PR_fprintf( 1.53 + output, "PR_AtomicAdd(%d,%d) == %d: %s\n", 1.54 + oldval, 1, rv, (rv == -1) ? "PASSED" : "FAILED"); 1.55 + oldval = test; 1.56 + rv = PR_AtomicAdd(&test, 4); 1.57 + result = result | ((rv == 3) ? 0 : 1); 1.58 + PR_fprintf( 1.59 + output, "PR_AtomicAdd(%d,%d) == %d: %s\n", 1.60 + oldval, 4, rv, (rv == 3) ? "PASSED" : "FAILED"); 1.61 + oldval = test; 1.62 + rv = PR_AtomicAdd(&test, -6); 1.63 + result = result | ((rv == -3) ? 0 : 1); 1.64 + PR_fprintf( 1.65 + output, "PR_AtomicAdd(%d,%d) == %d: %s\n", 1.66 + oldval, -6, rv, (rv == -3) ? "PASSED" : "FAILED"); 1.67 + 1.68 + oldval = test = 2; 1.69 + rv = PR_AtomicDecrement(&test); 1.70 + result = result | ((rv == 1) ? 0 : 1); 1.71 + PR_fprintf( 1.72 + output, "PR_AtomicDecrement(%d) == %d: %s\n", 1.73 + oldval, rv, (rv == 1) ? "PASSED" : "FAILED"); 1.74 + oldval = test; 1.75 + rv = PR_AtomicDecrement(&test); 1.76 + result = result | ((rv == 0) ? 0 : 1); 1.77 + PR_fprintf( 1.78 + output, "PR_AtomicDecrement(%d) == %d: %s\n", 1.79 + oldval, rv, (rv == 0) ? "PASSED" : "FAILED"); 1.80 + oldval = test; 1.81 + rv = PR_AtomicDecrement(&test); 1.82 + result = result | ((rv == -1) ? 0 : 1); 1.83 + PR_fprintf( 1.84 + output, "PR_AtomicDecrement(%d) == %d: %s\n", 1.85 + oldval, rv, (rv == -1) ? "PASSED" : "FAILED"); 1.86 + 1.87 + /* set to a different value */ 1.88 + oldval = test = -2; 1.89 + rv = PR_AtomicSet(&test, 2); 1.90 + result = result | (((rv == -2) && (test == 2)) ? 0 : 1); 1.91 + PR_fprintf( 1.92 + output, "PR_AtomicSet(%d, %d) == %d: %s\n", 1.93 + oldval, 2, rv, ((rv == -2) && (test == 2)) ? "PASSED" : "FAILED"); 1.94 + 1.95 + /* set to the same value */ 1.96 + oldval = test = -2; 1.97 + rv = PR_AtomicSet(&test, -2); 1.98 + result = result | (((rv == -2) && (test == -2)) ? 0 : 1); 1.99 + PR_fprintf( 1.100 + output, "PR_AtomicSet(%d, %d) == %d: %s\n", 1.101 + oldval, -2, rv, ((rv == -2) && (test == -2)) ? "PASSED" : "FAILED"); 1.102 + 1.103 + /***********************/ 1.104 + /* Test the macros. */ 1.105 + /***********************/ 1.106 + 1.107 + oldval = test = -2; 1.108 + rv = PR_ATOMIC_INCREMENT(&test); 1.109 + result = result | ((rv == -1) ? 0 : 1); 1.110 + PR_fprintf( 1.111 + output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", 1.112 + oldval, rv, (rv == -1) ? "PASSED" : "FAILED"); 1.113 + oldval = test; 1.114 + rv = PR_ATOMIC_INCREMENT(&test); 1.115 + result = result | ((rv == 0) ? 0 : 1); 1.116 + PR_fprintf( 1.117 + output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", 1.118 + oldval, rv, (rv == 0) ? "PASSED" : "FAILED"); 1.119 + oldval = test; 1.120 + rv = PR_ATOMIC_INCREMENT(&test); 1.121 + result = result | ((rv == 1) ? 0 : 1); 1.122 + PR_fprintf( 1.123 + output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", 1.124 + oldval, rv, (rv == 1) ? "PASSED" : "FAILED"); 1.125 + 1.126 + oldval = test = -2; 1.127 + rv = PR_ATOMIC_ADD(&test,1); 1.128 + result = result | ((rv == -1) ? 0 : 1); 1.129 + PR_fprintf( 1.130 + output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", 1.131 + oldval, 1, rv, (rv == -1) ? "PASSED" : "FAILED"); 1.132 + oldval = test; 1.133 + rv = PR_ATOMIC_ADD(&test, 4); 1.134 + result = result | ((rv == 3) ? 0 : 1); 1.135 + PR_fprintf( 1.136 + output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", 1.137 + oldval, 4, rv, (rv == 3) ? "PASSED" : "FAILED"); 1.138 + oldval = test; 1.139 + rv = PR_ATOMIC_ADD(&test, -6); 1.140 + result = result | ((rv == -3) ? 0 : 1); 1.141 + PR_fprintf( 1.142 + output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", 1.143 + oldval, -6, rv, (rv == -3) ? "PASSED" : "FAILED"); 1.144 + 1.145 + oldval = test = 2; 1.146 + rv = PR_ATOMIC_DECREMENT(&test); 1.147 + result = result | ((rv == 1) ? 0 : 1); 1.148 + PR_fprintf( 1.149 + output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", 1.150 + oldval, rv, (rv == 1) ? "PASSED" : "FAILED"); 1.151 + oldval = test; 1.152 + rv = PR_ATOMIC_DECREMENT(&test); 1.153 + result = result | ((rv == 0) ? 0 : 1); 1.154 + PR_fprintf( 1.155 + output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", 1.156 + oldval, rv, (rv == 0) ? "PASSED" : "FAILED"); 1.157 + oldval = test; 1.158 + rv = PR_ATOMIC_DECREMENT(&test); 1.159 + result = result | ((rv == -1) ? 0 : 1); 1.160 + PR_fprintf( 1.161 + output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", 1.162 + oldval, rv, (rv == -1) ? "PASSED" : "FAILED"); 1.163 + 1.164 + /* set to a different value */ 1.165 + oldval = test = -2; 1.166 + rv = PR_ATOMIC_SET(&test, 2); 1.167 + result = result | (((rv == -2) && (test == 2)) ? 0 : 1); 1.168 + PR_fprintf( 1.169 + output, "PR_ATOMIC_SET(%d, %d) == %d: %s\n", 1.170 + oldval, 2, rv, ((rv == -2) && (test == 2)) ? "PASSED" : "FAILED"); 1.171 + 1.172 + /* set to the same value */ 1.173 + oldval = test = -2; 1.174 + rv = PR_ATOMIC_SET(&test, -2); 1.175 + result = result | (((rv == -2) && (test == -2)) ? 0 : 1); 1.176 + PR_fprintf( 1.177 + output, "PR_ATOMIC_SET(%d, %d) == %d: %s\n", 1.178 + oldval, -2, rv, ((rv == -2) && (test == -2)) ? "PASSED" : "FAILED"); 1.179 + 1.180 + PR_fprintf( 1.181 + output, "Atomic operations test %s\n", 1.182 + (result == 0) ? "PASSED" : "FAILED"); 1.183 + return result; 1.184 +} /* main */ 1.185 + 1.186 +/* atomic.c */