summaryrefslogtreecommitdiff
path: root/cpp/src/qpid
diff options
context:
space:
mode:
authorCharles E. Rolke <chug@apache.org>2011-10-14 14:57:58 +0000
committerCharles E. Rolke <chug@apache.org>2011-10-14 14:57:58 +0000
commitd3c9e9725c8fa014e9ecdd421e967bd53d962b08 (patch)
treebfd07428c0be64fa5101a5f4081812067c3205be /cpp/src/qpid
parent085cdb1910ded5e6fcf9b56da595e9f4609f95b8 (diff)
downloadqpid-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.cpp17
-rw-r--r--cpp/src/qpid/RefCountedBuffer.h10
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