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