_buffers.clear_and_dispose(ptr_node::disposer());
return;
}
- ptr nb;
if ((_len & ~CEPH_PAGE_MASK) == 0)
- nb = buffer::create_page_aligned(_len);
+ rebuild(ptr_node::create(buffer::create_page_aligned(_len)));
else
- nb = buffer::create(_len);
- rebuild(nb);
+ rebuild(ptr_node::create(buffer::create(_len)));
}
- void buffer::list::rebuild(ptr& nb)
+ void buffer::list::rebuild(ptr_node& nb)
{
unsigned pos = 0;
for (auto& node : _buffers) {
}
_memcopy_count += pos;
_buffers.clear_and_dispose(ptr_node::disposer());
- if (nb.length())
- _buffers.push_back(ptr_node::create(nb));
+ if (likely(nb.length())) {
+ _buffers.push_back(nb);
+ } else {
+ ptr_node::disposer()(&nb);
+ }
invalidate_crc();
last_p = begin();
}
!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);
+ unaligned.rebuild(
+ ptr_node::create(
+ buffer::create_aligned(unaligned._len, align_memory)));
_memcopy_count += unaligned._len;
}
_buffers.insert(p, ptr_node::create(unaligned._buffers.front()));
}
}
// add new item to list
- push_back(ptr(bp, off, len));
+ push_back(ptr_node::create(bp, off, len));
}
void buffer::list::append(const list& bl)
ssize_t buffer::list::read_fd(int fd, size_t len)
{
- bufferptr bp = buffer::create(len);
+ auto& bp = ptr_node::create(buffer::create(len));
ssize_t ret = safe_read(fd, (void*)bp.c_str(), len);
if (ret >= 0) {
bp.set_length(ret);
- append(std::move(bp));
+ push_back(bp);
}
return ret;
}
buffer::list buffer::list::static_from_mem(char* c, size_t l) {
list bl;
- bl.push_back(ptr(create_static(l, c)));
+ bl.push_back(ptr_node::create(create_static(l, c)));
return bl;
}
_len += bp.length();
_buffers.push_back(ptr_node::create(std::move(bp)));
}
+ void push_back(ptr_node& bp) {
+ if (bp.length() == 0)
+ return;
+ _len += bp.length();
+ _buffers.push_back(bp);
+ }
void push_back(raw *r) {
_buffers.push_back(ptr_node::create(r));
_len += _buffers.back().length();
bool is_contiguous() const;
void rebuild();
- void rebuild(ptr& nb);
+ void rebuild(ptr_node& nb);
bool rebuild_aligned(unsigned align);
// max_buffers = 0 mean don't care _buffers.size(), other
// must make _buffers.size() <= max_buffers after rebuilding.
});
auto gather_ctx = new C_Gather(m_dest->cct, end_op_ctx);
- bufferptr m_ptr(m_bl->length());
+ auto& m_ptr = buffer::ptr_node::create(m_bl->length());
m_bl->rebuild(m_ptr);
size_t write_offset = 0;
size_t write_length = 0;
&write_offset,
&write_length,
&offset)) {
- bufferptr write_ptr(m_ptr, write_offset, write_length);
+ auto& write_ptr = \
+ buffer::ptr_node::create(m_ptr, write_offset, write_length);
bufferlist *write_bl = new bufferlist();
write_bl->push_back(write_ptr);
Context *ctx = new C_CopyWrite(write_bl, gather_ctx->new_sub());