diff options
| author | Hans Boehm <hboehm@google.com> | 2016-05-24 04:10:29 +0000 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-05-24 04:10:29 +0000 | 
| commit | 5668b84f99e3fc467721b45184aedca70f8e6da4 (patch) | |
| tree | d1ccbdb33c6317281a273f514adaff0407a46ae2 /libutils/SharedBuffer.cpp | |
| parent | fcab9a85076c83e5b6808935db0f89e4f10dda87 (diff) | |
| parent | 54828dc739e361a795000e8de79d954db3dcbef8 (diff) | |
Merge "Fix SharedBuffer. Remove aref." into nyc-dev
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));          }  | 
