From: Radoslaw Zarzynski Date: Wed, 5 Dec 2018 18:36:15 +0000 (+0100) Subject: common: switch to ceph::unique_leakable_ptr. X-Git-Tag: v14.1.0~172^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ae41d441824567324bbfc8dc6cc7f13c6ee7e3da;p=ceph.git common: switch to ceph::unique_leakable_ptr. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 34219f7b8a4..66b3f5ec85d 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -467,7 +467,7 @@ static ceph::spinlock debug_lock; _raw->nref++; bdout << "ptr " << this << " get " << _raw << bendl; } - buffer::ptr::ptr(const ptr& p, std::unique_ptr r) + buffer::ptr::ptr(const ptr& p, ceph::unique_leakable_ptr r) : _raw(r.release()), _off(p._off), _len(p._len) @@ -508,7 +508,7 @@ static ceph::spinlock debug_lock; return *this; } - std::unique_ptr buffer::ptr::clone() + ceph::unique_leakable_ptr buffer::ptr::clone() { return _raw->clone(); } diff --git a/src/include/buffer.h b/src/include/buffer.h index e3dd91948c2..97bc27a1000 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -87,6 +87,26 @@ using sha1_digest_t = sha_digest_t<20>; namespace ceph { +template +struct nop_delete { + void operator()(T*) {} +}; + +// This is not unique_ptr-like smart pointer! It just signalizes ownership +// but DOES NOT manage the resource. It WILL LEAK if not manually deleted. +// It's rather a replacement for raw pointer than any other smart one. +// +// Considered options: +// * unique_ptr with custom deleter implemented in .cc (would provide +// the non-zero-cost resource management), +// * GSL's owner (pretty neat but would impose an extra depedency), +// * unique_ptr with nop deleter, +// * raw pointer (doesn't embed ownership enforcement - std::move). +template +struct unique_leakable_ptr : public std::unique_ptr> { + using std::unique_ptr>::unique_ptr; +}; + namespace buffer CEPH_BUFFER_API { /* * exceptions @@ -255,7 +275,7 @@ namespace buffer CEPH_BUFFER_API { ptr(const ptr& p); ptr(ptr&& p) noexcept; ptr(const ptr& p, unsigned o, unsigned l); - ptr(const ptr& p, std::unique_ptr r); + ptr(const ptr& p, ceph::unique_leakable_ptr r); ptr& operator= (const ptr& p); ptr& operator= (ptr&& p) noexcept; ~ptr() { @@ -266,7 +286,7 @@ namespace buffer CEPH_BUFFER_API { bool have_raw() const { return _raw ? true:false; } - std::unique_ptr clone(); + ceph::unique_leakable_ptr clone(); void swap(ptr& other) noexcept; iterator begin(size_t offset=0) { @@ -1068,7 +1088,7 @@ namespace buffer CEPH_BUFFER_API { _carriage = &_buffers.back(); _len += _buffers.back().length(); } - void push_back(std::unique_ptr r) { + void push_back(ceph::unique_leakable_ptr r) { push_back(r.release()); } diff --git a/src/include/buffer_raw.h b/src/include/buffer_raw.h index e945f2043a4..73e6b465d21 100644 --- a/src/include/buffer_raw.h +++ b/src/include/buffer_raw.h @@ -86,10 +86,10 @@ public: return data; } virtual raw* clone_empty() = 0; - std::unique_ptr clone() { + ceph::unique_leakable_ptr clone() { raw* const c = clone_empty(); memcpy(c->data, data, len); - return std::unique_ptr(c); + return ceph::unique_leakable_ptr(c); } virtual bool is_shareable() const { // true if safe to reference/share the existing buffer copy