1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5/*============================================================
6**
7** Source : test.c
8**
9** Purpose: InterlockedExchangeAdd() function
10**
11**
12**=========================================================*/
13
14/*
15** The InterlockedExchangeAdd function performs an atomic addition of Value
16** to the value pointed to by Addend.
17** The result is stored in the address specified by Addend.
18** The initial value of the variable pointed to by Addend is returned as the function value.
19*/
20#include <palsuite.h>
21
22int __cdecl main(int argc, char *argv[])
23{
24
25 LONG TheReturn;
26
27 LONG *ptrValue = NULL;
28 /*
29 * Initialize the PAL and return FAILURE if this fails
30 */
31
32 if(0 != (PAL_Initialize(argc, argv)))
33 {
34 return FAIL;
35 }
36
37
38
39#if defined(BIT64)
40 ptrValue = (LONG *) malloc(sizeof(LONG));
41
42 if(ptrValue == NULL)
43 {
44 Fail("Error:%d:Malloc failed for ptrValue\n", GetLastError());
45 }
46
47 *ptrValue = (LONG) 0;
48
49 TheReturn = InterlockedExchangeAdd( ptrValue, (LONG) 5);
50
51
52 /* Added, it should be 5 now */
53 if(*ptrValue != 5)
54 {
55
56 Trace("ERROR: After an add operation, the value should be 5, "
57 "but it is really %d.", *ptrValue);
58 free(ptrValue);
59 Fail("");
60 }
61
62 /* Check to make sure the function returns the original value (5 in this case) */
63 if(TheReturn != 0)
64 {
65 Trace("ERROR: The function should have returned the new value of %d "
66 "but instead returned %d.", *ptrValue, TheReturn);
67 free(ptrValue);
68 Fail("");
69 }
70
71 TheReturn = InterlockedExchangeAdd( ptrValue, (LONG) 1);
72
73
74 /* Added twice, it should be 6 now */
75 if(*ptrValue != 6)
76 {
77
78 Trace("ERROR: After having two add operations, the value should be 6, "
79 "but it is really %d.", *ptrValue);
80 free(ptrValue);
81 Fail("");
82 }
83
84 /* Check to make sure the function returns the original value (5 in this case) */
85 if(TheReturn != 5)
86 {
87 Trace("ERROR: The function should have returned the new value of %d "
88 "but instead returned %d.", *ptrValue, TheReturn);
89 free(ptrValue);
90 Fail("");
91 }
92
93 free(ptrValue);
94#endif
95 PAL_Terminate();
96 return PASS;
97}
98
99
100
101
102
103