diff options
| author | Charles E. Rolke <chug@apache.org> | 2011-10-14 14:57:58 +0000 |
|---|---|---|
| committer | Charles E. Rolke <chug@apache.org> | 2011-10-14 14:57:58 +0000 |
| commit | d3c9e9725c8fa014e9ecdd421e967bd53d962b08 (patch) | |
| tree | bfd07428c0be64fa5101a5f4081812067c3205be /cpp/src/qpid | |
| parent | 085cdb1910ded5e6fcf9b56da595e9f4609f95b8 (diff) | |
| download | qpid-python-d3c9e9725c8fa014e9ecdd421e967bd53d962b08.tar.gz | |
QPID-3540 Typecasting and alignment requirements for various platforms
In RefCountedBuffer:
1. Pad the instantiantion address of RefCountedBuffer class up to an 8-byte boundary.
2. Add (void *) casts to 'store' pointer to prevent warnings about alignment.
In qpid-perftest:
1. Don't pull a size_t object from an arbitrary buffer address.
Instead, memcopy the object by bytes.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1183378 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid')
| -rw-r--r-- | cpp/src/qpid/RefCountedBuffer.cpp | 17 | ||||
| -rw-r--r-- | cpp/src/qpid/RefCountedBuffer.h | 10 |
2 files changed, 23 insertions, 4 deletions
diff --git a/cpp/src/qpid/RefCountedBuffer.cpp b/cpp/src/qpid/RefCountedBuffer.cpp index 40d620f7ad..7e15eefeea 100644 --- a/cpp/src/qpid/RefCountedBuffer.cpp +++ b/cpp/src/qpid/RefCountedBuffer.cpp @@ -26,15 +26,26 @@ namespace qpid { void RefCountedBuffer::released() const { this->~RefCountedBuffer(); - ::delete[] reinterpret_cast<const char*>(this); + uintptr_t binStoreRaw = reinterpret_cast<uintptr_t>(this); + binStoreRaw -= alignPad; + ::delete[] reinterpret_cast<const char*>(binStoreRaw); } BufferRef RefCountedBuffer::create(size_t n) { - char* store=::new char[n+sizeof(RefCountedBuffer)]; + char * storeRaw = ::new char[n + sizeof(RefCountedBuffer) + + refCountedBufferStructAlign]; + uintptr_t binStoreRaw = reinterpret_cast<uintptr_t>(storeRaw); + uintptr_t binStore = (binStoreRaw + + refCountedBufferStructAlign-1) & ~(refCountedBufferStructAlign-1); + char * store = reinterpret_cast<char*>(binStore); + new(store) RefCountedBuffer; + + reinterpret_cast<RefCountedBuffer*>((void *)store)->alignPad = binStore - binStoreRaw; + char* start = store+sizeof(RefCountedBuffer); return BufferRef( - boost::intrusive_ptr<RefCounted>(reinterpret_cast<RefCountedBuffer*>(store)), + boost::intrusive_ptr<RefCounted>(reinterpret_cast<RefCountedBuffer*>((void *)store)), start, start+n); } diff --git a/cpp/src/qpid/RefCountedBuffer.h b/cpp/src/qpid/RefCountedBuffer.h index f0ea86130b..67a512d938 100644 --- a/cpp/src/qpid/RefCountedBuffer.h +++ b/cpp/src/qpid/RefCountedBuffer.h @@ -28,8 +28,14 @@ namespace qpid { /** - * Reference-counted byte buffer. No alignment guarantees. + * Reference-counted byte buffer. Alignment guarantees: + * The RefCountedBuffer structure is aligned to the + * refCountedBUfferStructAlign byte boundary specified here. + * The buffer itself has no alignment guarantees. */ + +static const size_t refCountedBufferStructAlign = 8; + class RefCountedBuffer : public RefCounted { public: /** Create a reference counted buffer of size n */ @@ -37,6 +43,8 @@ class RefCountedBuffer : public RefCounted { protected: void released() const; + + size_t alignPad; }; } // namespace qpid |
