MessagePack for C++
Loading...
Searching...
No Matches
cpp03_zone.hpp
Go to the documentation of this file.
1//
2// MessagePack for C++ memory pool
3//
4// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
5//
6// Distributed under the Boost Software License, Version 1.0.
7// (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9//
10#ifndef MSGPACK_V1_CPP03_ZONE_HPP
11#define MSGPACK_V1_CPP03_ZONE_HPP
12
15#include "msgpack/zone_decl.hpp"
16#include "msgpack/assert.hpp"
17
18#include <stdint.h>
19#include <cstdlib>
20#include <memory>
21#include <vector>
22
23
24namespace msgpack {
25
29
30class zone {
31 struct finalizer {
32 finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {}
33 void operator()() { m_func(m_data); }
34 void (*m_func)(void*);
35 void* m_data;
36 };
37 struct finalizer_array {
38 finalizer_array():m_tail(MSGPACK_NULLPTR), m_end(MSGPACK_NULLPTR), m_array(MSGPACK_NULLPTR) {}
39 void call() {
40 finalizer* fin = m_tail;
41 for(; fin != m_array; --fin) (*(fin-1))();
42 }
43 ~finalizer_array() {
44 call();
45 ::free(m_array);
46 }
47 void clear() {
48 call();
49 m_tail = m_array;
50 }
51 void push(void (*func)(void* data), void* data)
52 {
53 finalizer* fin = m_tail;
54
55 if(fin == m_end) {
56 push_expand(func, data);
57 return;
58 }
59
60 fin->m_func = func;
61 fin->m_data = data;
62
63 ++m_tail;
64 }
65 void push_expand(void (*func)(void*), void* data) {
66 const size_t nused = static_cast<size_t>(m_end - m_array);
67 size_t nnext;
68 if(nused == 0) {
69 nnext = (sizeof(finalizer) < 72/2) ?
70 72 / sizeof(finalizer) : 8;
71 } else {
72 nnext = nused * 2;
73 }
74 finalizer* tmp =
75 static_cast<finalizer*>(::realloc(m_array, sizeof(finalizer) * nnext));
76 if(!tmp) {
77 throw std::bad_alloc();
78 }
79 m_array = tmp;
80 m_end = tmp + nnext;
81 m_tail = tmp + nused;
82 new (m_tail) finalizer(func, data);
83
84 ++m_tail;
85 }
86 finalizer* m_tail;
87 finalizer* m_end;
88 finalizer* m_array;
89 };
90 struct chunk {
91 chunk* m_next;
92 };
93 struct chunk_list {
94 chunk_list(size_t chunk_size)
95 {
96 chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + chunk_size));
97 if(!c) {
98 throw std::bad_alloc();
99 }
100
101 m_head = c;
102 m_free = chunk_size;
103 m_ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
104 c->m_next = MSGPACK_NULLPTR;
105 }
106 ~chunk_list()
107 {
108 chunk* c = m_head;
109 while(c) {
110 chunk* n = c->m_next;
111 ::free(c);
112 c = n;
113 }
114 }
115 void clear(size_t chunk_size)
116 {
117 chunk* c = m_head;
118 while(true) {
119 chunk* n = c->m_next;
120 if(n) {
121 ::free(c);
122 c = n;
123 } else {
124 m_head = c;
125 break;
126 }
127 }
128 m_head->m_next = MSGPACK_NULLPTR;
129 m_free = chunk_size;
130 m_ptr = reinterpret_cast<char*>(m_head) + sizeof(chunk);
131 }
132 size_t m_free;
133 char* m_ptr;
134 chunk* m_head;
135 };
136 size_t m_chunk_size;
137 chunk_list m_chunk_list;
138 finalizer_array m_finalizer_array;
139
140public:
141 zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE);
142
143public:
144 void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN);
145 void* allocate_no_align(size_t size);
146
147 void push_finalizer(void (*func)(void*), void* data);
148
149 template <typename T>
150 void push_finalizer(msgpack::unique_ptr<T> obj);
151
152 void clear();
153
154 void swap(zone& o);
155 static void* operator new(std::size_t size)
156 {
157 void* p = ::malloc(size);
158 if (!p) throw std::bad_alloc();
159 return p;
160 }
161 static void operator delete(void *p) /* throw() */
162 {
163 ::free(p);
164 }
165 static void* operator new(std::size_t size, void* place) /* throw() */
166 {
167 return ::operator new(size, place);
168 }
169 static void operator delete(void* p, void* place) /* throw() */
170 {
171 ::operator delete(p, place);
172 }
173
174
175 template <typename T>
176 T* allocate();
177
178 template <typename T, typename A1>
179 T* allocate(A1 a1);
180
181 template <typename T, typename A1, typename A2>
182 T* allocate(A1 a1, A2 a2);
183
184 template <typename T, typename A1, typename A2, typename A3>
185 T* allocate(A1 a1, A2 a2, A3 a3);
186
187 template <typename T, typename A1, typename A2, typename A3, typename A4>
188 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4);
189
190 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
191 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5);
192
193 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
194 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6);
195
196 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
197 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7);
198
199 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
200 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8);
201
202 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
203 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9);
204
205 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
206 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10);
207
208 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
209 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11);
210
211 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
212 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12);
213
214 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
215 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13);
216
217 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
218 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14);
219
220 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14, typename A15>
221 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15);
222
224
225private:
226 void undo_allocate(size_t size);
227
228 template <typename T>
229 static void object_destruct(void* obj);
230
231 template <typename T>
232 static void object_delete(void* obj);
233
234 static char* get_aligned(char* ptr, size_t align);
235
236 char* allocate_expand(size_t size);
237private:
238 zone(const zone&);
239 zone& operator=(const zone&);
240};
241
242inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
243{
244}
245
246inline char* zone::get_aligned(char* ptr, size_t align)
247{
248 MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0)
249 return
250 reinterpret_cast<char*>(
251 reinterpret_cast<uintptr_t>(ptr + (align - 1)) & ~static_cast<uintptr_t>(align - 1)
252 );
253}
254
255inline void* zone::allocate_align(size_t size, size_t align)
256{
257 char* aligned = get_aligned(m_chunk_list.m_ptr, align);
258 size_t adjusted_size = size + static_cast<size_t>(aligned - m_chunk_list.m_ptr);
259 if (m_chunk_list.m_free < adjusted_size) {
260 size_t enough_size = size + align - 1;
261 char* ptr = allocate_expand(enough_size);
262 aligned = get_aligned(ptr, align);
263 adjusted_size = size + static_cast<size_t>(aligned - m_chunk_list.m_ptr);
264 }
265 m_chunk_list.m_free -= adjusted_size;
266 m_chunk_list.m_ptr += adjusted_size;
267 return aligned;
268}
269
270inline void* zone::allocate_no_align(size_t size)
271{
272 char* ptr = m_chunk_list.m_ptr;
273 if(m_chunk_list.m_free < size) {
274 ptr = allocate_expand(size);
275 }
276 m_chunk_list.m_free -= size;
277 m_chunk_list.m_ptr += size;
278
279 return ptr;
280}
281
282inline char* zone::allocate_expand(size_t size)
283{
284 chunk_list* const cl = &m_chunk_list;
285
286 size_t sz = m_chunk_size;
287
288 while(sz < size) {
289 size_t tmp_sz = sz * 2;
290 if (tmp_sz <= sz) {
291 sz = size;
292 break;
293 }
294 sz = tmp_sz;
295 }
296
297 if((sizeof(chunk) + sz) < sz) {
298 throw std::bad_alloc();
299 }
300
301 chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
302 if (!c) throw std::bad_alloc();
303
304 char* ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
305
306 c->m_next = cl->m_head;
307 cl->m_head = c;
308 cl->m_free = sz;
309 cl->m_ptr = ptr;
310
311 return ptr;
312}
313
314inline void zone::push_finalizer(void (*func)(void*), void* data)
315{
316 m_finalizer_array.push(func, data);
317}
318
319template <typename T>
320inline void zone::push_finalizer(msgpack::unique_ptr<T> obj)
321{
322 m_finalizer_array.push(&zone::object_delete<T>, obj.release());
323}
324
325inline void zone::clear()
326{
327 m_finalizer_array.clear();
328 m_chunk_list.clear(m_chunk_size);
329}
330
331inline void zone::swap(zone& o)
332{
333 using std::swap;
334 swap(m_chunk_size, o.m_chunk_size);
335 // Swap the internal pointers directly. std::swap on chunk_list /
336 // finalizer_array would construct a temporary and run its owning
337 // destructor (freeing chunks and executing finalizers) on memory that
338 // has just been transferred to the other zone -> double free / UAF.
339 swap(m_chunk_list.m_free, o.m_chunk_list.m_free);
340 swap(m_chunk_list.m_ptr, o.m_chunk_list.m_ptr);
341 swap(m_chunk_list.m_head, o.m_chunk_list.m_head);
342 swap(m_finalizer_array.m_tail, o.m_finalizer_array.m_tail);
343 swap(m_finalizer_array.m_end, o.m_finalizer_array.m_end);
344 swap(m_finalizer_array.m_array, o.m_finalizer_array.m_array);
345}
346
347template <typename T>
348void zone::object_destruct(void* obj)
349{
350 static_cast<T*>(obj)->~T();
351}
352
353template <typename T>
354void zone::object_delete(void* obj)
355{
356 delete static_cast<T*>(obj);
357}
358
359inline void zone::undo_allocate(size_t size)
360{
361 m_chunk_list.m_ptr -= size;
362 m_chunk_list.m_free += size;
363}
364
365inline std::size_t aligned_size(
366 std::size_t size,
367 std::size_t align) {
368 return (size + align - 1) / align * align;
369}
370
372
373template <typename T>
375{
376 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
377 try {
378 m_finalizer_array.push(&zone::object_destruct<T>, x);
379 } catch (...) {
380 undo_allocate(sizeof(T));
381 throw;
382 }
383 try {
384 return new (x) T();
385 } catch (...) {
386 --m_finalizer_array.m_tail;
387 undo_allocate(sizeof(T));
388 throw;
389 }
390}
391
392template <typename T, typename A1>
393T* zone::allocate(A1 a1)
394{
395 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
396 try {
397 m_finalizer_array.push(&zone::object_destruct<T>, x);
398 } catch (...) {
399 undo_allocate(sizeof(T));
400 throw;
401 }
402 try {
403 return new (x) T(a1);
404 } catch (...) {
405 --m_finalizer_array.m_tail;
406 undo_allocate(sizeof(T));
407 throw;
408 }
409}
410
411template <typename T, typename A1, typename A2>
412T* zone::allocate(A1 a1, A2 a2)
413{
414 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
415 try {
416 m_finalizer_array.push(&zone::object_destruct<T>, x);
417 } catch (...) {
418 undo_allocate(sizeof(T));
419 throw;
420 }
421 try {
422 return new (x) T(a1, a2);
423 } catch (...) {
424 --m_finalizer_array.m_tail;
425 undo_allocate(sizeof(T));
426 throw;
427 }
428}
429
430template <typename T, typename A1, typename A2, typename A3>
431T* zone::allocate(A1 a1, A2 a2, A3 a3)
432{
433 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
434 try {
435 m_finalizer_array.push(&zone::object_destruct<T>, x);
436 } catch (...) {
437 undo_allocate(sizeof(T));
438 throw;
439 }
440 try {
441 return new (x) T(a1, a2, a3);
442 } catch (...) {
443 --m_finalizer_array.m_tail;
444 undo_allocate(sizeof(T));
445 throw;
446 }
447}
448
449template <typename T, typename A1, typename A2, typename A3, typename A4>
450T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4)
451{
452 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
453 try {
454 m_finalizer_array.push(&zone::object_destruct<T>, x);
455 } catch (...) {
456 undo_allocate(sizeof(T));
457 throw;
458 }
459 try {
460 return new (x) T(a1, a2, a3, a4);
461 } catch (...) {
462 --m_finalizer_array.m_tail;
463 undo_allocate(sizeof(T));
464 throw;
465 }
466}
467
468template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
469T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
470{
471 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
472 try {
473 m_finalizer_array.push(&zone::object_destruct<T>, x);
474 } catch (...) {
475 undo_allocate(sizeof(T));
476 throw;
477 }
478 try {
479 return new (x) T(a1, a2, a3, a4, a5);
480 } catch (...) {
481 --m_finalizer_array.m_tail;
482 undo_allocate(sizeof(T));
483 throw;
484 }
485}
486
487template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
488T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
489{
490 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
491 try {
492 m_finalizer_array.push(&zone::object_destruct<T>, x);
493 } catch (...) {
494 undo_allocate(sizeof(T));
495 throw;
496 }
497 try {
498 return new (x) T(a1, a2, a3, a4, a5, a6);
499 } catch (...) {
500 --m_finalizer_array.m_tail;
501 undo_allocate(sizeof(T));
502 throw;
503 }
504}
505
506template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
507T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
508{
509 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
510 try {
511 m_finalizer_array.push(&zone::object_destruct<T>, x);
512 } catch (...) {
513 undo_allocate(sizeof(T));
514 throw;
515 }
516 try {
517 return new (x) T(a1, a2, a3, a4, a5, a6, a7);
518 } catch (...) {
519 --m_finalizer_array.m_tail;
520 undo_allocate(sizeof(T));
521 throw;
522 }
523}
524
525template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
526T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
527{
528 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
529 try {
530 m_finalizer_array.push(&zone::object_destruct<T>, x);
531 } catch (...) {
532 undo_allocate(sizeof(T));
533 throw;
534 }
535 try {
536 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8);
537 } catch (...) {
538 --m_finalizer_array.m_tail;
539 undo_allocate(sizeof(T));
540 throw;
541 }
542}
543
544template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
545T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
546{
547 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
548 try {
549 m_finalizer_array.push(&zone::object_destruct<T>, x);
550 } catch (...) {
551 undo_allocate(sizeof(T));
552 throw;
553 }
554 try {
555 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
556 } catch (...) {
557 --m_finalizer_array.m_tail;
558 undo_allocate(sizeof(T));
559 throw;
560 }
561}
562
563template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
564T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
565{
566 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
567 try {
568 m_finalizer_array.push(&zone::object_destruct<T>, x);
569 } catch (...) {
570 undo_allocate(sizeof(T));
571 throw;
572 }
573 try {
574 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
575 } catch (...) {
576 --m_finalizer_array.m_tail;
577 undo_allocate(sizeof(T));
578 throw;
579 }
580}
581
582template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
583T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11)
584{
585 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
586 try {
587 m_finalizer_array.push(&zone::object_destruct<T>, x);
588 } catch (...) {
589 undo_allocate(sizeof(T));
590 throw;
591 }
592 try {
593 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
594 } catch (...) {
595 --m_finalizer_array.m_tail;
596 undo_allocate(sizeof(T));
597 throw;
598 }
599}
600
601template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
602T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12)
603{
604 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
605 try {
606 m_finalizer_array.push(&zone::object_destruct<T>, x);
607 } catch (...) {
608 undo_allocate(sizeof(T));
609 throw;
610 }
611 try {
612 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
613 } catch (...) {
614 --m_finalizer_array.m_tail;
615 undo_allocate(sizeof(T));
616 throw;
617 }
618}
619
620template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
621T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13)
622{
623 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
624 try {
625 m_finalizer_array.push(&zone::object_destruct<T>, x);
626 } catch (...) {
627 undo_allocate(sizeof(T));
628 throw;
629 }
630 try {
631 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
632 } catch (...) {
633 --m_finalizer_array.m_tail;
634 undo_allocate(sizeof(T));
635 throw;
636 }
637}
638
639template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
640T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14)
641{
642 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
643 try {
644 m_finalizer_array.push(&zone::object_destruct<T>, x);
645 } catch (...) {
646 undo_allocate(sizeof(T));
647 throw;
648 }
649 try {
650 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
651 } catch (...) {
652 --m_finalizer_array.m_tail;
653 undo_allocate(sizeof(T));
654 throw;
655 }
656}
657
658template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14, typename A15>
659T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15)
660{
661 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
662 try {
663 m_finalizer_array.push(&zone::object_destruct<T>, x);
664 } catch (...) {
665 undo_allocate(sizeof(T));
666 throw;
667 }
668 try {
669 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
670 } catch (...) {
671 --m_finalizer_array.m_tail;
672 undo_allocate(sizeof(T));
673 throw;
674 }
675}
676
678
680} // MSGPACK_API_VERSION_NAMESPACE(v1)
682
683} // namespace msgpack
684
685#endif // MSGPACK_V1_CPP03_ZONE_HPP
#define MSGPACK_ASSERT
Definition assert.hpp:22
Definition cpp03_zone.hpp:30
void swap(zone &o)
Definition cpp03_zone.hpp:331
T * allocate(Args... args)
Definition cpp11_zone.hpp:356
void * allocate_no_align(size_t size)
Definition cpp03_zone.hpp:270
void clear()
Definition cpp03_zone.hpp:325
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition cpp03_zone.hpp:255
void push_finalizer(void(*func)(void *), void *data)
Definition cpp03_zone.hpp:314
zone(size_t chunk_size=MSGPACK_ZONE_CHUNK_SIZE)
Definition cpp03_zone.hpp:242
std::size_t size(T const &t)
Definition size_equal_only.hpp:24
Definition adaptor_base.hpp:15
std::size_t aligned_size(std::size_t size, std::size_t align)
Definition cpp03_zone.hpp:365
#define MSGPACK_NULLPTR
Definition cpp_config_decl.hpp:85
#define MSGPACK_ZONE_ALIGNOF(type)
Definition cpp03_zone_decl.hpp:30
#define MSGPACK_ZONE_ALIGN
Definition cpp03_zone_decl.hpp:24
#define MSGPACK_ZONE_CHUNK_SIZE
Definition cpp03_zone_decl.hpp:20
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition versioning.hpp:66