• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3  * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this list of
9  *    conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12  *    of conditions and the following disclaimer in the documentation and/or other materials
13  *    provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16  *    to endorse or promote products derived from this software without specific prior written
17  *    permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _LOS_ARCH_ATOMIC_H
33 #define _LOS_ARCH_ATOMIC_H
34 
35 #include "los_compiler.h"
36 
37 #ifdef __cplusplus
38 #if __cplusplus
39 extern "C" {
40 #endif /* __cplusplus */
41 #endif /* __cplusplus */
42 
ArchAtomicRead(const Atomic * v)43 STATIC INLINE INT32 ArchAtomicRead(const Atomic *v)
44 {
45     return *v;
46 }
47 
ArchAtomicSet(Atomic * v,INT32 setVal)48 STATIC INLINE VOID ArchAtomicSet(Atomic *v, INT32 setVal)
49 {
50     UINT32 intSave;
51 
52     intSave = LOS_IntLock();
53     *v = setVal;
54     LOS_IntRestore(intSave);
55 }
56 
ArchAtomicAdd(Atomic * v,INT32 addVal)57 STATIC INLINE INT32 ArchAtomicAdd(Atomic *v, INT32 addVal)
58 {
59     INT32 val;
60     UINT32 intSave;
61 
62     intSave = LOS_IntLock();
63     *v += addVal;
64     val = *v;
65     LOS_IntRestore(intSave);
66 
67     return val;
68 }
69 
ArchAtomicSub(Atomic * v,INT32 subVal)70 STATIC INLINE INT32 ArchAtomicSub(Atomic *v, INT32 subVal)
71 {
72     INT32 val;
73     UINT32 intSave;
74 
75     intSave = LOS_IntLock();
76     *v -= subVal;
77     val = *v;
78     LOS_IntRestore(intSave);
79 
80     return val;
81 }
82 
ArchAtomicInc(Atomic * v)83 STATIC INLINE VOID ArchAtomicInc(Atomic *v)
84 {
85     (VOID)ArchAtomicAdd(v, 1);
86 }
87 
ArchAtomicDec(Atomic * v)88 STATIC INLINE VOID ArchAtomicDec(Atomic *v)
89 {
90     (VOID)ArchAtomicSub(v, 1);
91 }
92 
ArchAtomicIncRet(Atomic * v)93 STATIC INLINE INT32 ArchAtomicIncRet(Atomic *v)
94 {
95     return ArchAtomicAdd(v, 1);
96 }
97 
ArchAtomicDecRet(Atomic * v)98 STATIC INLINE INT32 ArchAtomicDecRet(Atomic *v)
99 {
100     return ArchAtomicSub(v, 1);
101 }
102 
ArchAtomicXchg32bits(Atomic * v,INT32 val)103 STATIC INLINE INT32 ArchAtomicXchg32bits(Atomic *v, INT32 val)
104 {
105     INT32 prevVal;
106     UINT32 intSave;
107 
108     intSave = LOS_IntLock();
109     prevVal = *v;
110     *v = val;
111     LOS_IntRestore(intSave);
112 
113     return prevVal;
114 }
115 
ArchAtomicCmpXchg32bits(Atomic * v,INT32 val,INT32 oldVal)116 STATIC INLINE BOOL ArchAtomicCmpXchg32bits(Atomic *v, INT32 val, INT32 oldVal)
117 {
118     INT32 prevVal;
119     UINT32 intSave;
120 
121     intSave = LOS_IntLock();
122     prevVal = *v;
123     if (prevVal == oldVal) {
124         *v = val;
125     }
126     LOS_IntRestore(intSave);
127 
128     return prevVal != oldVal;
129 }
130 
ArchAtomic64Read(const Atomic64 * v)131 STATIC INLINE INT64 ArchAtomic64Read(const Atomic64 *v)
132 {
133     INT64 val;
134     UINT32 intSave;
135 
136     intSave = LOS_IntLock();
137     val = *v;
138     LOS_IntRestore(intSave);
139 
140     return val;
141 }
142 
ArchAtomic64Set(Atomic64 * v,INT64 setVal)143 STATIC INLINE VOID ArchAtomic64Set(Atomic64 *v, INT64 setVal)
144 {
145     UINT32 intSave;
146 
147     intSave = LOS_IntLock();
148     *v = setVal;
149     LOS_IntRestore(intSave);
150 }
151 
ArchAtomic64Add(Atomic64 * v,INT64 addVal)152 STATIC INLINE INT64 ArchAtomic64Add(Atomic64 *v, INT64 addVal)
153 {
154     INT64 val;
155     UINT32 intSave;
156 
157     intSave = LOS_IntLock();
158     *v += addVal;
159     val = *v;
160     LOS_IntRestore(intSave);
161 
162     return val;
163 }
164 
ArchAtomic64Sub(Atomic64 * v,INT64 subVal)165 STATIC INLINE INT64 ArchAtomic64Sub(Atomic64 *v, INT64 subVal)
166 {
167     INT64 val;
168     UINT32 intSave;
169 
170     intSave = LOS_IntLock();
171     *v -= subVal;
172     val = *v;
173     LOS_IntRestore(intSave);
174 
175     return val;
176 }
177 
ArchAtomic64Inc(Atomic64 * v)178 STATIC INLINE VOID ArchAtomic64Inc(Atomic64 *v)
179 {
180     (VOID)ArchAtomic64Add(v, 1);
181 }
182 
ArchAtomic64IncRet(Atomic64 * v)183 STATIC INLINE INT64 ArchAtomic64IncRet(Atomic64 *v)
184 {
185     return ArchAtomic64Add(v, 1);
186 }
187 
ArchAtomic64Dec(Atomic64 * v)188 STATIC INLINE VOID ArchAtomic64Dec(Atomic64 *v)
189 {
190     (VOID)ArchAtomic64Sub(v, 1);
191 }
192 
ArchAtomic64DecRet(Atomic64 * v)193 STATIC INLINE INT64 ArchAtomic64DecRet(Atomic64 *v)
194 {
195     return ArchAtomic64Sub(v, 1);
196 }
197 
ArchAtomicXchg64bits(Atomic64 * v,INT64 val)198 STATIC INLINE INT64 ArchAtomicXchg64bits(Atomic64 *v, INT64 val)
199 {
200     INT64 prevVal;
201     UINT32 intSave;
202 
203     intSave = LOS_IntLock();
204     prevVal = *v;
205     *v = val;
206     LOS_IntRestore(intSave);
207 
208     return prevVal;
209 }
210 
ArchAtomicCmpXchg64bits(Atomic64 * v,INT64 val,INT64 oldVal)211 STATIC INLINE BOOL ArchAtomicCmpXchg64bits(Atomic64 *v, INT64 val, INT64 oldVal)
212 {
213     INT64 prevVal;
214     UINT32 intSave;
215 
216     intSave = LOS_IntLock();
217     prevVal = *v;
218     if (prevVal == oldVal) {
219         *v = val;
220     }
221     LOS_IntRestore(intSave);
222 
223     return prevVal != oldVal;
224 }
225 
226 #ifdef __cplusplus
227 #if __cplusplus
228 }
229 #endif /* __cplusplus */
230 #endif /* __cplusplus */
231 
232 #endif /* _LOS_ARCH_ATOMIC_H */
233 
234