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