xref: /aosp_15_r20/external/fastrpc/inc/AEEatomic.h (revision 418b791d679beb2078b579a3b6936cf330c41799)
1*418b791dSBob Badour /**
2*418b791dSBob Badour  * Copyright (c) 2019, The Linux Foundation. All rights reserved.
3*418b791dSBob Badour  *
4*418b791dSBob Badour  * Redistribution and use in source and binary forms, with or without
5*418b791dSBob Badour  * modification, are permitted provided that the following conditions are
6*418b791dSBob Badour  * met:
7*418b791dSBob Badour  *    * Redistributions of source code must retain the above copyright
8*418b791dSBob Badour  *      notice, this list of conditions and the following disclaimer.
9*418b791dSBob Badour  *    * Redistributions in binary form must reproduce the above
10*418b791dSBob Badour  *      copyright notice, this list of conditions and the following
11*418b791dSBob Badour  *      disclaimer in the documentation and/or other materials provided
12*418b791dSBob Badour  *      with the distribution.
13*418b791dSBob Badour  *    * Neither the name of The Linux Foundation nor the names of its
14*418b791dSBob Badour  *      contributors may be used to endorse or promote products derived
15*418b791dSBob Badour  *      from this software without specific prior written permission.
16*418b791dSBob Badour  *
17*418b791dSBob Badour  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18*418b791dSBob Badour  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*418b791dSBob Badour  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20*418b791dSBob Badour  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21*418b791dSBob Badour  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*418b791dSBob Badour  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*418b791dSBob Badour  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24*418b791dSBob Badour  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25*418b791dSBob Badour  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26*418b791dSBob Badour  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*418b791dSBob Badour  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*418b791dSBob Badour  */
29*418b791dSBob Badour 
30*418b791dSBob Badour #ifndef AEEATOMIC_H
31*418b791dSBob Badour #define AEEATOMIC_H
32*418b791dSBob Badour /*
33*418b791dSBob Badour =======================================================================
34*418b791dSBob Badour 
35*418b791dSBob Badour FILE:         AEEatomic.h
36*418b791dSBob Badour 
37*418b791dSBob Badour SERVICES:     atomic
38*418b791dSBob Badour 
39*418b791dSBob Badour DESCRIPTION:  Fast Atomic ops
40*418b791dSBob Badour 
41*418b791dSBob Badour =======================================================================
42*418b791dSBob Badour */
43*418b791dSBob Badour 
44*418b791dSBob Badour #include "AEEStdDef.h"
45*418b791dSBob Badour 
46*418b791dSBob Badour #ifdef __cplusplus
47*418b791dSBob Badour extern "C" {
48*418b791dSBob Badour #endif /* #ifdef __cplusplus */
49*418b791dSBob Badour 
50*418b791dSBob Badour uint32 atomic_Add(uint32 * volatile puDest, int nAdd);
51*418b791dSBob Badour uint32 atomic_Exchange(uint32 * volatile puDest, uint32 uVal);
52*418b791dSBob Badour uint32 atomic_CompareAndExchange(uint32 * volatile puDest, uint32 uExchange, uint32 uCompare);
53*418b791dSBob Badour uint32 atomic_CompareOrAdd(uint32 * volatile puDest, uint32 uCompare, int nAdd);
54*418b791dSBob Badour 
55*418b791dSBob Badour uint64 atomic_CompareAndExchange64(uint64 * volatile puDest, uint64 uExchange, uint64 uCompare);
56*418b791dSBob Badour uintptr_t atomic_CompareAndExchangeUP(uintptr_t * volatile puDest, uintptr_t uExchange, uintptr_t uCompare);
57*418b791dSBob Badour #ifdef __cplusplus
58*418b791dSBob Badour }
59*418b791dSBob Badour #endif /* #ifdef __cplusplus */
60*418b791dSBob Badour 
61*418b791dSBob Badour /*=====================================================================
62*418b791dSBob Badour INTERFACE DOCUMENTATION
63*418b791dSBob Badour =======================================================================
64*418b791dSBob Badour atomic Interface
65*418b791dSBob Badour 
66*418b791dSBob Badour   The atomic interface provides fast "atomic" operations.  The
67*418b791dSBob Badour    operations are defined to be atomic with respect to each other.
68*418b791dSBob Badour 
69*418b791dSBob Badour =======================================================================
70*418b791dSBob Badour 
71*418b791dSBob Badour =======================================================================
72*418b791dSBob Badour 
73*418b791dSBob Badour atomic_Add()
74*418b791dSBob Badour 
75*418b791dSBob Badour Description:
76*418b791dSBob Badour 
77*418b791dSBob Badour    Performs an atomic sum operation.
78*418b791dSBob Badour 
79*418b791dSBob Badour Prototype:
80*418b791dSBob Badour 
81*418b791dSBob Badour    uint32 atomic_Add(uint32* puDest, int nInc);
82*418b791dSBob Badour 
83*418b791dSBob Badour Parameters:
84*418b791dSBob Badour    puDest [in|out] : Points to unsigned number to add nInc and save
85*418b791dSBob Badour    nInc : increment
86*418b791dSBob Badour 
87*418b791dSBob Badour Return Value:
88*418b791dSBob Badour    result.
89*418b791dSBob Badour 
90*418b791dSBob Badour Comments:
91*418b791dSBob Badour    None
92*418b791dSBob Badour 
93*418b791dSBob Badour Side Effects:
94*418b791dSBob Badour    None
95*418b791dSBob Badour 
96*418b791dSBob Badour See Also:
97*418b791dSBob Badour    None
98*418b791dSBob Badour 
99*418b791dSBob Badour =======================================================================
100*418b791dSBob Badour 
101*418b791dSBob Badour atomic_Exchange()
102*418b791dSBob Badour 
103*418b791dSBob Badour Description:
104*418b791dSBob Badour 
105*418b791dSBob Badour    Atomic exchange of 32bit value. Performs an atomic operation of :
106*418b791dSBob Badour       write uVal to *puDest
107*418b791dSBob Badour       return the previous value in *puDest
108*418b791dSBob Badour 
109*418b791dSBob Badour Prototype:
110*418b791dSBob Badour 
111*418b791dSBob Badour    uint32 atomic_Exchange(uint32* puDest, uint32 uVal);
112*418b791dSBob Badour 
113*418b791dSBob Badour Parameters:
114*418b791dSBob Badour    puDest [in|out] : Points to unsigned number to be exchanged
115*418b791dSBob Badour    uVal : new value to write.
116*418b791dSBob Badour 
117*418b791dSBob Badour Return Value:
118*418b791dSBob Badour    previous value at *puDest.
119*418b791dSBob Badour 
120*418b791dSBob Badour Comments:
121*418b791dSBob Badour    None
122*418b791dSBob Badour 
123*418b791dSBob Badour Side Effects:
124*418b791dSBob Badour    May cause exception if puDest is not a 32 bit aligned address.
125*418b791dSBob Badour 
126*418b791dSBob Badour See Also:
127*418b791dSBob Badour    None
128*418b791dSBob Badour =======================================================================
129*418b791dSBob Badour 
130*418b791dSBob Badour atomic_CompareAndExchange()
131*418b791dSBob Badour 
132*418b791dSBob Badour Description:
133*418b791dSBob Badour 
134*418b791dSBob Badour    Performs an atomic operation of :
135*418b791dSBob Badour       if (*puDest == uCompare) {
136*418b791dSBob Badour          *puDest = uExchange;
137*418b791dSBob Badour       }
138*418b791dSBob Badour 
139*418b791dSBob Badour    returns the previous value in *puDest
140*418b791dSBob Badour 
141*418b791dSBob Badour Prototype:
142*418b791dSBob Badour 
143*418b791dSBob Badour    uint32 atomic_CompareAndExchange(uint32 *puDest, uint32 uExchange,
144*418b791dSBob Badour                                     uint32 uCompare);
145*418b791dSBob Badour 
146*418b791dSBob Badour Parameters:
147*418b791dSBob Badour    puDest [in|out] : Points to unsigned number.
148*418b791dSBob Badour    uExchange : A new value to write to *puDest
149*418b791dSBob Badour    uCompare : Comparand
150*418b791dSBob Badour 
151*418b791dSBob Badour Return Value:
152*418b791dSBob Badour    previous value at *puDest.
153*418b791dSBob Badour 
154*418b791dSBob Badour Comments:
155*418b791dSBob Badour    None
156*418b791dSBob Badour 
157*418b791dSBob Badour Side Effects:
158*418b791dSBob Badour    May cause exception if puDest is not a 32 bit aligned address.
159*418b791dSBob Badour 
160*418b791dSBob Badour See Also:
161*418b791dSBob Badour    None
162*418b791dSBob Badour 
163*418b791dSBob Badour =======================================================================
164*418b791dSBob Badour atomic_CompareOrAdd()
165*418b791dSBob Badour 
166*418b791dSBob Badour Description:
167*418b791dSBob Badour 
168*418b791dSBob Badour    Performs an atomic operation of :
169*418b791dSBob Badour       if (*puDest != uCompare) {
170*418b791dSBob Badour          *puDest += nAdd;
171*418b791dSBob Badour       }
172*418b791dSBob Badour 
173*418b791dSBob Badour    returns the new value in *puDest
174*418b791dSBob Badour 
175*418b791dSBob Badour Prototype:
176*418b791dSBob Badour 
177*418b791dSBob Badour    uint32 atomic_CompareOrAdd(uint32 *puDest, uint32 uCompare, int nAdd);
178*418b791dSBob Badour 
179*418b791dSBob Badour Parameters:
180*418b791dSBob Badour    puDest [in|out] : Points to unsigned number.
181*418b791dSBob Badour    uCompare : Comparand
182*418b791dSBob Badour    nAdd : Add to *puDest
183*418b791dSBob Badour 
184*418b791dSBob Badour Return Value:
185*418b791dSBob Badour    new value at *puDest.
186*418b791dSBob Badour 
187*418b791dSBob Badour Comments:
188*418b791dSBob Badour    None
189*418b791dSBob Badour 
190*418b791dSBob Badour Side Effects:
191*418b791dSBob Badour    May cause exception if puDest is not a 32 bit aligned address.
192*418b791dSBob Badour 
193*418b791dSBob Badour See Also:
194*418b791dSBob Badour    None
195*418b791dSBob Badour =======================================================================*/
196*418b791dSBob Badour 
197*418b791dSBob Badour #endif /* #ifndef AEEATOMIC_H */
198*418b791dSBob Badour 
199