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