From 10cf8e798c982bc2ace8ec7ce3c40e469540277f Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 1 Nov 2018 23:27:51 -0700 Subject: [PATCH] ircd::buffer: Abstract the aligned_alloc() out of the unique_buffer template. --- include/ircd/buffer/unique_buffer.h | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/include/ircd/buffer/unique_buffer.h b/include/ircd/buffer/unique_buffer.h index 06881904f..18565ec4f 100644 --- a/include/ircd/buffer/unique_buffer.h +++ b/include/ircd/buffer/unique_buffer.h @@ -11,6 +11,11 @@ #pragma once #define HAVE_IRCD_BUFFER_UNIQUE_BUFFER_H +namespace ircd::buffer +{ + std::unique_ptr aligned_alloc(const size_t &align, const size_t &size); +} + /// Like unique_ptr, this template holds ownership of an allocated buffer /// template::allocate(const size_t &size) { + return aligned_alloc(alignment, size).release(); +} + +inline std::unique_ptr +ircd::buffer::aligned_alloc(const size_t &align, + const size_t &size) +{ + static const size_t &align_default{16}; + const size_t &alignment + { + align?: align_default + }; + int errc; void *ret; if(unlikely((errc = ::posix_memalign(&ret, alignment, size)) != 0)) @@ -126,5 +144,8 @@ ircd::buffer::unique_buffer::allocate(const size_t &size) assert(errc == 0); assert(ret != nullptr); - return reinterpret_cast(ret); + return std::unique_ptr + { + reinterpret_cast(ret), std::free + }; }