thread_heap_alloc.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. // Distributed under the Boost Software License, Version 1.0. (See
  2. // accompanying file LICENSE_1_0.txt or copy at
  3. // http://www.boost.org/LICENSE_1_0.txt)
  4. // (C) Copyright 2007 Anthony Williams
  5. #ifndef THREAD_HEAP_ALLOC_HPP
  6. #define THREAD_HEAP_ALLOC_HPP
  7. #include <new>
  8. #include <boost/thread/detail/config.hpp>
  9. #include <boost/thread/win32/thread_primitives.hpp>
  10. #include <stdexcept>
  11. #include <boost/assert.hpp>
  12. #include <boost/throw_exception.hpp>
  13. #include <boost/detail/no_exceptions_support.hpp>
  14. #if defined( BOOST_USE_WINDOWS_H )
  15. # include <windows.h>
  16. namespace boost
  17. {
  18. namespace detail
  19. {
  20. namespace win32
  21. {
  22. using ::GetProcessHeap;
  23. using ::HeapAlloc;
  24. using ::HeapFree;
  25. }
  26. }
  27. }
  28. #else
  29. # ifdef HeapAlloc
  30. # undef HeapAlloc
  31. # endif
  32. namespace boost
  33. {
  34. namespace detail
  35. {
  36. namespace win32
  37. {
  38. extern "C"
  39. {
  40. __declspec(dllimport) handle __stdcall GetProcessHeap();
  41. __declspec(dllimport) void* __stdcall HeapAlloc(handle,unsigned long,ulong_ptr);
  42. __declspec(dllimport) int __stdcall HeapFree(handle,unsigned long,void*);
  43. }
  44. }
  45. }
  46. }
  47. #endif
  48. #include <boost/config/abi_prefix.hpp>
  49. namespace boost
  50. {
  51. namespace detail
  52. {
  53. inline void* allocate_raw_heap_memory(unsigned size)
  54. {
  55. void* const heap_memory=detail::win32::HeapAlloc(detail::win32::GetProcessHeap(),0,size);
  56. if(!heap_memory)
  57. {
  58. boost::throw_exception(std::bad_alloc());
  59. }
  60. return heap_memory;
  61. }
  62. inline void free_raw_heap_memory(void* heap_memory)
  63. {
  64. BOOST_VERIFY(detail::win32::HeapFree(detail::win32::GetProcessHeap(),0,heap_memory)!=0);
  65. }
  66. template<typename T>
  67. inline T* heap_new()
  68. {
  69. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  70. BOOST_TRY
  71. {
  72. T* const data=new (heap_memory) T();
  73. return data;
  74. }
  75. BOOST_CATCH(...)
  76. {
  77. free_raw_heap_memory(heap_memory);
  78. BOOST_RETHROW
  79. }
  80. BOOST_CATCH_END
  81. }
  82. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  83. template<typename T,typename A1>
  84. inline T* heap_new(A1&& a1)
  85. {
  86. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  87. BOOST_TRY
  88. {
  89. T* const data=new (heap_memory) T(static_cast<A1&&>(a1));
  90. return data;
  91. }
  92. BOOST_CATCH(...)
  93. {
  94. free_raw_heap_memory(heap_memory);
  95. BOOST_RETHROW
  96. }
  97. BOOST_CATCH_END
  98. }
  99. template<typename T,typename A1,typename A2>
  100. inline T* heap_new(A1&& a1,A2&& a2)
  101. {
  102. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  103. BOOST_TRY
  104. {
  105. T* const data=new (heap_memory) T(static_cast<A1&&>(a1),static_cast<A2&&>(a2));
  106. return data;
  107. }
  108. BOOST_CATCH(...)
  109. {
  110. free_raw_heap_memory(heap_memory);
  111. BOOST_RETHROW
  112. }
  113. BOOST_CATCH_END
  114. }
  115. template<typename T,typename A1,typename A2,typename A3>
  116. inline T* heap_new(A1&& a1,A2&& a2,A3&& a3)
  117. {
  118. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  119. BOOST_TRY
  120. {
  121. T* const data=new (heap_memory) T(static_cast<A1&&>(a1),static_cast<A2&&>(a2),
  122. static_cast<A3&&>(a3));
  123. return data;
  124. }
  125. BOOST_CATCH(...)
  126. {
  127. free_raw_heap_memory(heap_memory);
  128. BOOST_RETHROW
  129. }
  130. BOOST_CATCH_END
  131. }
  132. template<typename T,typename A1,typename A2,typename A3,typename A4>
  133. inline T* heap_new(A1&& a1,A2&& a2,A3&& a3,A4&& a4)
  134. {
  135. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  136. BOOST_TRY
  137. {
  138. T* const data=new (heap_memory) T(static_cast<A1&&>(a1),static_cast<A2&&>(a2),
  139. static_cast<A3&&>(a3),static_cast<A4&&>(a4));
  140. return data;
  141. }
  142. BOOST_CATCH(...)
  143. {
  144. free_raw_heap_memory(heap_memory);
  145. BOOST_RETHROW
  146. }
  147. BOOST_CATCH_END
  148. }
  149. #else
  150. template<typename T,typename A1>
  151. inline T* heap_new_impl(A1 a1)
  152. {
  153. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  154. BOOST_TRY
  155. {
  156. T* const data=new (heap_memory) T(a1);
  157. return data;
  158. }
  159. BOOST_CATCH(...)
  160. {
  161. free_raw_heap_memory(heap_memory);
  162. BOOST_RETHROW
  163. }
  164. BOOST_CATCH_END
  165. }
  166. template<typename T,typename A1,typename A2>
  167. inline T* heap_new_impl(A1 a1,A2 a2)
  168. {
  169. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  170. BOOST_TRY
  171. {
  172. T* const data=new (heap_memory) T(a1,a2);
  173. return data;
  174. }
  175. BOOST_CATCH(...)
  176. {
  177. free_raw_heap_memory(heap_memory);
  178. BOOST_RETHROW
  179. }
  180. BOOST_CATCH_END
  181. }
  182. template<typename T,typename A1,typename A2,typename A3>
  183. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3)
  184. {
  185. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  186. BOOST_TRY
  187. {
  188. T* const data=new (heap_memory) T(a1,a2,a3);
  189. return data;
  190. }
  191. BOOST_CATCH(...)
  192. {
  193. free_raw_heap_memory(heap_memory);
  194. BOOST_RETHROW
  195. }
  196. BOOST_CATCH_END
  197. }
  198. template<typename T,typename A1,typename A2,typename A3,typename A4>
  199. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4)
  200. {
  201. void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
  202. BOOST_TRY
  203. {
  204. T* const data=new (heap_memory) T(a1,a2,a3,a4);
  205. return data;
  206. }
  207. BOOST_CATCH(...)
  208. {
  209. free_raw_heap_memory(heap_memory);
  210. BOOST_RETHROW
  211. }
  212. BOOST_CATCH_END
  213. }
  214. template<typename T,typename A1>
  215. inline T* heap_new(A1 const& a1)
  216. {
  217. return heap_new_impl<T,A1 const&>(a1);
  218. }
  219. template<typename T,typename A1>
  220. inline T* heap_new(A1& a1)
  221. {
  222. return heap_new_impl<T,A1&>(a1);
  223. }
  224. template<typename T,typename A1,typename A2>
  225. inline T* heap_new(A1 const& a1,A2 const& a2)
  226. {
  227. return heap_new_impl<T,A1 const&,A2 const&>(a1,a2);
  228. }
  229. template<typename T,typename A1,typename A2>
  230. inline T* heap_new(A1& a1,A2 const& a2)
  231. {
  232. return heap_new_impl<T,A1&,A2 const&>(a1,a2);
  233. }
  234. template<typename T,typename A1,typename A2>
  235. inline T* heap_new(A1 const& a1,A2& a2)
  236. {
  237. return heap_new_impl<T,A1 const&,A2&>(a1,a2);
  238. }
  239. template<typename T,typename A1,typename A2>
  240. inline T* heap_new(A1& a1,A2& a2)
  241. {
  242. return heap_new_impl<T,A1&,A2&>(a1,a2);
  243. }
  244. template<typename T,typename A1,typename A2,typename A3>
  245. inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3)
  246. {
  247. return heap_new_impl<T,A1 const&,A2 const&,A3 const&>(a1,a2,a3);
  248. }
  249. template<typename T,typename A1,typename A2,typename A3>
  250. inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3)
  251. {
  252. return heap_new_impl<T,A1&,A2 const&,A3 const&>(a1,a2,a3);
  253. }
  254. template<typename T,typename A1,typename A2,typename A3>
  255. inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3)
  256. {
  257. return heap_new_impl<T,A1 const&,A2&,A3 const&>(a1,a2,a3);
  258. }
  259. template<typename T,typename A1,typename A2,typename A3>
  260. inline T* heap_new(A1& a1,A2& a2,A3 const& a3)
  261. {
  262. return heap_new_impl<T,A1&,A2&,A3 const&>(a1,a2,a3);
  263. }
  264. template<typename T,typename A1,typename A2,typename A3>
  265. inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3)
  266. {
  267. return heap_new_impl<T,A1 const&,A2 const&,A3&>(a1,a2,a3);
  268. }
  269. template<typename T,typename A1,typename A2,typename A3>
  270. inline T* heap_new(A1& a1,A2 const& a2,A3& a3)
  271. {
  272. return heap_new_impl<T,A1&,A2 const&,A3&>(a1,a2,a3);
  273. }
  274. template<typename T,typename A1,typename A2,typename A3>
  275. inline T* heap_new(A1 const& a1,A2& a2,A3& a3)
  276. {
  277. return heap_new_impl<T,A1 const&,A2&,A3&>(a1,a2,a3);
  278. }
  279. template<typename T,typename A1,typename A2,typename A3>
  280. inline T* heap_new(A1& a1,A2& a2,A3& a3)
  281. {
  282. return heap_new_impl<T,A1&,A2&,A3&>(a1,a2,a3);
  283. }
  284. template<typename T,typename A1,typename A2,typename A3,typename A4>
  285. inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4 const& a4)
  286. {
  287. return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4);
  288. }
  289. template<typename T,typename A1,typename A2,typename A3,typename A4>
  290. inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4 const& a4)
  291. {
  292. return heap_new_impl<T,A1&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4);
  293. }
  294. template<typename T,typename A1,typename A2,typename A3,typename A4>
  295. inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4 const& a4)
  296. {
  297. return heap_new_impl<T,A1 const&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4);
  298. }
  299. template<typename T,typename A1,typename A2,typename A3,typename A4>
  300. inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4 const& a4)
  301. {
  302. return heap_new_impl<T,A1&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4);
  303. }
  304. template<typename T,typename A1,typename A2,typename A3,typename A4>
  305. inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4 const& a4)
  306. {
  307. return heap_new_impl<T,A1 const&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4);
  308. }
  309. template<typename T,typename A1,typename A2,typename A3,typename A4>
  310. inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4 const& a4)
  311. {
  312. return heap_new_impl<T,A1&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4);
  313. }
  314. template<typename T,typename A1,typename A2,typename A3,typename A4>
  315. inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4 const& a4)
  316. {
  317. return heap_new_impl<T,A1 const&,A2&,A3&,A4 const&>(a1,a2,a3,a4);
  318. }
  319. template<typename T,typename A1,typename A2,typename A3,typename A4>
  320. inline T* heap_new(A1& a1,A2& a2,A3& a3,A4 const& a4)
  321. {
  322. return heap_new_impl<T,A1&,A2&,A3&,A4 const&>(a1,a2,a3,a4);
  323. }
  324. template<typename T,typename A1,typename A2,typename A3,typename A4>
  325. inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4& a4)
  326. {
  327. return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4);
  328. }
  329. template<typename T,typename A1,typename A2,typename A3,typename A4>
  330. inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4& a4)
  331. {
  332. return heap_new_impl<T,A1&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4);
  333. }
  334. template<typename T,typename A1,typename A2,typename A3,typename A4>
  335. inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4& a4)
  336. {
  337. return heap_new_impl<T,A1 const&,A2&,A3 const&,A4&>(a1,a2,a3,a4);
  338. }
  339. template<typename T,typename A1,typename A2,typename A3,typename A4>
  340. inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4& a4)
  341. {
  342. return heap_new_impl<T,A1&,A2&,A3 const&,A4&>(a1,a2,a3,a4);
  343. }
  344. template<typename T,typename A1,typename A2,typename A3,typename A4>
  345. inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4& a4)
  346. {
  347. return heap_new_impl<T,A1 const&,A2 const&,A3&,A4&>(a1,a2,a3,a4);
  348. }
  349. template<typename T,typename A1,typename A2,typename A3,typename A4>
  350. inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4& a4)
  351. {
  352. return heap_new_impl<T,A1&,A2 const&,A3&,A4&>(a1,a2,a3,a4);
  353. }
  354. template<typename T,typename A1,typename A2,typename A3,typename A4>
  355. inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4& a4)
  356. {
  357. return heap_new_impl<T,A1 const&,A2&,A3&,A4&>(a1,a2,a3,a4);
  358. }
  359. template<typename T,typename A1,typename A2,typename A3,typename A4>
  360. inline T* heap_new(A1& a1,A2& a2,A3& a3,A4& a4)
  361. {
  362. return heap_new_impl<T,A1&,A2&,A3&,A4&>(a1,a2,a3,a4);
  363. }
  364. #endif
  365. template<typename T>
  366. inline void heap_delete(T* data)
  367. {
  368. data->~T();
  369. free_raw_heap_memory(data);
  370. }
  371. template<typename T>
  372. struct do_heap_delete
  373. {
  374. void operator()(T* data) const
  375. {
  376. detail::heap_delete(data);
  377. }
  378. };
  379. }
  380. }
  381. #include <boost/config/abi_suffix.hpp>
  382. #endif