From: Tudor Bosman Date: Mon, 11 Jun 2012 23:18:22 +0000 (-0700) Subject: Properly align internal buffer in IOBuf. X-Git-Tag: v0.22.0~1272 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9f705afd8df9698c5cc7b8af6b66ce7cb3b2e4e4;p=folly.git Properly align internal buffer in IOBuf. Summary: Yes, it's gcc specific, because alignas and max_align_t aren't in gcc 4.6.2. Test Plan: iobuf_test, test added Reviewed By: brianp@fb.com FB internal diff: D491939 --- diff --git a/folly/experimental/io/IOBuf.h b/folly/experimental/io/IOBuf.h index 784f9a7d..03f2126f 100644 --- a/folly/experimental/io/IOBuf.h +++ b/folly/experimental/io/IOBuf.h @@ -919,7 +919,7 @@ class IOBuf { }; struct InternalBuf { uint32_t capacity; - uint8_t buf[]; + uint8_t buf[] __attribute__((aligned)); }; // The maximum size for an IOBuf object, including any internal data buffer diff --git a/folly/experimental/io/test/IOBufTest.cpp b/folly/experimental/io/test/IOBufTest.cpp index b800e8b9..5072810f 100644 --- a/folly/experimental/io/test/IOBufTest.cpp +++ b/folly/experimental/io/test/IOBufTest.cpp @@ -599,6 +599,21 @@ TEST(IOBuf, takeOwnershipUniquePtr) { EXPECT_EQ(1, customDeleterCount); } +TEST(IOBuf, Alignment) { + // max_align_t doesn't exist in gcc 4.6.2 + struct MaxAlign { + char c; + } __attribute__((aligned)); + size_t alignment = alignof(MaxAlign); + + std::vector sizes {0, 1, 64, 256, 1024, 1 << 10}; + for (size_t size : sizes) { + auto buf = IOBuf::create(size); + uintptr_t p = reinterpret_cast(buf->data()); + EXPECT_EQ(0, p & (alignment - 1)) << "size=" << size; + } +} + int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); google::ParseCommandLineFlags(&argc, &argv, true);