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