Dependents:   hello_message_pack

msgpack-c & msgpack-c++ https://github.com/msgpack/msgpack-c implementation for embedded systems (mbed / Arduino)

Committer:
hideakitai
Date:
Mon Feb 22 01:43:48 2016 +0000
Revision:
4:bd0c06dd6e92
Parent:
3:a56553e46a9a
fix throw error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hideakitai 0:3f9dbf1e2cb0 1 //
hideakitai 0:3f9dbf1e2cb0 2 // MessagePack for C++ memory pool
hideakitai 0:3f9dbf1e2cb0 3 //
hideakitai 0:3f9dbf1e2cb0 4 // Copyright (C) 2008-2013 FURUHASHI Sadayuki and KONDO Takatoshi
hideakitai 0:3f9dbf1e2cb0 5 //
hideakitai 0:3f9dbf1e2cb0 6 // Distributed under the Boost Software License, Version 1.0.
hideakitai 0:3f9dbf1e2cb0 7 // (See accompanying file LICENSE_1_0.txt or copy at
hideakitai 0:3f9dbf1e2cb0 8 // http://www.boost.org/LICENSE_1_0.txt)
hideakitai 0:3f9dbf1e2cb0 9 //
hideakitai 0:3f9dbf1e2cb0 10 #ifndef MSGPACK_CPP11_ZONE_HPP
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_CPP11_ZONE_HPP
hideakitai 0:3f9dbf1e2cb0 12
hideakitai 0:3f9dbf1e2cb0 13 #include "msgpack/versioning.hpp"
hideakitai 0:3f9dbf1e2cb0 14
hideakitai 0:3f9dbf1e2cb0 15 #include <cstdlib>
hideakitai 0:3f9dbf1e2cb0 16 #include <memory>
hideakitai 0:3f9dbf1e2cb0 17 #include <vector>
hideakitai 0:3f9dbf1e2cb0 18
hideakitai 0:3f9dbf1e2cb0 19 #include "msgpack/cpp_config.hpp"
hideakitai 0:3f9dbf1e2cb0 20
hideakitai 0:3f9dbf1e2cb0 21 #ifndef MSGPACK_ZONE_CHUNK_SIZE
hideakitai 0:3f9dbf1e2cb0 22 #if defined(__MBED__)
hideakitai 3:a56553e46a9a 23 #define MSGPACK_ZONE_CHUNK_SIZE 512
hideakitai 0:3f9dbf1e2cb0 24 #elif defined(__AVR__)
hideakitai 0:3f9dbf1e2cb0 25 #define MSGPACK_ZONE_CHUNK_SIZE 128
hideakitai 0:3f9dbf1e2cb0 26 #else
hideakitai 0:3f9dbf1e2cb0 27 #define MSGPACK_ZONE_CHUNK_SIZE 8192
hideakitai 0:3f9dbf1e2cb0 28 #endif
hideakitai 0:3f9dbf1e2cb0 29 #endif
hideakitai 0:3f9dbf1e2cb0 30
hideakitai 0:3f9dbf1e2cb0 31 #ifndef MSGPACK_ZONE_ALIGN
hideakitai 0:3f9dbf1e2cb0 32 #define MSGPACK_ZONE_ALIGN sizeof(void*)
hideakitai 0:3f9dbf1e2cb0 33 #endif
hideakitai 0:3f9dbf1e2cb0 34
hideakitai 0:3f9dbf1e2cb0 35 namespace msgpack {
hideakitai 0:3f9dbf1e2cb0 36
hideakitai 0:3f9dbf1e2cb0 37 /// @cond
hideakitai 0:3f9dbf1e2cb0 38 MSGPACK_API_VERSION_NAMESPACE(v1) {
hideakitai 0:3f9dbf1e2cb0 39 /// @endcond
hideakitai 0:3f9dbf1e2cb0 40
hideakitai 0:3f9dbf1e2cb0 41 class zone {
hideakitai 0:3f9dbf1e2cb0 42 private:
hideakitai 0:3f9dbf1e2cb0 43 struct finalizer {
hideakitai 0:3f9dbf1e2cb0 44 finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {}
hideakitai 0:3f9dbf1e2cb0 45 void operator()() { m_func(m_data); }
hideakitai 0:3f9dbf1e2cb0 46 void (*m_func)(void*);
hideakitai 0:3f9dbf1e2cb0 47 void* m_data;
hideakitai 0:3f9dbf1e2cb0 48 };
hideakitai 0:3f9dbf1e2cb0 49 struct finalizer_array {
hideakitai 0:3f9dbf1e2cb0 50 finalizer_array():m_tail(nullptr), m_end(nullptr), m_array(nullptr) {}
hideakitai 0:3f9dbf1e2cb0 51 void call() {
hideakitai 0:3f9dbf1e2cb0 52 finalizer* fin = m_tail;
hideakitai 0:3f9dbf1e2cb0 53 for(; fin != m_array; --fin) (*(fin-1))();
hideakitai 0:3f9dbf1e2cb0 54 }
hideakitai 0:3f9dbf1e2cb0 55 ~finalizer_array() {
hideakitai 0:3f9dbf1e2cb0 56 call();
hideakitai 0:3f9dbf1e2cb0 57 ::free(m_array);
hideakitai 0:3f9dbf1e2cb0 58 }
hideakitai 0:3f9dbf1e2cb0 59 void clear() {
hideakitai 0:3f9dbf1e2cb0 60 call();
hideakitai 0:3f9dbf1e2cb0 61 m_tail = m_array;
hideakitai 0:3f9dbf1e2cb0 62 }
hideakitai 0:3f9dbf1e2cb0 63 void push(void (*func)(void* data), void* data)
hideakitai 0:3f9dbf1e2cb0 64 {
hideakitai 0:3f9dbf1e2cb0 65 finalizer* fin = m_tail;
hideakitai 0:3f9dbf1e2cb0 66
hideakitai 0:3f9dbf1e2cb0 67 if(fin == m_end) {
hideakitai 0:3f9dbf1e2cb0 68 push_expand(func, data);
hideakitai 0:3f9dbf1e2cb0 69 return;
hideakitai 0:3f9dbf1e2cb0 70 }
hideakitai 0:3f9dbf1e2cb0 71
hideakitai 0:3f9dbf1e2cb0 72 fin->m_func = func;
hideakitai 0:3f9dbf1e2cb0 73 fin->m_data = data;
hideakitai 0:3f9dbf1e2cb0 74
hideakitai 0:3f9dbf1e2cb0 75 ++m_tail;
hideakitai 0:3f9dbf1e2cb0 76 }
hideakitai 0:3f9dbf1e2cb0 77 void push_expand(void (*func)(void*), void* data) {
hideakitai 0:3f9dbf1e2cb0 78 const size_t nused = m_end - m_array;
hideakitai 0:3f9dbf1e2cb0 79 size_t nnext;
hideakitai 0:3f9dbf1e2cb0 80 if(nused == 0) {
hideakitai 0:3f9dbf1e2cb0 81 nnext = (sizeof(finalizer) < 72/2) ?
hideakitai 0:3f9dbf1e2cb0 82 72 / sizeof(finalizer) : 8;
hideakitai 0:3f9dbf1e2cb0 83 } else {
hideakitai 0:3f9dbf1e2cb0 84 nnext = nused * 2;
hideakitai 0:3f9dbf1e2cb0 85 }
hideakitai 0:3f9dbf1e2cb0 86 finalizer* tmp =
hideakitai 0:3f9dbf1e2cb0 87 static_cast<finalizer*>(::realloc(m_array, sizeof(finalizer) * nnext));
hideakitai 0:3f9dbf1e2cb0 88 if(!tmp) {
hideakitai 0:3f9dbf1e2cb0 89 throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 90 }
hideakitai 0:3f9dbf1e2cb0 91 m_array = tmp;
hideakitai 0:3f9dbf1e2cb0 92 m_end = tmp + nnext;
hideakitai 0:3f9dbf1e2cb0 93 m_tail = tmp + nused;
hideakitai 0:3f9dbf1e2cb0 94 new (m_tail) finalizer(func, data);
hideakitai 0:3f9dbf1e2cb0 95
hideakitai 0:3f9dbf1e2cb0 96 ++m_tail;
hideakitai 0:3f9dbf1e2cb0 97 }
hideakitai 0:3f9dbf1e2cb0 98 finalizer_array(finalizer_array&& other) noexcept
hideakitai 0:3f9dbf1e2cb0 99 :m_tail(other.m_tail), m_end(other.m_end), m_array(other.m_array)
hideakitai 0:3f9dbf1e2cb0 100 {
hideakitai 0:3f9dbf1e2cb0 101 other.m_tail = nullptr;
hideakitai 0:3f9dbf1e2cb0 102 other.m_end = nullptr;
hideakitai 0:3f9dbf1e2cb0 103 other.m_array = nullptr;
hideakitai 0:3f9dbf1e2cb0 104 }
hideakitai 0:3f9dbf1e2cb0 105 finalizer_array& operator=(finalizer_array&& other) noexcept
hideakitai 0:3f9dbf1e2cb0 106 {
hideakitai 0:3f9dbf1e2cb0 107 this->~finalizer_array();
hideakitai 0:3f9dbf1e2cb0 108 new (this) finalizer_array(std::move(other));
hideakitai 0:3f9dbf1e2cb0 109 return *this;
hideakitai 0:3f9dbf1e2cb0 110 }
hideakitai 0:3f9dbf1e2cb0 111
hideakitai 0:3f9dbf1e2cb0 112 finalizer* m_tail;
hideakitai 0:3f9dbf1e2cb0 113 finalizer* m_end;
hideakitai 0:3f9dbf1e2cb0 114 finalizer* m_array;
hideakitai 0:3f9dbf1e2cb0 115
hideakitai 0:3f9dbf1e2cb0 116 private:
hideakitai 0:3f9dbf1e2cb0 117 finalizer_array(const finalizer_array&);
hideakitai 0:3f9dbf1e2cb0 118 finalizer_array& operator=(const finalizer_array&);
hideakitai 0:3f9dbf1e2cb0 119 };
hideakitai 0:3f9dbf1e2cb0 120 struct chunk {
hideakitai 0:3f9dbf1e2cb0 121 chunk* m_next;
hideakitai 0:3f9dbf1e2cb0 122 };
hideakitai 0:3f9dbf1e2cb0 123 struct chunk_list {
hideakitai 0:3f9dbf1e2cb0 124 chunk_list(size_t chunk_size)
hideakitai 0:3f9dbf1e2cb0 125 {
hideakitai 0:3f9dbf1e2cb0 126 chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + chunk_size));
hideakitai 0:3f9dbf1e2cb0 127 if(!c) {
hideakitai 0:3f9dbf1e2cb0 128 throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 129 }
hideakitai 0:3f9dbf1e2cb0 130
hideakitai 0:3f9dbf1e2cb0 131 m_head = c;
hideakitai 0:3f9dbf1e2cb0 132 m_free = chunk_size;
hideakitai 0:3f9dbf1e2cb0 133 m_ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
hideakitai 0:3f9dbf1e2cb0 134 c->m_next = nullptr;
hideakitai 0:3f9dbf1e2cb0 135 }
hideakitai 0:3f9dbf1e2cb0 136 ~chunk_list()
hideakitai 0:3f9dbf1e2cb0 137 {
hideakitai 0:3f9dbf1e2cb0 138 chunk* c = m_head;
hideakitai 0:3f9dbf1e2cb0 139 while(c) {
hideakitai 0:3f9dbf1e2cb0 140 chunk* n = c->m_next;
hideakitai 0:3f9dbf1e2cb0 141 ::free(c);
hideakitai 0:3f9dbf1e2cb0 142 c = n;
hideakitai 0:3f9dbf1e2cb0 143 }
hideakitai 0:3f9dbf1e2cb0 144 }
hideakitai 0:3f9dbf1e2cb0 145 void clear(size_t chunk_size)
hideakitai 0:3f9dbf1e2cb0 146 {
hideakitai 0:3f9dbf1e2cb0 147 chunk* c = m_head;
hideakitai 0:3f9dbf1e2cb0 148 while(true) {
hideakitai 0:3f9dbf1e2cb0 149 chunk* n = c->m_next;
hideakitai 0:3f9dbf1e2cb0 150 if(n) {
hideakitai 0:3f9dbf1e2cb0 151 ::free(c);
hideakitai 0:3f9dbf1e2cb0 152 c = n;
hideakitai 0:3f9dbf1e2cb0 153 } else {
hideakitai 0:3f9dbf1e2cb0 154 m_head = c;
hideakitai 0:3f9dbf1e2cb0 155 break;
hideakitai 0:3f9dbf1e2cb0 156 }
hideakitai 0:3f9dbf1e2cb0 157 }
hideakitai 0:3f9dbf1e2cb0 158 m_head->m_next = nullptr;
hideakitai 0:3f9dbf1e2cb0 159 m_free = chunk_size;
hideakitai 0:3f9dbf1e2cb0 160 m_ptr = reinterpret_cast<char*>(m_head) + sizeof(chunk);
hideakitai 0:3f9dbf1e2cb0 161 }
hideakitai 0:3f9dbf1e2cb0 162 chunk_list(chunk_list&& other) noexcept
hideakitai 0:3f9dbf1e2cb0 163 :m_free(other.m_free), m_ptr(other.m_ptr), m_head(other.m_head)
hideakitai 0:3f9dbf1e2cb0 164 {
hideakitai 0:3f9dbf1e2cb0 165 other.m_head = nullptr;
hideakitai 0:3f9dbf1e2cb0 166 }
hideakitai 0:3f9dbf1e2cb0 167 chunk_list& operator=(chunk_list&& other) noexcept
hideakitai 0:3f9dbf1e2cb0 168 {
hideakitai 0:3f9dbf1e2cb0 169 this->~chunk_list();
hideakitai 0:3f9dbf1e2cb0 170 new (this) chunk_list(std::move(other));
hideakitai 0:3f9dbf1e2cb0 171 return *this;
hideakitai 0:3f9dbf1e2cb0 172 }
hideakitai 0:3f9dbf1e2cb0 173
hideakitai 0:3f9dbf1e2cb0 174 size_t m_free;
hideakitai 0:3f9dbf1e2cb0 175 char* m_ptr;
hideakitai 0:3f9dbf1e2cb0 176 chunk* m_head;
hideakitai 0:3f9dbf1e2cb0 177 private:
hideakitai 0:3f9dbf1e2cb0 178 chunk_list(const chunk_list&);
hideakitai 0:3f9dbf1e2cb0 179 chunk_list& operator=(const chunk_list&);
hideakitai 0:3f9dbf1e2cb0 180 };
hideakitai 0:3f9dbf1e2cb0 181 size_t m_chunk_size;
hideakitai 0:3f9dbf1e2cb0 182 chunk_list m_chunk_list;
hideakitai 0:3f9dbf1e2cb0 183 finalizer_array m_finalizer_array;
hideakitai 0:3f9dbf1e2cb0 184
hideakitai 0:3f9dbf1e2cb0 185 public:
hideakitai 0:3f9dbf1e2cb0 186 zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE) noexcept;
hideakitai 0:3f9dbf1e2cb0 187
hideakitai 0:3f9dbf1e2cb0 188 public:
hideakitai 0:3f9dbf1e2cb0 189 void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN);
hideakitai 0:3f9dbf1e2cb0 190 void* allocate_no_align(size_t size);
hideakitai 0:3f9dbf1e2cb0 191
hideakitai 0:3f9dbf1e2cb0 192 void push_finalizer(void (*func)(void*), void* data);
hideakitai 0:3f9dbf1e2cb0 193
hideakitai 0:3f9dbf1e2cb0 194 template <typename T>
hideakitai 0:3f9dbf1e2cb0 195 void push_finalizer(msgpack::unique_ptr<T> obj);
hideakitai 0:3f9dbf1e2cb0 196
hideakitai 0:3f9dbf1e2cb0 197 void clear();
hideakitai 0:3f9dbf1e2cb0 198
hideakitai 0:3f9dbf1e2cb0 199 void swap(zone& o);
hideakitai 0:3f9dbf1e2cb0 200
hideakitai 0:3f9dbf1e2cb0 201
hideakitai 0:3f9dbf1e2cb0 202 static void* operator new(std::size_t size)
hideakitai 0:3f9dbf1e2cb0 203 {
hideakitai 0:3f9dbf1e2cb0 204 void* p = ::malloc(size);
hideakitai 0:3f9dbf1e2cb0 205 if (!p) throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 206 return p;
hideakitai 0:3f9dbf1e2cb0 207 }
hideakitai 0:3f9dbf1e2cb0 208 static void operator delete(void *p) noexcept
hideakitai 0:3f9dbf1e2cb0 209 {
hideakitai 0:3f9dbf1e2cb0 210 ::free(p);
hideakitai 0:3f9dbf1e2cb0 211 }
hideakitai 0:3f9dbf1e2cb0 212 static void* operator new(std::size_t /*size*/, void* mem) noexcept
hideakitai 0:3f9dbf1e2cb0 213 {
hideakitai 0:3f9dbf1e2cb0 214 return mem;
hideakitai 0:3f9dbf1e2cb0 215 }
hideakitai 0:3f9dbf1e2cb0 216 static void operator delete(void * /*p*/, void* /*mem*/) noexcept
hideakitai 0:3f9dbf1e2cb0 217 {
hideakitai 0:3f9dbf1e2cb0 218 }
hideakitai 0:3f9dbf1e2cb0 219
hideakitai 0:3f9dbf1e2cb0 220 template <typename T, typename... Args>
hideakitai 0:3f9dbf1e2cb0 221 T* allocate(Args... args);
hideakitai 0:3f9dbf1e2cb0 222
hideakitai 0:3f9dbf1e2cb0 223 zone(zone&&) = default;
hideakitai 0:3f9dbf1e2cb0 224 zone& operator=(zone&&) = default;
hideakitai 0:3f9dbf1e2cb0 225 zone(const zone&) = delete;
hideakitai 0:3f9dbf1e2cb0 226 zone& operator=(const zone&) = delete;
hideakitai 0:3f9dbf1e2cb0 227
hideakitai 0:3f9dbf1e2cb0 228 private:
hideakitai 0:3f9dbf1e2cb0 229 void undo_allocate(size_t size);
hideakitai 0:3f9dbf1e2cb0 230
hideakitai 0:3f9dbf1e2cb0 231 template <typename T>
hideakitai 0:3f9dbf1e2cb0 232 static void object_destruct(void* obj);
hideakitai 0:3f9dbf1e2cb0 233
hideakitai 0:3f9dbf1e2cb0 234 template <typename T>
hideakitai 0:3f9dbf1e2cb0 235 static void object_delete(void* obj);
hideakitai 0:3f9dbf1e2cb0 236
hideakitai 0:3f9dbf1e2cb0 237 void* allocate_expand(size_t size);
hideakitai 0:3f9dbf1e2cb0 238 };
hideakitai 0:3f9dbf1e2cb0 239
hideakitai 0:3f9dbf1e2cb0 240 inline zone::zone(size_t chunk_size) noexcept:m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
hideakitai 0:3f9dbf1e2cb0 241 {
hideakitai 0:3f9dbf1e2cb0 242 }
hideakitai 0:3f9dbf1e2cb0 243
hideakitai 0:3f9dbf1e2cb0 244 inline void* zone::allocate_align(size_t size, size_t align)
hideakitai 0:3f9dbf1e2cb0 245 {
hideakitai 0:3f9dbf1e2cb0 246 char* aligned =
hideakitai 0:3f9dbf1e2cb0 247 reinterpret_cast<char*>(
hideakitai 0:3f9dbf1e2cb0 248 reinterpret_cast<size_t>(
hideakitai 0:3f9dbf1e2cb0 249 (m_chunk_list.m_ptr + (align - 1))) / align * align);
hideakitai 0:3f9dbf1e2cb0 250 size_t adjusted_size = size + (aligned - m_chunk_list.m_ptr);
hideakitai 0:3f9dbf1e2cb0 251 if(m_chunk_list.m_free >= adjusted_size) {
hideakitai 0:3f9dbf1e2cb0 252 m_chunk_list.m_free -= adjusted_size;
hideakitai 0:3f9dbf1e2cb0 253 m_chunk_list.m_ptr += adjusted_size;
hideakitai 0:3f9dbf1e2cb0 254 return aligned;
hideakitai 0:3f9dbf1e2cb0 255 }
hideakitai 0:3f9dbf1e2cb0 256 return reinterpret_cast<char*>(
hideakitai 0:3f9dbf1e2cb0 257 reinterpret_cast<size_t>(
hideakitai 0:3f9dbf1e2cb0 258 allocate_expand(size + (align - 1))) / align * align);
hideakitai 0:3f9dbf1e2cb0 259 }
hideakitai 0:3f9dbf1e2cb0 260
hideakitai 0:3f9dbf1e2cb0 261 inline void* zone::allocate_no_align(size_t size)
hideakitai 0:3f9dbf1e2cb0 262 {
hideakitai 0:3f9dbf1e2cb0 263 if(m_chunk_list.m_free < size) {
hideakitai 0:3f9dbf1e2cb0 264 return allocate_expand(size);
hideakitai 0:3f9dbf1e2cb0 265 }
hideakitai 0:3f9dbf1e2cb0 266
hideakitai 0:3f9dbf1e2cb0 267 char* ptr = m_chunk_list.m_ptr;
hideakitai 0:3f9dbf1e2cb0 268 m_chunk_list.m_free -= size;
hideakitai 0:3f9dbf1e2cb0 269 m_chunk_list.m_ptr += size;
hideakitai 0:3f9dbf1e2cb0 270
hideakitai 0:3f9dbf1e2cb0 271 return ptr;
hideakitai 0:3f9dbf1e2cb0 272 }
hideakitai 0:3f9dbf1e2cb0 273
hideakitai 0:3f9dbf1e2cb0 274 inline void* zone::allocate_expand(size_t size)
hideakitai 0:3f9dbf1e2cb0 275 {
hideakitai 0:3f9dbf1e2cb0 276 chunk_list* const cl = &m_chunk_list;
hideakitai 0:3f9dbf1e2cb0 277
hideakitai 0:3f9dbf1e2cb0 278 size_t sz = m_chunk_size;
hideakitai 0:3f9dbf1e2cb0 279
hideakitai 0:3f9dbf1e2cb0 280 while(sz < size) {
hideakitai 0:3f9dbf1e2cb0 281 size_t tmp_sz = sz * 2;
hideakitai 0:3f9dbf1e2cb0 282 if (tmp_sz <= sz) {
hideakitai 0:3f9dbf1e2cb0 283 sz = size;
hideakitai 0:3f9dbf1e2cb0 284 break;
hideakitai 0:3f9dbf1e2cb0 285 }
hideakitai 0:3f9dbf1e2cb0 286 sz = tmp_sz;
hideakitai 0:3f9dbf1e2cb0 287 }
hideakitai 0:3f9dbf1e2cb0 288
hideakitai 0:3f9dbf1e2cb0 289 chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
hideakitai 0:3f9dbf1e2cb0 290 if (!c) throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 291
hideakitai 0:3f9dbf1e2cb0 292 char* ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
hideakitai 0:3f9dbf1e2cb0 293
hideakitai 0:3f9dbf1e2cb0 294 c->m_next = cl->m_head;
hideakitai 0:3f9dbf1e2cb0 295 cl->m_head = c;
hideakitai 0:3f9dbf1e2cb0 296 cl->m_free = sz - size;
hideakitai 0:3f9dbf1e2cb0 297 cl->m_ptr = ptr + size;
hideakitai 0:3f9dbf1e2cb0 298
hideakitai 0:3f9dbf1e2cb0 299 return ptr;
hideakitai 0:3f9dbf1e2cb0 300 }
hideakitai 0:3f9dbf1e2cb0 301
hideakitai 0:3f9dbf1e2cb0 302 inline void zone::push_finalizer(void (*func)(void*), void* data)
hideakitai 0:3f9dbf1e2cb0 303 {
hideakitai 0:3f9dbf1e2cb0 304 m_finalizer_array.push(func, data);
hideakitai 0:3f9dbf1e2cb0 305 }
hideakitai 0:3f9dbf1e2cb0 306
hideakitai 0:3f9dbf1e2cb0 307 template <typename T>
hideakitai 0:3f9dbf1e2cb0 308 inline void zone::push_finalizer(msgpack::unique_ptr<T> obj)
hideakitai 0:3f9dbf1e2cb0 309 {
hideakitai 0:3f9dbf1e2cb0 310 m_finalizer_array.push(&zone::object_delete<T>, obj.release());
hideakitai 0:3f9dbf1e2cb0 311 }
hideakitai 0:3f9dbf1e2cb0 312
hideakitai 0:3f9dbf1e2cb0 313 inline void zone::clear()
hideakitai 0:3f9dbf1e2cb0 314 {
hideakitai 0:3f9dbf1e2cb0 315 m_finalizer_array.clear();
hideakitai 0:3f9dbf1e2cb0 316 m_chunk_list.clear(m_chunk_size);
hideakitai 0:3f9dbf1e2cb0 317 }
hideakitai 0:3f9dbf1e2cb0 318
hideakitai 0:3f9dbf1e2cb0 319 inline void zone::swap(zone& o)
hideakitai 0:3f9dbf1e2cb0 320 {
hideakitai 0:3f9dbf1e2cb0 321 std::swap(*this, o);
hideakitai 0:3f9dbf1e2cb0 322 }
hideakitai 0:3f9dbf1e2cb0 323
hideakitai 0:3f9dbf1e2cb0 324 template <typename T>
hideakitai 0:3f9dbf1e2cb0 325 void zone::object_delete(void* obj)
hideakitai 0:3f9dbf1e2cb0 326 {
hideakitai 0:3f9dbf1e2cb0 327 delete static_cast<T*>(obj);
hideakitai 0:3f9dbf1e2cb0 328 }
hideakitai 0:3f9dbf1e2cb0 329
hideakitai 0:3f9dbf1e2cb0 330 template <typename T>
hideakitai 0:3f9dbf1e2cb0 331 void zone::object_destruct(void* obj)
hideakitai 0:3f9dbf1e2cb0 332 {
hideakitai 0:3f9dbf1e2cb0 333 static_cast<T*>(obj)->~T();
hideakitai 0:3f9dbf1e2cb0 334 }
hideakitai 0:3f9dbf1e2cb0 335
hideakitai 0:3f9dbf1e2cb0 336 inline void zone::undo_allocate(size_t size)
hideakitai 0:3f9dbf1e2cb0 337 {
hideakitai 0:3f9dbf1e2cb0 338 m_chunk_list.m_ptr -= size;
hideakitai 0:3f9dbf1e2cb0 339 m_chunk_list.m_free += size;
hideakitai 0:3f9dbf1e2cb0 340 }
hideakitai 0:3f9dbf1e2cb0 341
hideakitai 0:3f9dbf1e2cb0 342
hideakitai 0:3f9dbf1e2cb0 343 template <typename T, typename... Args>
hideakitai 0:3f9dbf1e2cb0 344 T* zone::allocate(Args... args)
hideakitai 0:3f9dbf1e2cb0 345 {
hideakitai 0:3f9dbf1e2cb0 346 void* x = allocate_align(sizeof(T));
hideakitai 0:3f9dbf1e2cb0 347 try {
hideakitai 0:3f9dbf1e2cb0 348 m_finalizer_array.push(&zone::object_destruct<T>, x);
hideakitai 0:3f9dbf1e2cb0 349 } catch (...) {
hideakitai 0:3f9dbf1e2cb0 350 undo_allocate(sizeof(T));
hideakitai 0:3f9dbf1e2cb0 351 throw;
hideakitai 0:3f9dbf1e2cb0 352 }
hideakitai 0:3f9dbf1e2cb0 353 try {
hideakitai 0:3f9dbf1e2cb0 354 return new (x) T(args...);
hideakitai 0:3f9dbf1e2cb0 355 } catch (...) {
hideakitai 0:3f9dbf1e2cb0 356 --m_finalizer_array.m_tail;
hideakitai 0:3f9dbf1e2cb0 357 undo_allocate(sizeof(T));
hideakitai 0:3f9dbf1e2cb0 358 throw;
hideakitai 0:3f9dbf1e2cb0 359 }
hideakitai 0:3f9dbf1e2cb0 360 }
hideakitai 0:3f9dbf1e2cb0 361
hideakitai 0:3f9dbf1e2cb0 362 inline std::size_t aligned_size(
hideakitai 0:3f9dbf1e2cb0 363 std::size_t size,
hideakitai 0:3f9dbf1e2cb0 364 std::size_t align = MSGPACK_ZONE_ALIGN) {
hideakitai 0:3f9dbf1e2cb0 365 return (size + align - 1) / align * align;
hideakitai 0:3f9dbf1e2cb0 366 }
hideakitai 0:3f9dbf1e2cb0 367
hideakitai 0:3f9dbf1e2cb0 368 /// @cond
hideakitai 0:3f9dbf1e2cb0 369 } // MSGPACK_API_VERSION_NAMESPACE(v1)
hideakitai 0:3f9dbf1e2cb0 370 /// @endcond
hideakitai 0:3f9dbf1e2cb0 371
hideakitai 0:3f9dbf1e2cb0 372 } // namespace msgpack
hideakitai 0:3f9dbf1e2cb0 373
hideakitai 0:3f9dbf1e2cb0 374 #endif // MSGPACK_CPP11_ZONE_HPP