*
*/
-
+#include "include/mempool.h"
#include "armor.h"
#include "common/environment.h"
#include "common/errno.h"
#include <limits.h>
#include <ostream>
-namespace ceph {
#define CEPH_BUFFER_ALLOC_UNIT (MIN(CEPH_PAGE_SIZE, 4096))
#define CEPH_BUFFER_APPEND_SIZE (CEPH_BUFFER_ALLOC_UNIT - sizeof(raw_combined))
}
};
+ MEMPOOL_DEFINE_FACTORY(char, char, buffer_data);
+
/*
* raw_combined is always placed within a single allocation along
* with the data buffer. the data goes at the beginning, and
alignof(buffer::raw_combined));
size_t datalen = ROUND_UP_TO(len, alignof(buffer::raw_combined));
-#ifdef DARWIN
- char *ptr = (char *) valloc(rawlen + datalen);
-#else
- char *ptr = 0;
- int r = ::posix_memalign((void**)(void*)&ptr, align, rawlen + datalen);
- if (r)
- throw bad_alloc();
-#endif /* DARWIN */
+ char *ptr = mempool::buffer_data::alloc_char.allocate_aligned(
+ rawlen + datalen, align);
if (!ptr)
throw bad_alloc();
static void operator delete(void *ptr) {
raw_combined *raw = (raw_combined *)ptr;
- ::free((void *)raw->data);
+ size_t rawlen = ROUND_UP_TO(sizeof(buffer::raw_combined),
+ alignof(buffer::raw_combined));
+ size_t datalen = ROUND_UP_TO(raw->len, alignof(buffer::raw_combined));
+ mempool::buffer_data::alloc_char.deallocate_aligned(
+ raw->data, rawlen + datalen);
}
};
class buffer::raw_malloc : public buffer::raw {
public:
+ MEMPOOL_CLASS_HELPERS();
+
explicit raw_malloc(unsigned l) : raw(l) {
if (len) {
data = (char *)malloc(len);
#ifndef __CYGWIN__
class buffer::raw_mmap_pages : public buffer::raw {
public:
+ MEMPOOL_CLASS_HELPERS();
+
explicit raw_mmap_pages(unsigned l) : raw(l) {
data = (char*)::mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
if (!data)
class buffer::raw_posix_aligned : public buffer::raw {
unsigned align;
public:
+ MEMPOOL_CLASS_HELPERS();
+
raw_posix_aligned(unsigned l, unsigned _align) : raw(l) {
align = _align;
assert((align >= sizeof(void *)) && (align & (align - 1)) == 0);
#ifdef CEPH_HAVE_SPLICE
class buffer::raw_pipe : public buffer::raw {
public:
+ MEMPOOL_CLASS_HELPERS();
+
explicit raw_pipe(unsigned len) : raw(len), source_consumed(false) {
size_t max = get_max_pipe_size();
if (len > max) {
*/
class buffer::raw_char : public buffer::raw {
public:
+ MEMPOOL_CLASS_HELPERS();
+
explicit raw_char(unsigned l) : raw(l) {
if (len)
- data = new char[len];
+ data = mempool::buffer_data::alloc_char.allocate(len);
else
data = 0;
inc_total_alloc(len);
bdout << "raw_char " << this << " alloc " << (void *)data << " " << l << " " << buffer::get_total_alloc() << bendl;
}
~raw_char() {
- delete[] data;
+ if (data)
+ mempool::buffer_data::alloc_char.deallocate(data, len);
dec_total_alloc(len);
bdout << "raw_char " << this << " free " << (void *)data << " " << buffer::get_total_alloc() << bendl;
}
class buffer::raw_unshareable : public buffer::raw {
public:
+ MEMPOOL_CLASS_HELPERS();
+
explicit raw_unshareable(unsigned l) : raw(l) {
if (len)
data = new char[len];
class buffer::raw_static : public buffer::raw {
public:
+ MEMPOOL_CLASS_HELPERS();
+
raw_static(const char *d, unsigned l) : raw((char*)d, l) { }
~raw_static() {}
raw* clone_empty() {
{
return out << e.what();
}
-}
+
+MEMPOOL_DEFINE_OBJECT_FACTORY(buffer::raw_malloc, buffer_raw_malloc,
+ buffer_meta);
+MEMPOOL_DEFINE_OBJECT_FACTORY(buffer::raw_mmap_pages, buffer_raw_mmap_pagse,
+ buffer_meta);
+MEMPOOL_DEFINE_OBJECT_FACTORY(buffer::raw_posix_aligned,
+ buffer_raw_posix_aligned, buffer_meta);
+MEMPOOL_DEFINE_OBJECT_FACTORY(buffer::raw_pipe, buffer_raw_pipe, buffer_meta);
+MEMPOOL_DEFINE_OBJECT_FACTORY(buffer::raw_char, buffer_raw_char, buffer_meta);
+MEMPOOL_DEFINE_OBJECT_FACTORY(buffer::raw_unshareable, buffer_raw_unshareable,
+ buffer_meta);
+MEMPOOL_DEFINE_OBJECT_FACTORY(buffer::raw_static, buffer_raw_static,
+ buffer_meta);
+