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