diff options
author | Stephen Hines <srhines@google.com> | 2012-01-25 18:17:34 -0800 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2012-01-25 18:17:34 -0800 |
commit | 109116bb2f751d84a9ce89ac40c45e76c0aa462c (patch) | |
tree | 1e2c530a23c0383fcc56b5da2571ddc62352c774 /libs/rs | |
parent | fb9ffe02609c9c4ffca64927e72bc935cfe87768 (diff) | |
download | frameworks_base-109116bb2f751d84a9ce89ac40c45e76c0aa462c.zip frameworks_base-109116bb2f751d84a9ce89ac40c45e76c0aa462c.tar.gz frameworks_base-109116bb2f751d84a9ce89ac40c45e76c0aa462c.tar.bz2 |
Fix bugs with unsigned rsAtomicCas/Max/Min.
BUG=5888007
rsAtomicMax/Min did not have proper semantics for unsigned integers. They were
always using signed comparisons. rsAtomicCas had the wrong function signature
in our math library, leading to no way to properly link/execute it.
Change-Id: I336cdd8cd9f2d8093f12e101b55b2797515f039b
Diffstat (limited to 'libs/rs')
-rw-r--r-- | libs/rs/driver/rsdRuntimeMath.cpp | 24 | ||||
-rw-r--r-- | libs/rs/scriptc/rs_atomic.rsh | 2 |
2 files changed, 23 insertions, 3 deletions
diff --git a/libs/rs/driver/rsdRuntimeMath.cpp b/libs/rs/driver/rsdRuntimeMath.cpp index e315539..753ef73 100644 --- a/libs/rs/driver/rsdRuntimeMath.cpp +++ b/libs/rs/driver/rsdRuntimeMath.cpp @@ -329,6 +329,16 @@ static int32_t SC_AtomicXor(volatile int32_t *ptr, int32_t value) { return prev; } +static uint32_t SC_AtomicUMin(volatile uint32_t *ptr, uint32_t value) { + uint32_t prev, status; + do { + prev = *ptr; + uint32_t n = rsMin(value, prev); + status = android_atomic_release_cas((int32_t) prev, (int32_t)n, (volatile int32_t*) ptr); + } while (CC_UNLIKELY(status != 0)); + return prev; +} + static int32_t SC_AtomicMin(volatile int32_t *ptr, int32_t value) { int32_t prev, status; do { @@ -339,6 +349,16 @@ static int32_t SC_AtomicMin(volatile int32_t *ptr, int32_t value) { return prev; } +static uint32_t SC_AtomicUMax(volatile uint32_t *ptr, uint32_t value) { + uint32_t prev, status; + do { + prev = *ptr; + uint32_t n = rsMax(value, prev); + status = android_atomic_release_cas((int32_t) prev, (int32_t) n, (volatile int32_t*) ptr); + } while (CC_UNLIKELY(status != 0)); + return prev; +} + static int32_t SC_AtomicMax(volatile int32_t *ptr, int32_t value) { int32_t prev, status; do { @@ -524,9 +544,9 @@ static RsdSymbolTable gSyms[] = { { "_Z11rsAtomicXorPVii", (void *)&SC_AtomicXor, true }, { "_Z11rsAtomicXorPVjj", (void *)&SC_AtomicXor, true }, { "_Z11rsAtomicMinPVii", (void *)&SC_AtomicMin, true }, - { "_Z11rsAtomicMinPVjj", (void *)&SC_AtomicMin, true }, + { "_Z11rsAtomicMinPVjj", (void *)&SC_AtomicUMin, true }, { "_Z11rsAtomicMaxPVii", (void *)&SC_AtomicMax, true }, - { "_Z11rsAtomicMaxPVjj", (void *)&SC_AtomicMax, true }, + { "_Z11rsAtomicMaxPVjj", (void *)&SC_AtomicUMax, true }, { "_Z11rsAtomicCasPViii", (void *)&SC_AtomicCas, true }, { "_Z11rsAtomicCasPVjjj", (void *)&SC_AtomicCas, true }, diff --git a/libs/rs/scriptc/rs_atomic.rsh b/libs/rs/scriptc/rs_atomic.rsh index 87c6c02..a455edd 100644 --- a/libs/rs/scriptc/rs_atomic.rsh +++ b/libs/rs/scriptc/rs_atomic.rsh @@ -242,7 +242,7 @@ extern int32_t __attribute__((overloadable)) * @return old value */ extern uint32_t __attribute__((overloadable)) - rsAtomicCas(volatile uint32_t* addr, int32_t compareValue, int32_t newValue); + rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); #endif //defined(RS_VERSION) && (RS_VERSION >= 14) |