diff options
Diffstat (limited to 'libutils/SharedBuffer.cpp')
| -rw-r--r-- | libutils/SharedBuffer.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/libutils/SharedBuffer.cpp b/libutils/SharedBuffer.cpp index 34d75eebcc..a8a9fb4153 100644 --- a/libutils/SharedBuffer.cpp +++ b/libutils/SharedBuffer.cpp @@ -18,7 +18,6 @@ #include <string.h> #include <log/log.h> -#include <utils/Atomic.h> #include "SharedBuffer.h" @@ -35,18 +34,19 @@ SharedBuffer* SharedBuffer::alloc(size_t size) SharedBuffer* sb = static_cast<SharedBuffer *>(malloc(sizeof(SharedBuffer) + size)); if (sb) { - sb->mRefs = 1; + // Should be std::atomic_init(&sb->mRefs, 1); + // But that generates a warning with some compilers. + // The following is OK on Android-supported platforms. + sb->mRefs.store(1, std::memory_order_relaxed); sb->mSize = size; } return sb; } -ssize_t SharedBuffer::dealloc(const SharedBuffer* released) +void SharedBuffer::dealloc(const SharedBuffer* released) { - if (released->mRefs != 0) return -1; // XXX: invalid operation free(const_cast<SharedBuffer*>(released)); - return 0; } SharedBuffer* SharedBuffer::edit() const @@ -106,14 +106,15 @@ SharedBuffer* SharedBuffer::reset(size_t new_size) const } void SharedBuffer::acquire() const { - android_atomic_inc(&mRefs); + mRefs.fetch_add(1, std::memory_order_relaxed); } int32_t SharedBuffer::release(uint32_t flags) const { int32_t prev = 1; - if (onlyOwner() || ((prev = android_atomic_dec(&mRefs)) == 1)) { - mRefs = 0; + if (onlyOwner() || ((prev = mRefs.fetch_sub(1, std::memory_order_release) == 1) + && (atomic_thread_fence(std::memory_order_acquire), true))) { + mRefs.store(0, std::memory_order_relaxed); if ((flags & eKeepStorage) == 0) { free(const_cast<SharedBuffer*>(this)); } |
