diff options
author | 2011-01-24 17:33:21 -0800 | |
---|---|---|
committer | 2011-01-24 17:33:21 -0800 | |
commit | fcecc244a7f5a8c744e778970b1722a70472349b (patch) | |
tree | e91e58c3151f4e930a70bd905ff39976745c0fdf | |
parent | c55de66ad20c7834b04d605e8704dd2a0e3d23fa (diff) |
Attempt to fix 3333866
Missing memory barrier when the non-locking past
path is hit.
Change-Id: I80db7df547c1ce35ed85ba117519b12679cc42ef
-rw-r--r-- | libs/rs/rsLocklessFifo.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp index eb2af1cda757..3f8854330acf 100644 --- a/libs/rs/rsLocklessFifo.cpp +++ b/libs/rs/rsLocklessFifo.cpp @@ -76,7 +76,8 @@ uint32_t LocklessCommandFifo::getFreeSpace() const { } bool LocklessCommandFifo::isEmpty() const { - return mPut == mGet; + uint32_t p = android_atomic_acquire_load((int32_t *)&mPut); + return ((uint8_t *)p) == mGet; } @@ -155,7 +156,9 @@ const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) { void LocklessCommandFifo::next() { uint32_t bytes = reinterpret_cast<const uint16_t *>(mGet)[1]; - mGet += ((bytes + 3) & ~3) + 4; + + android_atomic_add(((bytes + 3) & ~3) + 4, (int32_t *)&mGet); + //mGet += ((bytes + 3) & ~3) + 4; if (isEmpty()) { mSignalToControl.set(); } |