From: Matt Benjamin Date: Mon, 8 Dec 2014 23:47:29 +0000 (-0500) Subject: Add diagnostic unshareable buffer. X-Git-Tag: v0.91~39^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6a45d7576b9957d8563d51c9354925b3d19320e2;p=ceph.git Add diagnostic unshareable buffer. Signed-off-by: Matt Benjamin --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index b3d9683d8d42..2cdfa7714b66 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -499,6 +499,27 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; } }; + class buffer::raw_unshareable : public buffer::raw { + public: + raw_unshareable(unsigned l) : raw(l) { + if (len) + data = new char[len]; + else + data = 0; + } + raw_unshareable(unsigned l, char *b) : raw(b, l) { + } + raw* clone_empty() { + return new raw_char(len); + } + bool is_shareable() { + return false; // !shareable, will force make_shareable() + } + ~raw_unshareable() { + delete[] data; + } + }; + class buffer::raw_static : public buffer::raw { public: raw_static(const char *d, unsigned l) : raw((char*)d, l) { } @@ -554,6 +575,10 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; #endif } + buffer::raw* buffer::create_unshareable(unsigned len) { + return new raw_unshareable(len); + } + buffer::ptr::ptr(raw *r) : _raw(r), _off(0), _len(r->len) // no lock needed; this is an unref raw. { r->nref.inc(); diff --git a/src/include/buffer.h b/src/include/buffer.h index 6eaa7b3c3936..ec4a93c8648c 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -136,6 +136,7 @@ private: class raw_hack_aligned; class raw_char; class raw_pipe; + class raw_unshareable; // diagnostic, unshareable char buffer friend std::ostream& operator<<(std::ostream& out, const raw &r); @@ -153,6 +154,7 @@ public: static raw* create_aligned(unsigned len, unsigned align); static raw* create_page_aligned(unsigned len); static raw* create_zero_copy(unsigned len, int fd, int64_t *offset); + static raw* create_unshareable(unsigned len); /* * a buffer pointer. references (a subsequence of) a raw buffer.