atomic.c (5987B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "prio.h" 7 #include "prprf.h" 8 #include "pratom.h" 9 10 /* 11 * TODO: create a macro to generate the six lines of code that are repeated 12 * for every test. Also rewrite the statement 13 * result = result | ((EXPRESSION) ? 0 : 1); 14 * as 15 * result |= !(EXPRESSION); 16 */ 17 18 int main(int argc, char** argv) { 19 PRInt32 rv, oldval, test, result = 0; 20 PRFileDesc* output = PR_GetSpecialFD(PR_StandardOutput); 21 22 /***********************/ 23 /* Test the functions. */ 24 /***********************/ 25 26 oldval = test = -2; 27 rv = PR_AtomicIncrement(&test); 28 result = result | ((rv == -1) ? 0 : 1); 29 PR_fprintf(output, "PR_AtomicIncrement(%d) == %d: %s\n", oldval, rv, 30 (rv == -1) ? "PASSED" : "FAILED"); 31 oldval = test; 32 rv = PR_AtomicIncrement(&test); 33 result = result | ((rv == 0) ? 0 : 1); 34 PR_fprintf(output, "PR_AtomicIncrement(%d) == %d: %s\n", oldval, rv, 35 (rv == 0) ? "PASSED" : "FAILED"); 36 oldval = test; 37 rv = PR_AtomicIncrement(&test); 38 result = result | ((rv == 1) ? 0 : 1); 39 PR_fprintf(output, "PR_AtomicIncrement(%d) == %d: %s\n", oldval, rv, 40 (rv == 1) ? "PASSED" : "FAILED"); 41 42 oldval = test = -2; 43 rv = PR_AtomicAdd(&test, 1); 44 result = result | ((rv == -1) ? 0 : 1); 45 PR_fprintf(output, "PR_AtomicAdd(%d,%d) == %d: %s\n", oldval, 1, rv, 46 (rv == -1) ? "PASSED" : "FAILED"); 47 oldval = test; 48 rv = PR_AtomicAdd(&test, 4); 49 result = result | ((rv == 3) ? 0 : 1); 50 PR_fprintf(output, "PR_AtomicAdd(%d,%d) == %d: %s\n", oldval, 4, rv, 51 (rv == 3) ? "PASSED" : "FAILED"); 52 oldval = test; 53 rv = PR_AtomicAdd(&test, -6); 54 result = result | ((rv == -3) ? 0 : 1); 55 PR_fprintf(output, "PR_AtomicAdd(%d,%d) == %d: %s\n", oldval, -6, rv, 56 (rv == -3) ? "PASSED" : "FAILED"); 57 58 oldval = test = 2; 59 rv = PR_AtomicDecrement(&test); 60 result = result | ((rv == 1) ? 0 : 1); 61 PR_fprintf(output, "PR_AtomicDecrement(%d) == %d: %s\n", oldval, rv, 62 (rv == 1) ? "PASSED" : "FAILED"); 63 oldval = test; 64 rv = PR_AtomicDecrement(&test); 65 result = result | ((rv == 0) ? 0 : 1); 66 PR_fprintf(output, "PR_AtomicDecrement(%d) == %d: %s\n", oldval, rv, 67 (rv == 0) ? "PASSED" : "FAILED"); 68 oldval = test; 69 rv = PR_AtomicDecrement(&test); 70 result = result | ((rv == -1) ? 0 : 1); 71 PR_fprintf(output, "PR_AtomicDecrement(%d) == %d: %s\n", oldval, rv, 72 (rv == -1) ? "PASSED" : "FAILED"); 73 74 /* set to a different value */ 75 oldval = test = -2; 76 rv = PR_AtomicSet(&test, 2); 77 result = result | (((rv == -2) && (test == 2)) ? 0 : 1); 78 PR_fprintf(output, "PR_AtomicSet(%d, %d) == %d: %s\n", oldval, 2, rv, 79 ((rv == -2) && (test == 2)) ? "PASSED" : "FAILED"); 80 81 /* set to the same value */ 82 oldval = test = -2; 83 rv = PR_AtomicSet(&test, -2); 84 result = result | (((rv == -2) && (test == -2)) ? 0 : 1); 85 PR_fprintf(output, "PR_AtomicSet(%d, %d) == %d: %s\n", oldval, -2, rv, 86 ((rv == -2) && (test == -2)) ? "PASSED" : "FAILED"); 87 88 /***********************/ 89 /* Test the macros. */ 90 /***********************/ 91 92 oldval = test = -2; 93 rv = PR_ATOMIC_INCREMENT(&test); 94 result = result | ((rv == -1) ? 0 : 1); 95 PR_fprintf(output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", oldval, rv, 96 (rv == -1) ? "PASSED" : "FAILED"); 97 oldval = test; 98 rv = PR_ATOMIC_INCREMENT(&test); 99 result = result | ((rv == 0) ? 0 : 1); 100 PR_fprintf(output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", oldval, rv, 101 (rv == 0) ? "PASSED" : "FAILED"); 102 oldval = test; 103 rv = PR_ATOMIC_INCREMENT(&test); 104 result = result | ((rv == 1) ? 0 : 1); 105 PR_fprintf(output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", oldval, rv, 106 (rv == 1) ? "PASSED" : "FAILED"); 107 108 oldval = test = -2; 109 rv = PR_ATOMIC_ADD(&test, 1); 110 result = result | ((rv == -1) ? 0 : 1); 111 PR_fprintf(output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", oldval, 1, rv, 112 (rv == -1) ? "PASSED" : "FAILED"); 113 oldval = test; 114 rv = PR_ATOMIC_ADD(&test, 4); 115 result = result | ((rv == 3) ? 0 : 1); 116 PR_fprintf(output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", oldval, 4, rv, 117 (rv == 3) ? "PASSED" : "FAILED"); 118 oldval = test; 119 rv = PR_ATOMIC_ADD(&test, -6); 120 result = result | ((rv == -3) ? 0 : 1); 121 PR_fprintf(output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", oldval, -6, rv, 122 (rv == -3) ? "PASSED" : "FAILED"); 123 124 oldval = test = 2; 125 rv = PR_ATOMIC_DECREMENT(&test); 126 result = result | ((rv == 1) ? 0 : 1); 127 PR_fprintf(output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", oldval, rv, 128 (rv == 1) ? "PASSED" : "FAILED"); 129 oldval = test; 130 rv = PR_ATOMIC_DECREMENT(&test); 131 result = result | ((rv == 0) ? 0 : 1); 132 PR_fprintf(output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", oldval, rv, 133 (rv == 0) ? "PASSED" : "FAILED"); 134 oldval = test; 135 rv = PR_ATOMIC_DECREMENT(&test); 136 result = result | ((rv == -1) ? 0 : 1); 137 PR_fprintf(output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", oldval, rv, 138 (rv == -1) ? "PASSED" : "FAILED"); 139 140 /* set to a different value */ 141 oldval = test = -2; 142 rv = PR_ATOMIC_SET(&test, 2); 143 result = result | (((rv == -2) && (test == 2)) ? 0 : 1); 144 PR_fprintf(output, "PR_ATOMIC_SET(%d, %d) == %d: %s\n", oldval, 2, rv, 145 ((rv == -2) && (test == 2)) ? "PASSED" : "FAILED"); 146 147 /* set to the same value */ 148 oldval = test = -2; 149 rv = PR_ATOMIC_SET(&test, -2); 150 result = result | (((rv == -2) && (test == -2)) ? 0 : 1); 151 PR_fprintf(output, "PR_ATOMIC_SET(%d, %d) == %d: %s\n", oldval, -2, rv, 152 ((rv == -2) && (test == -2)) ? "PASSED" : "FAILED"); 153 154 PR_fprintf(output, "Atomic operations test %s\n", 155 (result == 0) ? "PASSED" : "FAILED"); 156 return result; 157 } /* main */ 158 159 /* atomic.c */