Chris@16: // Chris@16: // detail/thread_info_base.hpp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_DETAIL_THREAD_INFO_BASE_HPP Chris@16: #define BOOST_ASIO_DETAIL_THREAD_INFO_BASE_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace detail { Chris@16: Chris@16: class thread_info_base Chris@16: : private noncopyable Chris@16: { Chris@16: public: Chris@16: thread_info_base() Chris@16: : reusable_memory_(0) Chris@16: { Chris@16: } Chris@16: Chris@16: ~thread_info_base() Chris@16: { Chris@16: if (reusable_memory_) Chris@16: ::operator delete(reusable_memory_); Chris@16: } Chris@16: Chris@16: static void* allocate(thread_info_base* this_thread, std::size_t size) Chris@16: { Chris@16: if (this_thread && this_thread->reusable_memory_) Chris@16: { Chris@16: void* const pointer = this_thread->reusable_memory_; Chris@16: this_thread->reusable_memory_ = 0; Chris@16: Chris@16: unsigned char* const mem = static_cast(pointer); Chris@16: if (static_cast(mem[0]) >= size) Chris@16: { Chris@16: mem[size] = mem[0]; Chris@16: return pointer; Chris@16: } Chris@16: Chris@16: ::operator delete(pointer); Chris@16: } Chris@16: Chris@16: void* const pointer = ::operator new(size + 1); Chris@16: unsigned char* const mem = static_cast(pointer); Chris@16: mem[size] = (size <= UCHAR_MAX) ? static_cast(size) : 0; Chris@16: return pointer; Chris@16: } Chris@16: Chris@16: static void deallocate(thread_info_base* this_thread, Chris@16: void* pointer, std::size_t size) Chris@16: { Chris@16: if (size <= UCHAR_MAX) Chris@16: { Chris@16: if (this_thread && this_thread->reusable_memory_ == 0) Chris@16: { Chris@16: unsigned char* const mem = static_cast(pointer); Chris@16: mem[0] = mem[size]; Chris@16: this_thread->reusable_memory_ = pointer; Chris@16: return; Chris@16: } Chris@16: } Chris@16: Chris@16: ::operator delete(pointer); Chris@16: } Chris@16: Chris@16: private: Chris@16: void* reusable_memory_; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_ASIO_DETAIL_THREAD_INFO_BASE_HPP