1 // 2 // detail/thread_info_base.hpp 3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef ASIO_DETAIL_THREAD_INFO_BASE_HPP 12 #define ASIO_DETAIL_THREAD_INFO_BASE_HPP 13 14 15 #include <climits> 16 #include <cstddef> 17 #include "asio/detail/noncopyable.hpp" 18 19 #include "asio/detail/push_options.hpp" 20 21 namespace asio { 22 namespace detail { 23 24 class thread_info_base 25 : private noncopyable 26 { 27 public: thread_info_base()28 thread_info_base() 29 : reusable_memory_(0) 30 { 31 } 32 ~thread_info_base()33 ~thread_info_base() 34 { 35 if (reusable_memory_) 36 ::operator delete(reusable_memory_); 37 } 38 allocate(thread_info_base * this_thread,std::size_t size)39 static void* allocate(thread_info_base* this_thread, std::size_t size) 40 { 41 if (this_thread && this_thread->reusable_memory_) 42 { 43 void* const pointer = this_thread->reusable_memory_; 44 this_thread->reusable_memory_ = 0; 45 46 unsigned char* const mem = static_cast<unsigned char*>(pointer); 47 if (static_cast<std::size_t>(mem[0]) >= size) 48 { 49 mem[size] = mem[0]; 50 return pointer; 51 } 52 53 ::operator delete(pointer); 54 } 55 56 void* const pointer = ::operator new(size + 1); 57 unsigned char* const mem = static_cast<unsigned char*>(pointer); 58 mem[size] = (size <= UCHAR_MAX) ? static_cast<unsigned char>(size) : 0; 59 return pointer; 60 } 61 deallocate(thread_info_base * this_thread,void * pointer,std::size_t size)62 static void deallocate(thread_info_base* this_thread, 63 void* pointer, std::size_t size) 64 { 65 if (size <= UCHAR_MAX) 66 { 67 if (this_thread && this_thread->reusable_memory_ == 0) 68 { 69 unsigned char* const mem = static_cast<unsigned char*>(pointer); 70 mem[0] = mem[size]; 71 this_thread->reusable_memory_ = pointer; 72 return; 73 } 74 } 75 76 ::operator delete(pointer); 77 } 78 79 private: 80 void* reusable_memory_; 81 }; 82 83 } // namespace detail 84 } // namespace asio 85 86 #include "asio/detail/pop_options.hpp" 87 88 #endif // ASIO_DETAIL_THREAD_INFO_BASE_HPP 89