SharedBuffer.h revision 4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53
1be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/* 2be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * SharedBuffer.h 3be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Android 4be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 5be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Copyright 2005 The Android Open Source Project 6be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 7be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 8be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 9be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#ifndef ANDROID_SHARED_BUFFER_H 10be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#define ANDROID_SHARED_BUFFER_H 11be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 12be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include <stdint.h> 13be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include <sys/types.h> 14be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 15be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root// --------------------------------------------------------------------------- 16be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 17be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootnamespace android { 18be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 19be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootclass SharedBuffer 20be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root{ 21be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic: 22be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 23be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /* flags to use with release() */ 24be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root enum { 25be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root eKeepStorage = 0x00000001 26be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root }; 27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /*! allocate a buffer of size 'size' and acquire() it. 29be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * call release() to free it. 30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 31be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root static SharedBuffer* alloc(size_t size); 32af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root 33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /*! free the memory associated with the SharedBuffer. 34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Fails if there are any users associated with this SharedBuffer. 35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * In other words, the buffer must have been release by all its 36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * users. 37be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root static ssize_t dealloc(const SharedBuffer* released); 39be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root //! get the SharedBuffer from the data pointer 41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root static inline const SharedBuffer* sharedBuffer(const void* data); 42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root //! access the data for read 44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root inline const void* data() const; 45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 46be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root //! access the data for read/write 47be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root inline void* data(); 48be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 49 //! get size of the buffer 50 inline size_t size() const; 51 52 //! get back a SharedBuffer object from its data 53 static inline SharedBuffer* bufferFromData(void* data); 54 55 //! get back a SharedBuffer object from its data 56 static inline const SharedBuffer* bufferFromData(const void* data); 57 58 //! get the size of a SharedBuffer object from its data 59 static inline size_t sizeFromData(const void* data); 60 61 //! edit the buffer (get a writtable, or non-const, version of it) 62 SharedBuffer* edit() const; 63 64 //! edit the buffer, resizing if needed 65 SharedBuffer* editResize(size_t size) const; 66 67 //! like edit() but fails if a copy is required 68 SharedBuffer* attemptEdit() const; 69 70 //! resize and edit the buffer, loose it's content. 71 SharedBuffer* reset(size_t size) const; 72 73 //! acquire/release a reference on this buffer 74 void acquire() const; 75 76 /*! release a reference on this buffer, with the option of not 77 * freeing the memory associated with it if it was the last reference 78 * returns the previous reference count 79 */ 80 int32_t release(uint32_t flags = 0) const; 81 82 //! returns wether or not we're the only owner 83 inline bool onlyOwner() const; 84 85 86private: 87 inline SharedBuffer() { } 88 inline ~SharedBuffer() { } 89 inline SharedBuffer(const SharedBuffer&); 90 91 // 16 bytes. must be sized to preserve correct alingment. 92 mutable int32_t mRefs; 93 size_t mSize; 94 uint32_t mReserved[2]; 95}; 96 97// --------------------------------------------------------------------------- 98 99const SharedBuffer* SharedBuffer::sharedBuffer(const void* data) { 100 return data ? reinterpret_cast<const SharedBuffer *>(data)-1 : 0; 101} 102 103const void* SharedBuffer::data() const { 104 return this + 1; 105} 106 107void* SharedBuffer::data() { 108 return this + 1; 109} 110 111size_t SharedBuffer::size() const { 112 return mSize; 113} 114 115SharedBuffer* SharedBuffer::bufferFromData(void* data) 116{ 117 return ((SharedBuffer*)data)-1; 118} 119 120const SharedBuffer* SharedBuffer::bufferFromData(const void* data) 121{ 122 return ((const SharedBuffer*)data)-1; 123} 124 125size_t SharedBuffer::sizeFromData(const void* data) 126{ 127 return (((const SharedBuffer*)data)-1)->mSize; 128} 129 130bool SharedBuffer::onlyOwner() const { 131 return (mRefs == 1); 132} 133 134}; // namespace android 135 136// --------------------------------------------------------------------------- 137 138#endif // ANDROID_VECTOR_H 139