]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Add diagnostic unshareable buffer.
authorMatt Benjamin <matt@cohortfs.com>
Mon, 8 Dec 2014 23:47:29 +0000 (18:47 -0500)
committerMatt Benjamin <matt@cohortfs.com>
Thu, 11 Dec 2014 00:13:03 +0000 (19:13 -0500)
Signed-off-by: Matt Benjamin <matt@cohortfs.com>
src/common/buffer.cc
src/include/buffer.h

index b3d9683d8d42af785bd1e6bb46915d16c0351cbb..2cdfa7714b66dd8e42885827f07ee176c80e985c 100644 (file)
@@ -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();
index 6eaa7b3c3936bcb5eb894bc5eba3cf1a0ef6a519..ec4a93c8648ca601bfcfa02ca9c0beb4d2f4d046 100644 (file)
@@ -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.