}
#endif /* HAVE_XIO */
- buffer::raw* buffer::copy(const char *c, unsigned len) {
- raw* r = buffer::create_aligned(len, sizeof(size_t));
+ ceph::unique_leakable_ptr<buffer::raw> buffer::copy(const char *c, unsigned len) {
+ auto r = buffer::create_aligned(len, sizeof(size_t));
memcpy(r->data, c, len);
return r;
}
- buffer::raw* buffer::create(unsigned len) {
+ ceph::unique_leakable_ptr<buffer::raw> buffer::create(unsigned len) {
return buffer::create_aligned(len, sizeof(size_t));
}
- buffer::raw* buffer::create_in_mempool(unsigned len, int mempool) {
+ ceph::unique_leakable_ptr<buffer::raw> buffer::create_in_mempool(unsigned len, int mempool) {
return buffer::create_aligned_in_mempool(len, sizeof(size_t), mempool);
}
buffer::raw* buffer::claim_char(unsigned len, char *buf) {
return new raw_claim_buffer(buf, len, std::move(del));
}
- buffer::raw* buffer::create_aligned_in_mempool(
+ ceph::unique_leakable_ptr<buffer::raw> buffer::create_aligned_in_mempool(
unsigned len, unsigned align, int mempool) {
// If alignment is a page multiple, use a separate buffer::raw to
// avoid fragmenting the heap.
if ((align & ~CEPH_PAGE_MASK) == 0 ||
len >= CEPH_PAGE_SIZE * 2) {
#ifndef __CYGWIN__
- return new raw_posix_aligned(len, align);
+ return ceph::unique_leakable_ptr<buffer::raw>(new raw_posix_aligned(len, align));
#else
- return new raw_hack_aligned(len, align);
+ return ceph::unique_leakable_ptr<buffer::raw>(new raw_hack_aligned(len, align));
#endif
}
- return raw_combined::create(len, align, mempool);
+ return ceph::unique_leakable_ptr<buffer::raw>(
+ raw_combined::create(len, align, mempool));
}
- buffer::raw* buffer::create_aligned(
+ ceph::unique_leakable_ptr<buffer::raw> buffer::create_aligned(
unsigned len, unsigned align) {
return create_aligned_in_mempool(len, align,
mempool::mempool_buffer_anon);
}
- buffer::raw* buffer::create_page_aligned(unsigned len) {
+ ceph::unique_leakable_ptr<buffer::raw> buffer::create_page_aligned(unsigned len) {
return create_aligned(len, CEPH_PAGE_SIZE);
}
- buffer::raw* buffer::create_small_page_aligned(unsigned len) {
+ ceph::unique_leakable_ptr<buffer::raw> buffer::create_small_page_aligned(unsigned len) {
if (len < CEPH_PAGE_SIZE) {
return create_aligned(len, CEPH_BUFFER_ALLOC_UNIT);
} else
r->nref++;
bdout << "ptr " << this << " get " << _raw << bendl;
}
+ buffer::ptr::ptr(ceph::unique_leakable_ptr<raw> r)
+ : _raw(r.release()),
+ _off(0),
+ _len(_raw->len)
+ {
+ _raw->nref.store(1, std::memory_order_release);
+ bdout << "ptr " << this << " get " << _raw << bendl;
+ }
buffer::ptr::ptr(unsigned l) : _off(0), _len(l)
{
- _raw = create(l);
- _raw->nref++;
+ _raw = buffer::create(l).release();
+ _raw->nref.store(1, std::memory_order_release);
bdout << "ptr " << this << " get " << _raw << bendl;
}
buffer::ptr::ptr(const char *d, unsigned l) : _off(0), _len(l) // ditto.
{
- _raw = copy(d, l);
- _raw->nref++;
+ _raw = buffer::copy(d, l).release();
+ _raw->nref.store(1, std::memory_order_release);
bdout << "ptr " << this << " get " << _raw << bendl;
}
buffer::ptr::ptr(const ptr& p) : _raw(p._raw), _off(p._off), _len(p._len)
return is_hypercombined;
}
+std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer>
+buffer::ptr_node::create_hypercombined(ceph::unique_leakable_ptr<buffer::raw> r)
+{
+ return std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer>(
+ new (&r->bptr_storage) ptr_node(std::move(r)));
+}
+
std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer>
buffer::ptr_node::create_hypercombined(buffer::raw* const r)
{
raw_seastar_foreign_ptr(temporary_buffer&& buf)
: raw(buf.get_write(), buf.size()), ptr(std::move(buf)) {}
raw* clone_empty() override {
- return create(len);
+ return create(len).release();
}
};
raw_seastar_local_ptr(temporary_buffer&& buf)
: raw(buf.get_write(), buf.size()), buf(std::move(buf)) {}
raw* clone_empty() override {
- return create(len);
+ return create(len).release();
}
};
raw_seastar_local_shared_ptr(temporary_buffer& buf)
: raw(buf.get_write(), buf.size()), buf(buf.share()) {}
raw* clone_empty() override {
- return ceph::buffer::create(len);
+ return ceph::buffer::create(len).release();
}
};
}
buffer::ptr const_seastar_buffer_iterator::get_ptr(size_t len)
{
- buffer::raw* r = buffer::copy(get_pos_add(len), len);
- return buffer::ptr{r};
+ return buffer::ptr{ buffer::copy(get_pos_add(len), len) };
}
/*
* named constructors
*/
- raw* copy(const char *c, unsigned len);
- raw* create(unsigned len);
- raw* create_in_mempool(unsigned len, int mempool);
+ ceph::unique_leakable_ptr<raw> copy(const char *c, unsigned len);
+ ceph::unique_leakable_ptr<raw> create(unsigned len);
+ ceph::unique_leakable_ptr<raw> create_in_mempool(unsigned len, int mempool);
raw* claim_char(unsigned len, char *buf);
raw* create_malloc(unsigned len);
raw* claim_malloc(unsigned len, char *buf);
raw* create_static(unsigned len, char *buf);
- raw* create_aligned(unsigned len, unsigned align);
- raw* create_aligned_in_mempool(unsigned len, unsigned align, int mempool);
- raw* create_page_aligned(unsigned len);
- raw* create_small_page_aligned(unsigned len);
+ ceph::unique_leakable_ptr<raw> create_aligned(unsigned len, unsigned align);
+ ceph::unique_leakable_ptr<raw> create_aligned_in_mempool(unsigned len, unsigned align, int mempool);
+ ceph::unique_leakable_ptr<raw> create_page_aligned(unsigned len);
+ ceph::unique_leakable_ptr<raw> create_small_page_aligned(unsigned len);
raw* create_unshareable(unsigned len);
raw* create_static(unsigned len, char *buf);
raw* claim_buffer(unsigned len, char *buf, deleter del);
ptr() : _raw(nullptr), _off(0), _len(0) {}
// cppcheck-suppress noExplicitConstructor
ptr(raw* r);
+ ptr(ceph::unique_leakable_ptr<raw> r);
// cppcheck-suppress noExplicitConstructor
ptr(unsigned l);
ptr(const char *d, unsigned l);
~ptr_node() = default;
+ static std::unique_ptr<ptr_node, disposer>
+ create(ceph::unique_leakable_ptr<raw> r) {
+ return create_hypercombined(std::move(r));
+ }
static std::unique_ptr<ptr_node, disposer> create(raw* const r) {
return create_hypercombined(r);
}
void swap(ptr_node& other) noexcept = delete;
static bool dispose_if_hypercombined(ptr_node* delete_this);
- static std::unique_ptr<ptr_node, disposer> create_hypercombined(raw* r);
+ static std::unique_ptr<ptr_node, disposer> create_hypercombined(
+ buffer::raw* r);
+ static std::unique_ptr<ptr_node, disposer> create_hypercombined(
+ ceph::unique_leakable_ptr<raw> r);
};
/*
* list - the useful bit!
TracepointProvider::Traits tracepoint_traits("librbd_tp.so", "rbd_tracing");
-buffer::raw* create_write_raw(librbd::ImageCtx *ictx, const char *buf,
- size_t len) {
+static auto create_write_raw(librbd::ImageCtx *ictx, const char *buf,
+ size_t len) {
// TODO: until librados can guarantee memory won't be referenced after
// it ACKs a request, always make a copy of the user-provided memory
return buffer::copy(buf, len);
#include <sys/uio.h>
#include "include/buffer.h"
+#include "include/buffer_raw.h"
#include "include/utime.h"
#include "include/coredumpctl.h"
#include "include/encoding.h"