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