Home | History | Annotate | Download | only in detail
      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:
     28   thread_info_base()
     29     : reusable_memory_(0)
     30   {
     31   }
     32 
     33   ~thread_info_base()
     34   {
     35     if (reusable_memory_)
     36       ::operator delete(reusable_memory_);
     37   }
     38 
     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 
     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