xref: /aosp_15_r20/frameworks/rs/script_api/rs_atomic.spec (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker#
2*e1eccf28SAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker#
4*e1eccf28SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker#
8*e1eccf28SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker#
10*e1eccf28SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker# limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker#
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Workerheader:
18*e1eccf28SAndroid Build Coastguard Workersummary: Atomic Update Functions
19*e1eccf28SAndroid Build Coastguard Workerdescription:
20*e1eccf28SAndroid Build Coastguard Worker To update values shared between multiple threads, use the functions below.
21*e1eccf28SAndroid Build Coastguard Worker They ensure that the values are atomically updated, i.e. that the memory
22*e1eccf28SAndroid Build Coastguard Worker reads, the updates, and the memory writes are done in the right order.
23*e1eccf28SAndroid Build Coastguard Worker
24*e1eccf28SAndroid Build Coastguard Worker These functions are slower than their non-atomic equivalents, so use
25*e1eccf28SAndroid Build Coastguard Worker them only when synchronization is needed.
26*e1eccf28SAndroid Build Coastguard Worker
27*e1eccf28SAndroid Build Coastguard Worker Note that in RenderScript, your code is likely to be running in separate
28*e1eccf28SAndroid Build Coastguard Worker threads even though you did not explicitely create them.  The RenderScript
29*e1eccf28SAndroid Build Coastguard Worker runtime will very often split the execution of one kernel across multiple
30*e1eccf28SAndroid Build Coastguard Worker threads.  Updating globals should be done with atomic functions.  If possible,
31*e1eccf28SAndroid Build Coastguard Worker modify your algorithm to avoid them altogether.
32*e1eccf28SAndroid Build Coastguard Workerend:
33*e1eccf28SAndroid Build Coastguard Worker
34*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicAdd
35*e1eccf28SAndroid Build Coastguard Workerversion: 14
36*e1eccf28SAndroid Build Coastguard Workerret: int32_t, "Value of *addr prior to the operation."
37*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr, "Address of the value to modify."
38*e1eccf28SAndroid Build Coastguard Workerarg: int32_t value, "Amount to add."
39*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe addition
40*e1eccf28SAndroid Build Coastguard Workerdescription:
41*e1eccf28SAndroid Build Coastguard Worker Atomicly adds a value to the value at addr, i.e. <code>*addr += value</code>.
42*e1eccf28SAndroid Build Coastguard Workertest: none
43*e1eccf28SAndroid Build Coastguard Workerend:
44*e1eccf28SAndroid Build Coastguard Worker
45*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicAdd
46*e1eccf28SAndroid Build Coastguard Workerversion: 20
47*e1eccf28SAndroid Build Coastguard Workerret: int32_t
48*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr
49*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t value
50*e1eccf28SAndroid Build Coastguard Workertest: none
51*e1eccf28SAndroid Build Coastguard Workerend:
52*e1eccf28SAndroid Build Coastguard Worker
53*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicAnd
54*e1eccf28SAndroid Build Coastguard Workerversion: 14
55*e1eccf28SAndroid Build Coastguard Workerret: int32_t, "Value of *addr prior to the operation."
56*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr, "Address of the value to modify."
57*e1eccf28SAndroid Build Coastguard Workerarg: int32_t value, "Value to and with."
58*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe bitwise and
59*e1eccf28SAndroid Build Coastguard Workerdescription:
60*e1eccf28SAndroid Build Coastguard Worker Atomicly performs a bitwise and of two values, storing the result back at addr,
61*e1eccf28SAndroid Build Coastguard Worker i.e. <code>*addr &amp;= value</code>.
62*e1eccf28SAndroid Build Coastguard Workertest: none
63*e1eccf28SAndroid Build Coastguard Workerend:
64*e1eccf28SAndroid Build Coastguard Worker
65*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicAnd
66*e1eccf28SAndroid Build Coastguard Workerversion: 20
67*e1eccf28SAndroid Build Coastguard Workerret: int32_t
68*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr
69*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t value
70*e1eccf28SAndroid Build Coastguard Workertest: none
71*e1eccf28SAndroid Build Coastguard Workerend:
72*e1eccf28SAndroid Build Coastguard Worker
73*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicCas
74*e1eccf28SAndroid Build Coastguard Workerversion: 14
75*e1eccf28SAndroid Build Coastguard Workerret: int32_t, "Value of *addr prior to the operation."
76*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr, "Address of the value to compare and replace if the test passes."
77*e1eccf28SAndroid Build Coastguard Workerarg: int32_t compareValue, "Value to test *addr against."
78*e1eccf28SAndroid Build Coastguard Workerarg: int32_t newValue, "Value to write if the test passes."
79*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe compare and set
80*e1eccf28SAndroid Build Coastguard Workerdescription:
81*e1eccf28SAndroid Build Coastguard Worker If the value at addr matches compareValue then the newValue is written at addr,
82*e1eccf28SAndroid Build Coastguard Worker i.e. <code>if (*addr == compareValue) { *addr = newValue; }</code>.
83*e1eccf28SAndroid Build Coastguard Worker
84*e1eccf28SAndroid Build Coastguard Worker You can check that the value was written by checking that the value returned
85*e1eccf28SAndroid Build Coastguard Worker by rsAtomicCas() is compareValue.
86*e1eccf28SAndroid Build Coastguard Workertest: none
87*e1eccf28SAndroid Build Coastguard Workerend:
88*e1eccf28SAndroid Build Coastguard Worker
89*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicCas
90*e1eccf28SAndroid Build Coastguard Workerversion: 14
91*e1eccf28SAndroid Build Coastguard Workerret: uint32_t
92*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr
93*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t compareValue
94*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t newValue
95*e1eccf28SAndroid Build Coastguard Workertest: none
96*e1eccf28SAndroid Build Coastguard Workerend:
97*e1eccf28SAndroid Build Coastguard Worker
98*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicDec
99*e1eccf28SAndroid Build Coastguard Workerversion: 14
100*e1eccf28SAndroid Build Coastguard Workerret: int32_t, "Value of *addr prior to the operation."
101*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr, "Address of the value to decrement."
102*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe decrement
103*e1eccf28SAndroid Build Coastguard Workerdescription:
104*e1eccf28SAndroid Build Coastguard Worker Atomicly subtracts one from the value at addr.  This is equivalent to <code>@rsAtomicSub(addr, 1)</code>.
105*e1eccf28SAndroid Build Coastguard Workertest: none
106*e1eccf28SAndroid Build Coastguard Workerend:
107*e1eccf28SAndroid Build Coastguard Worker
108*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicDec
109*e1eccf28SAndroid Build Coastguard Workerversion: 20
110*e1eccf28SAndroid Build Coastguard Workerret: int32_t
111*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr
112*e1eccf28SAndroid Build Coastguard Workertest: none
113*e1eccf28SAndroid Build Coastguard Workerend:
114*e1eccf28SAndroid Build Coastguard Worker
115*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicInc
116*e1eccf28SAndroid Build Coastguard Workerversion: 14
117*e1eccf28SAndroid Build Coastguard Workerret: int32_t, "Value of *addr prior to the operation."
118*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr, "Address of the value to increment."
119*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe increment
120*e1eccf28SAndroid Build Coastguard Workerdescription:
121*e1eccf28SAndroid Build Coastguard Worker Atomicly adds one to the value at addr.  This is equivalent to <code>@rsAtomicAdd(addr, 1)</code>.
122*e1eccf28SAndroid Build Coastguard Workertest: none
123*e1eccf28SAndroid Build Coastguard Workerend:
124*e1eccf28SAndroid Build Coastguard Worker
125*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicInc
126*e1eccf28SAndroid Build Coastguard Workerversion: 20
127*e1eccf28SAndroid Build Coastguard Workerret: int32_t
128*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr
129*e1eccf28SAndroid Build Coastguard Workertest: none
130*e1eccf28SAndroid Build Coastguard Workerend:
131*e1eccf28SAndroid Build Coastguard Worker
132*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicMax
133*e1eccf28SAndroid Build Coastguard Workerversion: 14
134*e1eccf28SAndroid Build Coastguard Workerret: uint32_t, "Value of *addr prior to the operation."
135*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr, "Address of the value to modify."
136*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t value, "Comparison value."
137*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe maximum
138*e1eccf28SAndroid Build Coastguard Workerdescription:
139*e1eccf28SAndroid Build Coastguard Worker Atomicly sets the value at addr to the maximum of *addr and value, i.e.
140*e1eccf28SAndroid Build Coastguard Worker <code>*addr = max(*addr, value)</code>.
141*e1eccf28SAndroid Build Coastguard Workertest: none
142*e1eccf28SAndroid Build Coastguard Workerend:
143*e1eccf28SAndroid Build Coastguard Worker
144*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicMax
145*e1eccf28SAndroid Build Coastguard Workerversion: 14
146*e1eccf28SAndroid Build Coastguard Workerret: int32_t
147*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr
148*e1eccf28SAndroid Build Coastguard Workerarg: int32_t value
149*e1eccf28SAndroid Build Coastguard Workertest: none
150*e1eccf28SAndroid Build Coastguard Workerend:
151*e1eccf28SAndroid Build Coastguard Worker
152*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicMin
153*e1eccf28SAndroid Build Coastguard Workerversion: 14
154*e1eccf28SAndroid Build Coastguard Workerret: uint32_t, "Value of *addr prior to the operation."
155*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr, "Address of the value to modify."
156*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t value, "Comparison value."
157*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe minimum
158*e1eccf28SAndroid Build Coastguard Workerdescription:
159*e1eccf28SAndroid Build Coastguard Worker Atomicly sets the value at addr to the minimum of *addr and value, i.e.
160*e1eccf28SAndroid Build Coastguard Worker <code>*addr = min(*addr, value)</code>.
161*e1eccf28SAndroid Build Coastguard Workertest: none
162*e1eccf28SAndroid Build Coastguard Workerend:
163*e1eccf28SAndroid Build Coastguard Worker
164*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicMin
165*e1eccf28SAndroid Build Coastguard Workerversion: 14
166*e1eccf28SAndroid Build Coastguard Workerret: int32_t
167*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr
168*e1eccf28SAndroid Build Coastguard Workerarg: int32_t value
169*e1eccf28SAndroid Build Coastguard Workertest: none
170*e1eccf28SAndroid Build Coastguard Workerend:
171*e1eccf28SAndroid Build Coastguard Worker
172*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicOr
173*e1eccf28SAndroid Build Coastguard Workerversion: 14
174*e1eccf28SAndroid Build Coastguard Workerret: int32_t, "Value of *addr prior to the operation."
175*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr, "Address of the value to modify."
176*e1eccf28SAndroid Build Coastguard Workerarg: int32_t value, "Value to or with."
177*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe bitwise or
178*e1eccf28SAndroid Build Coastguard Workerdescription:
179*e1eccf28SAndroid Build Coastguard Worker Atomicly perform a bitwise or two values, storing the result at addr,
180*e1eccf28SAndroid Build Coastguard Worker i.e. <code>*addr |= value</code>.
181*e1eccf28SAndroid Build Coastguard Workertest: none
182*e1eccf28SAndroid Build Coastguard Workerend:
183*e1eccf28SAndroid Build Coastguard Worker
184*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicOr
185*e1eccf28SAndroid Build Coastguard Workerversion: 20
186*e1eccf28SAndroid Build Coastguard Workerret: int32_t
187*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr
188*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t value
189*e1eccf28SAndroid Build Coastguard Workertest: none
190*e1eccf28SAndroid Build Coastguard Workerend:
191*e1eccf28SAndroid Build Coastguard Worker
192*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicSub
193*e1eccf28SAndroid Build Coastguard Workerversion: 14
194*e1eccf28SAndroid Build Coastguard Workerret: int32_t, "Value of *addr prior to the operation."
195*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr, "Address of the value to modify."
196*e1eccf28SAndroid Build Coastguard Workerarg: int32_t value, "Amount to subtract."
197*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe subtraction
198*e1eccf28SAndroid Build Coastguard Workerdescription:
199*e1eccf28SAndroid Build Coastguard Worker Atomicly subtracts a value from the value at addr, i.e. <code>*addr -= value</code>.
200*e1eccf28SAndroid Build Coastguard Workertest: none
201*e1eccf28SAndroid Build Coastguard Workerend:
202*e1eccf28SAndroid Build Coastguard Worker
203*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicSub
204*e1eccf28SAndroid Build Coastguard Workerversion: 20
205*e1eccf28SAndroid Build Coastguard Workerret: int32_t
206*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr
207*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t value
208*e1eccf28SAndroid Build Coastguard Workertest: none
209*e1eccf28SAndroid Build Coastguard Workerend:
210*e1eccf28SAndroid Build Coastguard Worker
211*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicXor
212*e1eccf28SAndroid Build Coastguard Workerversion: 14
213*e1eccf28SAndroid Build Coastguard Workerret: int32_t, "Value of *addr prior to the operation."
214*e1eccf28SAndroid Build Coastguard Workerarg: volatile int32_t* addr, "Address of the value to modify."
215*e1eccf28SAndroid Build Coastguard Workerarg: int32_t value, "Value to xor with."
216*e1eccf28SAndroid Build Coastguard Workersummary: Thread-safe bitwise exclusive or
217*e1eccf28SAndroid Build Coastguard Workerdescription:
218*e1eccf28SAndroid Build Coastguard Worker Atomicly performs a bitwise xor of two values, storing the result at addr,
219*e1eccf28SAndroid Build Coastguard Worker i.e. <code>*addr ^= value</code>.
220*e1eccf28SAndroid Build Coastguard Workertest: none
221*e1eccf28SAndroid Build Coastguard Workerend:
222*e1eccf28SAndroid Build Coastguard Worker
223*e1eccf28SAndroid Build Coastguard Workerfunction: rsAtomicXor
224*e1eccf28SAndroid Build Coastguard Workerversion: 20
225*e1eccf28SAndroid Build Coastguard Workerret: int32_t
226*e1eccf28SAndroid Build Coastguard Workerarg: volatile uint32_t* addr
227*e1eccf28SAndroid Build Coastguard Workerarg: uint32_t value
228*e1eccf28SAndroid Build Coastguard Workertest: none
229*e1eccf28SAndroid Build Coastguard Workerend:
230