summaryrefslogtreecommitdiff
path: root/libutils/SharedBuffer.cpp
diff options
context:
space:
mode:
authorHans Boehm <hboehm@google.com>2016-05-24 04:10:29 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-05-24 04:10:29 +0000
commit5668b84f99e3fc467721b45184aedca70f8e6da4 (patch)
treed1ccbdb33c6317281a273f514adaff0407a46ae2 /libutils/SharedBuffer.cpp
parentfcab9a85076c83e5b6808935db0f89e4f10dda87 (diff)
parent54828dc739e361a795000e8de79d954db3dcbef8 (diff)
Merge "Fix SharedBuffer. Remove aref." into nyc-dev
Diffstat (limited to 'libutils/SharedBuffer.cpp')
-rw-r--r--libutils/SharedBuffer.cpp17
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));
}