From: Sage Weil Date: Thu, 11 Feb 2016 17:52:56 +0000 (-0500) Subject: buffer: clean up raw_combined construction X-Git-Tag: v10.1.0~245^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ef80690622a145db892ff9b00811c5aff7d47caa;p=ceph.git buffer: clean up raw_combined construction Signed-off-by: Sage Weil --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index cea59d018a23..ee274a019f45 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -241,7 +241,7 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; /* * raw_combined is always placed within a single allocation along * with the data buffer. the data goes at the beginning, and - * raw_combined at the end. see create_combined. + * raw_combined at the end. */ class buffer::raw_combined : public buffer::raw { size_t alignment; @@ -255,9 +255,29 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; dec_total_alloc(len); } raw* clone_empty() { - if (alignment) - return create_aligned(len, alignment); - return create(len); + return create(len, alignment); + } + + static raw_combined *create(unsigned len, unsigned align=0) { + if (!align) + align = sizeof(size_t); + size_t rawlen = ROUND_UP_TO(sizeof(buffer::raw_combined), sizeof(size_t)); + size_t datalen = ROUND_UP_TO(len, sizeof(size_t)); + +#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 */ + if (!ptr) + throw bad_alloc(); + + // actual data first, since it has presumably larger alignment restriction + // then put the raw_combined at the end + return new (ptr + datalen) raw_combined(ptr, len, align); } static void operator delete(void *ptr) { @@ -687,30 +707,6 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; return new raw_static(buf, len); } - buffer::raw* buffer::create_combined(unsigned len, unsigned align) { - if (!align) - align = sizeof(size_t); - size_t rawlen = ROUND_UP_TO(sizeof(buffer::raw_combined), sizeof(size_t)); - size_t datalen = ROUND_UP_TO(len, sizeof(size_t)); - -#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 */ - if (!ptr) - throw bad_alloc(); - - // actual data first, since it has presumably larger alignment restriction - // then put the raw_combined at the end - raw *ret = new (ptr + datalen) raw_combined(ptr, len, align); - assert((char *)ret == ptr + datalen); - return ret; - } - buffer::raw* buffer::create_aligned(unsigned len, unsigned align) { // If alignment is a page multiple, use a separate buffer::raw to // avoid fragmenting the heap. @@ -729,7 +725,7 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; return new raw_hack_aligned(len, align); #endif } - return create_combined(len, align); + return raw_combined::create(len, align); } buffer::raw* buffer::create_page_aligned(unsigned len) { @@ -1660,7 +1656,7 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; unsigned gap = append_buffer.unused_tail_length(); if (!gap) { // make a new append_buffer! - append_buffer = create_combined(CEPH_BUFFER_APPEND_SIZE); + append_buffer = raw_combined::create(CEPH_BUFFER_APPEND_SIZE); append_buffer.set_length(0); // unused, so far. } append(append_buffer, append_buffer.append(c) - 1, 1); // add segment to the list @@ -1687,7 +1683,7 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; size_t need = ROUND_UP_TO(len, sizeof(size_t)) + sizeof(raw_combined); size_t alen = ROUND_UP_TO(need, CEPH_BUFFER_ALLOC_UNIT) - sizeof(raw_combined); - append_buffer = create_combined(alen); + append_buffer = raw_combined::create(alen); append_buffer.set_length(0); // unused, so far. } } diff --git a/src/include/buffer.h b/src/include/buffer.h index 056d69eb69f4..d765a76c4cb6 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -149,7 +149,6 @@ namespace buffer CEPH_BUFFER_API { raw* create_malloc(unsigned len); raw* claim_malloc(unsigned len, char *buf); raw* create_static(unsigned len, char *buf); - raw* create_combined(unsigned len, unsigned align=0); raw* create_aligned(unsigned len, unsigned align); raw* create_page_aligned(unsigned len); raw* create_zero_copy(unsigned len, int fd, int64_t *offset);