diff options
author | Sergio Giro <sgiro@google.com> | 2015-09-23 16:22:59 +0100 |
---|---|---|
committer | Sergio Giro <sgiro@google.com> | 2015-09-23 16:22:59 +0100 |
commit | d2529f28308ba7583f4d8baaa937218d81cbe8bd (patch) | |
tree | 08e7ec119fa22c98d69f649e7ffa05f544a7d9f0 /libutils | |
parent | 1d758c90959225c76ed4d318290ad1bf11532409 (diff) | |
download | core-d2529f28308ba7583f4d8baaa937218d81cbe8bd.tar.gz core-d2529f28308ba7583f4d8baaa937218d81cbe8bd.tar.bz2 core-d2529f28308ba7583f4d8baaa937218d81cbe8bd.zip |
libutils: hide SharedBuffer by moving SharedBuffer.h to the implementation directory
Some methods in header files of classes using SharedBuffer need
to be moved to the implementation files accordingly
Change-Id: I891f3ace2b940ab219e4e449040bfed71c0547db
Diffstat (limited to 'libutils')
-rw-r--r-- | libutils/BasicHashtable.cpp | 8 | ||||
-rw-r--r-- | libutils/SharedBuffer.cpp | 3 | ||||
-rw-r--r-- | libutils/SharedBuffer.h | 137 | ||||
-rw-r--r-- | libutils/String16.cpp | 11 | ||||
-rw-r--r-- | libutils/String8.cpp | 13 | ||||
-rw-r--r-- | libutils/VectorImpl.cpp | 3 |
6 files changed, 172 insertions, 3 deletions
diff --git a/libutils/BasicHashtable.cpp b/libutils/BasicHashtable.cpp index 491d9e98b..1e9f05333 100644 --- a/libutils/BasicHashtable.cpp +++ b/libutils/BasicHashtable.cpp @@ -22,6 +22,8 @@ #include <utils/BasicHashtable.h> #include <utils/misc.h> +#include "SharedBuffer.h" + namespace android { BasicHashtableImpl::BasicHashtableImpl(size_t entrySize, bool hasTrivialDestructor, @@ -46,6 +48,12 @@ BasicHashtableImpl::~BasicHashtableImpl() { } +void BasicHashtableImpl::edit() { + if (mBuckets && !SharedBuffer::bufferFromData(mBuckets)->onlyOwner()) { + clone(); + } +} + void BasicHashtableImpl::dispose() { if (mBuckets) { releaseBuckets(mBuckets, mBucketCount); diff --git a/libutils/SharedBuffer.cpp b/libutils/SharedBuffer.cpp index 3555fb712..003e38697 100644 --- a/libutils/SharedBuffer.cpp +++ b/libutils/SharedBuffer.cpp @@ -17,9 +17,10 @@ #include <stdlib.h> #include <string.h> -#include <utils/SharedBuffer.h> #include <utils/Atomic.h> +#include "SharedBuffer.h" + // --------------------------------------------------------------------------- namespace android { diff --git a/libutils/SharedBuffer.h b/libutils/SharedBuffer.h new file mode 100644 index 000000000..b6709537e --- /dev/null +++ b/libutils/SharedBuffer.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2005 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_SHARED_BUFFER_H +#define ANDROID_SHARED_BUFFER_H + +#include <stdint.h> +#include <sys/types.h> + +// --------------------------------------------------------------------------- + +namespace android { + +class SharedBuffer +{ +public: + + /* flags to use with release() */ + enum { + eKeepStorage = 0x00000001 + }; + + /*! allocate a buffer of size 'size' and acquire() it. + * call release() to free it. + */ + static SharedBuffer* alloc(size_t size); + + /*! free the memory associated with the SharedBuffer. + * Fails if there are any users associated with this SharedBuffer. + * In other words, the buffer must have been release by all its + * users. + */ + static ssize_t dealloc(const SharedBuffer* released); + + //! access the data for read + inline const void* data() const; + + //! access the data for read/write + inline void* data(); + + //! get size of the buffer + inline size_t size() const; + + //! get back a SharedBuffer object from its data + static inline SharedBuffer* bufferFromData(void* data); + + //! get back a SharedBuffer object from its data + static inline const SharedBuffer* bufferFromData(const void* data); + + //! get the size of a SharedBuffer object from its data + static inline size_t sizeFromData(const void* data); + + //! edit the buffer (get a writtable, or non-const, version of it) + SharedBuffer* edit() const; + + //! edit the buffer, resizing if needed + SharedBuffer* editResize(size_t size) const; + + //! like edit() but fails if a copy is required + SharedBuffer* attemptEdit() const; + + //! resize and edit the buffer, loose it's content. + SharedBuffer* reset(size_t size) const; + + //! acquire/release a reference on this buffer + void acquire() const; + + /*! release a reference on this buffer, with the option of not + * freeing the memory associated with it if it was the last reference + * returns the previous reference count + */ + int32_t release(uint32_t flags = 0) const; + + //! returns wether or not we're the only owner + inline bool onlyOwner() const; + + +private: + inline SharedBuffer() { } + inline ~SharedBuffer() { } + SharedBuffer(const SharedBuffer&); + SharedBuffer& operator = (const SharedBuffer&); + + // 16 bytes. must be sized to preserve correct alignment. + mutable int32_t mRefs; + size_t mSize; + uint32_t mReserved[2]; +}; + +// --------------------------------------------------------------------------- + +const void* SharedBuffer::data() const { + return this + 1; +} + +void* SharedBuffer::data() { + return this + 1; +} + +size_t SharedBuffer::size() const { + return mSize; +} + +SharedBuffer* SharedBuffer::bufferFromData(void* data) { + return data ? static_cast<SharedBuffer *>(data)-1 : 0; +} + +const SharedBuffer* SharedBuffer::bufferFromData(const void* data) { + return data ? static_cast<const SharedBuffer *>(data)-1 : 0; +} + +size_t SharedBuffer::sizeFromData(const void* data) { + return data ? bufferFromData(data)->mSize : 0; +} + +bool SharedBuffer::onlyOwner() const { + return (mRefs == 1); +} + +}; // namespace android + +// --------------------------------------------------------------------------- + +#endif // ANDROID_VECTOR_H diff --git a/libutils/String16.cpp b/libutils/String16.cpp index 91efdaa39..67be9d8fa 100644 --- a/libutils/String16.cpp +++ b/libutils/String16.cpp @@ -25,6 +25,7 @@ #include <stdio.h> #include <ctype.h> +#include "SharedBuffer.h" namespace android { @@ -165,6 +166,16 @@ String16::~String16() SharedBuffer::bufferFromData(mString)->release(); } +size_t String16::size() const +{ + return SharedBuffer::sizeFromData(mString)/sizeof(char16_t)-1; +} + +const SharedBuffer* String16::sharedBuffer() const +{ + return SharedBuffer::bufferFromData(mString); +} + void String16::setTo(const String16& other) { SharedBuffer::bufferFromData(other.mString)->acquire(); diff --git a/libutils/String8.cpp b/libutils/String8.cpp index 69313ead7..5e8552049 100644 --- a/libutils/String8.cpp +++ b/libutils/String8.cpp @@ -19,12 +19,13 @@ #include <utils/Compat.h> #include <utils/Log.h> #include <utils/Unicode.h> -#include <utils/SharedBuffer.h> #include <utils/String16.h> #include <utils/threads.h> #include <ctype.h> +#include "SharedBuffer.h" + /* * Functions outside android is below the namespace android, since they use * functions and constants in android namespace. @@ -211,6 +212,16 @@ String8::~String8() SharedBuffer::bufferFromData(mString)->release(); } +size_t String8::length() const +{ + return SharedBuffer::sizeFromData(mString)-1; +} + +const SharedBuffer* String8::sharedBuffer() const +{ + return SharedBuffer::bufferFromData(mString); +} + String8 String8::format(const char* fmt, ...) { va_list args; diff --git a/libutils/VectorImpl.cpp b/libutils/VectorImpl.cpp index 2f770f590..2ac158b9f 100644 --- a/libutils/VectorImpl.cpp +++ b/libutils/VectorImpl.cpp @@ -23,9 +23,10 @@ #include <cutils/log.h> #include <utils/Errors.h> -#include <utils/SharedBuffer.h> #include <utils/VectorImpl.h> +#include "SharedBuffer.h" + /*****************************************************************************/ |