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