}
void buffer::list::rebuild_aligned(unsigned align)
+{
+ rebuild_aligned_size_and_memory(align, align);
+}
+
+void buffer::list::rebuild_aligned_size_and_memory(unsigned align_size,
+ unsigned align_memory)
{
std::list<ptr>::iterator p = _buffers.begin();
while (p != _buffers.end()) {
// keep anything that's already align and sized aligned
- if (p->is_aligned(align) && p->is_n_align_sized(align)) {
+ if (p->is_aligned(align_memory) && p->is_n_align_sized(align_size)) {
/*cout << " segment " << (void*)p->c_str()
<< " offset " << ((unsigned long)p->c_str() & (align - 1))
<< " length " << p->length()
unaligned.push_back(*p);
_buffers.erase(p++);
} while (p != _buffers.end() &&
- (!p->is_aligned(align) ||
- !p->is_n_align_sized(align) ||
- (offset & (align-1))));
- if (!(unaligned.is_contiguous() && unaligned._buffers.front().is_aligned(align))) {
- ptr nb(buffer::create_aligned(unaligned._len, align));
+ (!p->is_aligned(align_memory) ||
+ !p->is_n_align_sized(align_size) ||
+ (offset % align_size)));
+ if (!(unaligned.is_contiguous() && unaligned._buffers.front().is_aligned(align_memory))) {
+ ptr nb(buffer::create_aligned(unaligned._len, align_memory));
unaligned.rebuild(nb);
_memcopy_count += unaligned._len;
}
void rebuild();
void rebuild(ptr& nb);
void rebuild_aligned(unsigned align);
+ void rebuild_aligned_size_and_memory(unsigned align_size,
+ unsigned align_memory);
void rebuild_page_aligned();
// sort-of-like-assignment-op
}
}
+TEST(BufferList, rebuild_aligned_size_and_memory) {
+ const unsigned SIMD_ALIGN = 32;
+ const unsigned BUFFER_SIZE = 67;
+
+ bufferlist bl;
+ // These two must be concatenated into one memory + size aligned
+ // bufferptr
+ {
+ bufferptr ptr(buffer::create_aligned(2, SIMD_ALIGN));
+ ptr.set_offset(1);
+ ptr.set_length(1);
+ bl.append(ptr);
+ }
+ {
+ bufferptr ptr(buffer::create_aligned(BUFFER_SIZE - 1, SIMD_ALIGN));
+ bl.append(ptr);
+ }
+ // This one must be left alone
+ {
+ bufferptr ptr(buffer::create_aligned(BUFFER_SIZE, SIMD_ALIGN));
+ bl.append(ptr);
+ }
+ // These two must be concatenated into one memory + size aligned
+ // bufferptr
+ {
+ bufferptr ptr(buffer::create_aligned(2, SIMD_ALIGN));
+ ptr.set_offset(1);
+ ptr.set_length(1);
+ bl.append(ptr);
+ }
+ {
+ bufferptr ptr(buffer::create_aligned(BUFFER_SIZE - 1, SIMD_ALIGN));
+ bl.append(ptr);
+ }
+ EXPECT_FALSE(bl.is_aligned(SIMD_ALIGN));
+ EXPECT_FALSE(bl.is_n_align_sized(BUFFER_SIZE));
+ EXPECT_EQ(BUFFER_SIZE * 3, bl.length());
+ EXPECT_FALSE(bl.buffers().front().is_aligned(SIMD_ALIGN));
+ EXPECT_FALSE(bl.buffers().front().is_n_align_sized(BUFFER_SIZE));
+ EXPECT_EQ(5U, bl.buffers().size());
+ bl.rebuild_aligned_size_and_memory(BUFFER_SIZE, SIMD_ALIGN);
+ EXPECT_TRUE(bl.is_aligned(SIMD_ALIGN));
+ EXPECT_TRUE(bl.is_n_align_sized(BUFFER_SIZE));
+ EXPECT_EQ(3U, bl.buffers().size());
+}
+
TEST(BufferList, is_zero) {
{
bufferlist bl;