diff options
Diffstat (limited to 'libutils/SharedBuffer.h')
| -rw-r--r-- | libutils/SharedBuffer.h | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/libutils/SharedBuffer.h b/libutils/SharedBuffer.h index b6709537e6..48358cddcd 100644 --- a/libutils/SharedBuffer.h +++ b/libutils/SharedBuffer.h @@ -14,9 +14,14 @@ * limitations under the License. */ +/* + * DEPRECATED. DO NOT USE FOR NEW CODE. + */ + #ifndef ANDROID_SHARED_BUFFER_H #define ANDROID_SHARED_BUFFER_H +#include <atomic> #include <stdint.h> #include <sys/types.h> @@ -43,7 +48,7 @@ public: * In other words, the buffer must have been release by all its * users. */ - static ssize_t dealloc(const SharedBuffer* released); + static void dealloc(const SharedBuffer* released); //! access the data for read inline const void* data() const; @@ -94,12 +99,16 @@ private: SharedBuffer(const SharedBuffer&); SharedBuffer& operator = (const SharedBuffer&); - // 16 bytes. must be sized to preserve correct alignment. - mutable int32_t mRefs; - size_t mSize; - uint32_t mReserved[2]; + // Must be sized to preserve correct alignment. + mutable std::atomic<int32_t> mRefs; + size_t mSize; + uint32_t mReserved[2]; }; +static_assert(sizeof(SharedBuffer) % 8 == 0 + && (sizeof(size_t) > 4 || sizeof(SharedBuffer) == 16), + "SharedBuffer has unexpected size"); + // --------------------------------------------------------------------------- const void* SharedBuffer::data() const { @@ -127,7 +136,7 @@ size_t SharedBuffer::sizeFromData(const void* data) { } bool SharedBuffer::onlyOwner() const { - return (mRefs == 1); + return (mRefs.load(std::memory_order_acquire) == 1); } }; // namespace android |
