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