diff options
Diffstat (limited to 'boost/asio/detail/thread_info_base.hpp')
-rw-r--r-- | boost/asio/detail/thread_info_base.hpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/boost/asio/detail/thread_info_base.hpp b/boost/asio/detail/thread_info_base.hpp index 3baa8ef39f..c0dc322f41 100644 --- a/boost/asio/detail/thread_info_base.hpp +++ b/boost/asio/detail/thread_info_base.hpp @@ -42,13 +42,15 @@ public: static void* allocate(thread_info_base* this_thread, std::size_t size) { + std::size_t chunks = (size + chunk_size - 1) / chunk_size; + if (this_thread && this_thread->reusable_memory_) { void* const pointer = this_thread->reusable_memory_; this_thread->reusable_memory_ = 0; unsigned char* const mem = static_cast<unsigned char*>(pointer); - if (static_cast<std::size_t>(mem[0]) >= size) + if (static_cast<std::size_t>(mem[0]) >= chunks) { mem[size] = mem[0]; return pointer; @@ -57,16 +59,16 @@ public: ::operator delete(pointer); } - void* const pointer = ::operator new(size + 1); + void* const pointer = ::operator new(chunks * chunk_size + 1); unsigned char* const mem = static_cast<unsigned char*>(pointer); - mem[size] = (size <= UCHAR_MAX) ? static_cast<unsigned char>(size) : 0; + mem[size] = (chunks <= UCHAR_MAX) ? static_cast<unsigned char>(chunks) : 0; return pointer; } static void deallocate(thread_info_base* this_thread, void* pointer, std::size_t size) { - if (size <= UCHAR_MAX) + if (size <= chunk_size * UCHAR_MAX) { if (this_thread && this_thread->reusable_memory_ == 0) { @@ -81,6 +83,7 @@ public: } private: + enum { chunk_size = 4 }; void* reusable_memory_; }; |