From c167e28788bf5a7eb419ef19403615f729fbc0ca Mon Sep 17 00:00:00 2001 From: arvidn Date: Sun, 23 Jul 2017 08:13:07 -0700 Subject: [PATCH] move stack allocator implementation into its own cpp file --- CMakeLists.txt | 1 + Jamfile | 1 + include/libtorrent/stack_allocator.hpp | 94 ++----------------- src/Makefile.am | 1 + src/stack_allocator.cpp | 125 +++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 84 deletions(-) create mode 100644 src/stack_allocator.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a3a7b98e..1f22a103d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,7 @@ set(sources ffs add_torrent_params peer_info + stack_allocator # -- extensions -- ut_pex diff --git a/Jamfile b/Jamfile index e5f6785f5..8ae1d38e4 100644 --- a/Jamfile +++ b/Jamfile @@ -679,6 +679,7 @@ SOURCES = ffs add_torrent_params peer_info + stack_allocator # -- extensions -- ut_pex diff --git a/include/libtorrent/stack_allocator.hpp b/include/libtorrent/stack_allocator.hpp index 3c8252e34..66f1b1786 100644 --- a/include/libtorrent/stack_allocator.hpp +++ b/include/libtorrent/stack_allocator.hpp @@ -60,7 +60,7 @@ namespace libtorrent { namespace aux { int m_idx; }; - struct stack_allocator + struct TORRENT_EXTRA_EXPORT stack_allocator { stack_allocator() {} @@ -68,91 +68,17 @@ namespace libtorrent { namespace aux { stack_allocator(stack_allocator const&) = delete; stack_allocator& operator=(stack_allocator const&) = delete; - allocation_slot copy_string(string_view str) - { - int const ret = int(m_storage.size()); - m_storage.resize(ret + numeric_cast(str.size()) + 1); - std::memcpy(&m_storage[ret], str.data(), str.size()); - m_storage[ret + int(str.length())] = '\0'; - return allocation_slot(ret); - } + allocation_slot copy_string(string_view str); + allocation_slot copy_string(char const* str); - allocation_slot copy_string(char const* str) - { - int const ret = int(m_storage.size()); - int const len = int(std::strlen(str)); - m_storage.resize(ret + len + 1); - std::memcpy(&m_storage[ret], str, numeric_cast(len)); - m_storage[ret + len] = '\0'; - return allocation_slot(ret); - } + allocation_slot format_string(char const* fmt, va_list v); - allocation_slot format_string(char const* fmt, va_list v) - { - int const ret = int(m_storage.size()); - m_storage.resize(ret + 512); - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wformat-nonliteral" -#endif - int const len = std::vsnprintf(m_storage.data() + ret, 512, fmt, v); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - - if (len < 0) - { - m_storage.resize(ret); - return copy_string("(format error)"); - } - - // +1 is to include the 0-terminator - m_storage.resize(ret + (len > 512 ? 512 : len) + 1); - return allocation_slot(ret); - } - - allocation_slot copy_buffer(span buf) - { - int const ret = int(m_storage.size()); - int const size = int(buf.size()); - if (size < 1) return allocation_slot(); - m_storage.resize(ret + size); - std::memcpy(&m_storage[ret], buf.data(), numeric_cast(size)); - return allocation_slot(ret); - } - - allocation_slot allocate(int const bytes) - { - if (bytes < 1) return allocation_slot(); - int const ret = m_storage.end_index(); - m_storage.resize(ret + bytes); - return allocation_slot(ret); - } - - char* ptr(allocation_slot const idx) - { - if(idx.val() < 0) return nullptr; - TORRENT_ASSERT(idx.val() < int(m_storage.size())); - return &m_storage[idx.val()]; - } - - char const* ptr(allocation_slot const idx) const - { - if(idx.val() < 0) return nullptr; - TORRENT_ASSERT(idx.val() < int(m_storage.size())); - return &m_storage[idx.val()]; - } - - void swap(stack_allocator& rhs) - { - m_storage.swap(rhs.m_storage); - } - - void reset() - { - m_storage.clear(); - } + allocation_slot copy_buffer(span buf); + allocation_slot allocate(int bytes); + char* ptr(allocation_slot idx); + char const* ptr(allocation_slot idx) const; + void swap(stack_allocator& rhs); + void reset(); private: diff --git a/src/Makefile.am b/src/Makefile.am index 7a6e51e04..3d5fc3636 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -164,6 +164,7 @@ libtorrent_rasterbar_la_SOURCES = \ ffs.cpp \ add_torrent_params.cpp \ peer_info.cpp \ + stack_allocator.cpp \ \ $(KADEMLIA_SOURCES) \ \ diff --git a/src/stack_allocator.cpp b/src/stack_allocator.cpp new file mode 100644 index 000000000..2620ebeb3 --- /dev/null +++ b/src/stack_allocator.cpp @@ -0,0 +1,125 @@ +/* + +Copyright (c) 2015-2016, Arvid Norberg +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "libtorrent/stack_allocator.hpp" + +namespace libtorrent { +namespace aux { + + allocation_slot stack_allocator::copy_string(string_view str) + { + int const ret = int(m_storage.size()); + m_storage.resize(ret + numeric_cast(str.size()) + 1); + std::memcpy(&m_storage[ret], str.data(), str.size()); + m_storage[ret + int(str.length())] = '\0'; + return allocation_slot(ret); + } + + allocation_slot stack_allocator::copy_string(char const* str) + { + int const ret = int(m_storage.size()); + int const len = int(std::strlen(str)); + m_storage.resize(ret + len + 1); + std::memcpy(&m_storage[ret], str, numeric_cast(len)); + m_storage[ret + len] = '\0'; + return allocation_slot(ret); + } + + allocation_slot stack_allocator::format_string(char const* fmt, va_list v) + { + int const ret = int(m_storage.size()); + m_storage.resize(ret + 512); + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wformat-nonliteral" +#endif + int const len = std::vsnprintf(m_storage.data() + ret, 512, fmt, v); +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + + if (len < 0) + { + m_storage.resize(ret); + return copy_string("(format error)"); + } + + // +1 is to include the 0-terminator + m_storage.resize(ret + (len > 512 ? 512 : len) + 1); + return allocation_slot(ret); + } + + allocation_slot stack_allocator::copy_buffer(span buf) + { + int const ret = int(m_storage.size()); + int const size = int(buf.size()); + if (size < 1) return allocation_slot(); + m_storage.resize(ret + size); + std::memcpy(&m_storage[ret], buf.data(), numeric_cast(size)); + return allocation_slot(ret); + } + + allocation_slot stack_allocator::allocate(int const bytes) + { + if (bytes < 1) return allocation_slot(); + int const ret = m_storage.end_index(); + m_storage.resize(ret + bytes); + return allocation_slot(ret); + } + + char* stack_allocator::ptr(allocation_slot const idx) + { + if(idx.val() < 0) return nullptr; + TORRENT_ASSERT(idx.val() < int(m_storage.size())); + return &m_storage[idx.val()]; + } + + char const* stack_allocator::ptr(allocation_slot const idx) const + { + if(idx.val() < 0) return nullptr; + TORRENT_ASSERT(idx.val() < int(m_storage.size())); + return &m_storage[idx.val()]; + } + + void stack_allocator::swap(stack_allocator& rhs) + { + m_storage.swap(rhs.m_storage); + } + + void stack_allocator::reset() + { + m_storage.clear(); + } +} +} +