}
};
+ 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) { }
#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();
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);
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.