| # | |
| # Copyright (C) 2015 The Android Open Source Project | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # | |
| header: | |
| summary: Atomic Update Functions | |
| description: | |
| To update values shared between multiple threads, use the functions below. | |
| They ensure that the values are atomically updated, i.e. that the memory | |
| reads, the updates, and the memory writes are done in the right order. | |
| These functions are slower than their non-atomic equivalents, so use | |
| them only when synchronization is needed. | |
| Note that in RenderScript, your code is likely to be running in separate | |
| threads even though you did not explicitely create them. The RenderScript | |
| runtime will very often split the execution of one kernel across multiple | |
| threads. Updating globals should be done with atomic functions. If possible, | |
| modify your algorithm to avoid them altogether. | |
| end: | |
| function: rsAtomicAdd | |
| version: 14 | |
| ret: int32_t, "Value of *addr prior to the operation." | |
| arg: volatile int32_t* addr, "Address of the value to modify." | |
| arg: int32_t value, "Amount to add." | |
| summary: Thread-safe addition | |
| description: | |
| Atomicly adds a value to the value at addr, i.e. <code>*addr += value</code>. | |
| test: none | |
| end: | |
| function: rsAtomicAdd | |
| version: 20 | |
| ret: int32_t | |
| arg: volatile uint32_t* addr | |
| arg: uint32_t value | |
| test: none | |
| end: | |
| function: rsAtomicAnd | |
| version: 14 | |
| ret: int32_t, "Value of *addr prior to the operation." | |
| arg: volatile int32_t* addr, "Address of the value to modify." | |
| arg: int32_t value, "Value to and with." | |
| summary: Thread-safe bitwise and | |
| description: | |
| Atomicly performs a bitwise and of two values, storing the result back at addr, | |
| i.e. <code>*addr &= value</code>. | |
| test: none | |
| end: | |
| function: rsAtomicAnd | |
| version: 20 | |
| ret: int32_t | |
| arg: volatile uint32_t* addr | |
| arg: uint32_t value | |
| test: none | |
| end: | |
| function: rsAtomicCas | |
| version: 14 | |
| ret: int32_t, "Value of *addr prior to the operation." | |
| arg: volatile int32_t* addr, "Address of the value to compare and replace if the test passes." | |
| arg: int32_t compareValue, "Value to test *addr against." | |
| arg: int32_t newValue, "Value to write if the test passes." | |
| summary: Thread-safe compare and set | |
| description: | |
| If the value at addr matches compareValue then the newValue is written at addr, | |
| i.e. <code>if (*addr == compareValue) { *addr = newValue; }</code>. | |
| You can check that the value was written by checking that the value returned | |
| by rsAtomicCas() is compareValue. | |
| test: none | |
| end: | |
| function: rsAtomicCas | |
| version: 14 | |
| ret: uint32_t | |
| arg: volatile uint32_t* addr | |
| arg: uint32_t compareValue | |
| arg: uint32_t newValue | |
| test: none | |
| end: | |
| function: rsAtomicDec | |
| version: 14 | |
| ret: int32_t, "Value of *addr prior to the operation." | |
| arg: volatile int32_t* addr, "Address of the value to decrement." | |
| summary: Thread-safe decrement | |
| description: | |
| Atomicly subtracts one from the value at addr. This is equivalent to <code>@rsAtomicSub(addr, 1)</code>. | |
| test: none | |
| end: | |
| function: rsAtomicDec | |
| version: 20 | |
| ret: int32_t | |
| arg: volatile uint32_t* addr | |
| test: none | |
| end: | |
| function: rsAtomicInc | |
| version: 14 | |
| ret: int32_t, "Value of *addr prior to the operation." | |
| arg: volatile int32_t* addr, "Address of the value to increment." | |
| summary: Thread-safe increment | |
| description: | |
| Atomicly adds one to the value at addr. This is equivalent to <code>@rsAtomicAdd(addr, 1)</code>. | |
| test: none | |
| end: | |
| function: rsAtomicInc | |
| version: 20 | |
| ret: int32_t | |
| arg: volatile uint32_t* addr | |
| test: none | |
| end: | |
| function: rsAtomicMax | |
| version: 14 | |
| ret: uint32_t, "Value of *addr prior to the operation." | |
| arg: volatile uint32_t* addr, "Address of the value to modify." | |
| arg: uint32_t value, "Comparison value." | |
| summary: Thread-safe maximum | |
| description: | |
| Atomicly sets the value at addr to the maximum of *addr and value, i.e. | |
| <code>*addr = max(*addr, value)</code>. | |
| test: none | |
| end: | |
| function: rsAtomicMax | |
| version: 14 | |
| ret: int32_t | |
| arg: volatile int32_t* addr | |
| arg: int32_t value | |
| test: none | |
| end: | |
| function: rsAtomicMin | |
| version: 14 | |
| ret: uint32_t, "Value of *addr prior to the operation." | |
| arg: volatile uint32_t* addr, "Address of the value to modify." | |
| arg: uint32_t value, "Comparison value." | |
| summary: Thread-safe minimum | |
| description: | |
| Atomicly sets the value at addr to the minimum of *addr and value, i.e. | |
| <code>*addr = min(*addr, value)</code>. | |
| test: none | |
| end: | |
| function: rsAtomicMin | |
| version: 14 | |
| ret: int32_t | |
| arg: volatile int32_t* addr | |
| arg: int32_t value | |
| test: none | |
| end: | |
| function: rsAtomicOr | |
| version: 14 | |
| ret: int32_t, "Value of *addr prior to the operation." | |
| arg: volatile int32_t* addr, "Address of the value to modify." | |
| arg: int32_t value, "Value to or with." | |
| summary: Thread-safe bitwise or | |
| description: | |
| Atomicly perform a bitwise or two values, storing the result at addr, | |
| i.e. <code>*addr |= value</code>. | |
| test: none | |
| end: | |
| function: rsAtomicOr | |
| version: 20 | |
| ret: int32_t | |
| arg: volatile uint32_t* addr | |
| arg: uint32_t value | |
| test: none | |
| end: | |
| function: rsAtomicSub | |
| version: 14 | |
| ret: int32_t, "Value of *addr prior to the operation." | |
| arg: volatile int32_t* addr, "Address of the value to modify." | |
| arg: int32_t value, "Amount to subtract." | |
| summary: Thread-safe subtraction | |
| description: | |
| Atomicly subtracts a value from the value at addr, i.e. <code>*addr -= value</code>. | |
| test: none | |
| end: | |
| function: rsAtomicSub | |
| version: 20 | |
| ret: int32_t | |
| arg: volatile uint32_t* addr | |
| arg: uint32_t value | |
| test: none | |
| end: | |
| function: rsAtomicXor | |
| version: 14 | |
| ret: int32_t, "Value of *addr prior to the operation." | |
| arg: volatile int32_t* addr, "Address of the value to modify." | |
| arg: int32_t value, "Value to xor with." | |
| summary: Thread-safe bitwise exclusive or | |
| description: | |
| Atomicly performs a bitwise xor of two values, storing the result at addr, | |
| i.e. <code>*addr ^= value</code>. | |
| test: none | |
| end: | |
| function: rsAtomicXor | |
| version: 20 | |
| ret: int32_t | |
| arg: volatile uint32_t* addr | |
| arg: uint32_t value | |
| test: none | |
| end: |