mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-25 06:27:42 +02:00
Renamed zone::malloc familiy functions.
This commit is contained in:
parent
d70c44b723
commit
beebccd323
@ -121,7 +121,7 @@ struct define {
|
|||||||
void msgpack_object(msgpack::object* o, msgpack::zone* z) const
|
void msgpack_object(msgpack::object* o, msgpack::zone* z) const
|
||||||
{
|
{
|
||||||
o->type = type::ARRAY;
|
o->type = type::ARRAY;
|
||||||
o->via.array.ptr = static_cast<object*>(z->malloc(sizeof(object)*sizeof...(Args)));
|
o->via.array.ptr = static_cast<object*>(z->allocate_align(sizeof(object)*sizeof...(Args)));
|
||||||
o->via.array.size = sizeof...(Args);
|
o->via.array.size = sizeof...(Args);
|
||||||
|
|
||||||
define_imp<tuple<Args&...>, sizeof...(Args)>::object(o, z, a);
|
define_imp<tuple<Args&...>, sizeof...(Args)>::object(o, z, a);
|
||||||
|
@ -189,7 +189,7 @@ inline void operator<< (
|
|||||||
object::with_zone& o,
|
object::with_zone& o,
|
||||||
type::tuple<Args...>& v) {
|
type::tuple<Args...>& v) {
|
||||||
o.type = type::ARRAY;
|
o.type = type::ARRAY;
|
||||||
o.via.array.ptr = static_cast<object*>(o.zone->malloc(sizeof(object)*sizeof...(Args)));
|
o.via.array.ptr = static_cast<object*>(o.zone->allocate_align(sizeof(object)*sizeof...(Args)));
|
||||||
o.via.array.size = sizeof...(Args);
|
o.via.array.size = sizeof...(Args);
|
||||||
TupleToObjectWithZone<decltype(v), sizeof...(Args)>::convert(o, v);
|
TupleToObjectWithZone<decltype(v), sizeof...(Args)>::convert(o, v);
|
||||||
}
|
}
|
||||||
|
@ -155,8 +155,8 @@ public:
|
|||||||
public:
|
public:
|
||||||
static zone* create(size_t chunk_size);
|
static zone* create(size_t chunk_size);
|
||||||
static void destroy(zone* zone);
|
static void destroy(zone* zone);
|
||||||
void* malloc(size_t size);
|
void* allocate_align(size_t size);
|
||||||
void* malloc_no_align(size_t size);
|
void* allocate_no_align(size_t size);
|
||||||
|
|
||||||
void push_finalizer(void (*func)(void*), void* data);
|
void push_finalizer(void (*func)(void*), void* data);
|
||||||
|
|
||||||
@ -172,12 +172,12 @@ public:
|
|||||||
T* allocate(Args... args);
|
T* allocate(Args... args);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void undo_malloc(size_t size);
|
void undo_allocate(size_t size);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static void object_destructor(void* obj);
|
static void object_destructor(void* obj);
|
||||||
|
|
||||||
void* malloc_expand(size_t size);
|
void* allocate_expand(size_t size);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline zone* zone::create(size_t chunk_size)
|
inline zone* zone::create(size_t chunk_size)
|
||||||
@ -200,16 +200,16 @@ inline zone::zone(size_t chunk_size) noexcept:chunk_size_(chunk_size), chunk_lis
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void* zone::malloc(size_t size)
|
inline void* zone::allocate_align(size_t size)
|
||||||
{
|
{
|
||||||
return malloc_no_align(
|
return allocate_no_align(
|
||||||
((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1));
|
((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void* zone::malloc_no_align(size_t size)
|
inline void* zone::allocate_no_align(size_t size)
|
||||||
{
|
{
|
||||||
if(chunk_list_.free_ < size) {
|
if(chunk_list_.free_ < size) {
|
||||||
return malloc_expand(size);
|
return allocate_expand(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* ptr = chunk_list_.ptr_;
|
char* ptr = chunk_list_.ptr_;
|
||||||
@ -219,7 +219,7 @@ inline void* zone::malloc_no_align(size_t size)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void* zone::malloc_expand(size_t size)
|
inline void* zone::allocate_expand(size_t size)
|
||||||
{
|
{
|
||||||
chunk_list* const cl = &chunk_list_;
|
chunk_list* const cl = &chunk_list_;
|
||||||
|
|
||||||
@ -270,7 +270,7 @@ void zone::object_destructor(void* obj)
|
|||||||
reinterpret_cast<T*>(obj)->~T();
|
reinterpret_cast<T*>(obj)->~T();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void zone::undo_malloc(size_t size)
|
inline void zone::undo_allocate(size_t size)
|
||||||
{
|
{
|
||||||
chunk_list_.ptr_ -= size;
|
chunk_list_.ptr_ -= size;
|
||||||
chunk_list_.free_ += size;
|
chunk_list_.free_ += size;
|
||||||
@ -280,18 +280,18 @@ inline void zone::undo_malloc(size_t size)
|
|||||||
template <typename T, typename... Args>
|
template <typename T, typename... Args>
|
||||||
T* zone::allocate(Args... args)
|
T* zone::allocate(Args... args)
|
||||||
{
|
{
|
||||||
void* x = malloc(sizeof(T));
|
void* x = allocate_align(sizeof(T));
|
||||||
try {
|
try {
|
||||||
finalizer_array_.push(&zone::object_destructor<T>, x);
|
finalizer_array_.push(&zone::object_destructor<T>, x);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
undo_malloc(sizeof(T));
|
undo_allocate(sizeof(T));
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return new (x) T(args...);
|
return new (x) T(args...);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
--finalizer_array_.tail_;
|
--finalizer_array_.tail_;
|
||||||
undo_malloc(sizeof(T));
|
undo_allocate(sizeof(T));
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ struct define<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
|
|||||||
void msgpack_object(msgpack::object* o, msgpack::zone* z) const
|
void msgpack_object(msgpack::object* o, msgpack::zone* z) const
|
||||||
{
|
{
|
||||||
o->type = type::ARRAY;
|
o->type = type::ARRAY;
|
||||||
o->via.array.ptr = static_cast<object*>(z->malloc(sizeof(object)*<%=i+1%>));
|
o->via.array.ptr = static_cast<object*>(z->allocate_align(sizeof(object)*<%=i+1%>));
|
||||||
o->via.array.size = <%=i+1%>;
|
o->via.array.size = <%=i+1%>;
|
||||||
<%0.upto(i) {|j|%>
|
<%0.upto(i) {|j|%>
|
||||||
o->via.array.ptr[<%=j%>] = object(a<%=j%>, z);<%}%>
|
o->via.array.ptr[<%=j%>] = object(a<%=j%>, z);<%}%>
|
||||||
|
@ -57,7 +57,7 @@ inline void operator<< (object::with_zone& o, const std::deque<T>& v)
|
|||||||
o.via.array.ptr = nullptr;
|
o.via.array.ptr = nullptr;
|
||||||
o.via.array.size = 0;
|
o.via.array.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object* p = static_cast<object*>(o.zone->malloc(sizeof(object)*v.size()));
|
object* p = static_cast<object*>(o.zone->allocate_align(sizeof(object)*v.size()));
|
||||||
object* const pend = p + v.size();
|
object* const pend = p + v.size();
|
||||||
o.via.array.ptr = p;
|
o.via.array.ptr = p;
|
||||||
o.via.array.size = v.size();
|
o.via.array.size = v.size();
|
||||||
|
@ -57,7 +57,7 @@ inline void operator<< (object::with_zone& o, const std::list<T>& v)
|
|||||||
o.via.array.ptr = nullptr;
|
o.via.array.ptr = nullptr;
|
||||||
o.via.array.size = 0;
|
o.via.array.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object* p = static_cast<object*>(o.zone->malloc(sizeof(object)*v.size()));
|
object* p = static_cast<object*>(o.zone->allocate_align(sizeof(object)*v.size()));
|
||||||
object* const pend = p + v.size();
|
object* const pend = p + v.size();
|
||||||
o.via.array.ptr = p;
|
o.via.array.ptr = p;
|
||||||
o.via.array.size = v.size();
|
o.via.array.size = v.size();
|
||||||
|
@ -78,7 +78,7 @@ inline void operator<< (object::with_zone& o, const type::assoc_vector<K,V>& v)
|
|||||||
o.via.map.ptr = nullptr;
|
o.via.map.ptr = nullptr;
|
||||||
o.via.map.size = 0;
|
o.via.map.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object_kv* p = static_cast<object_kv*>(o.zone->malloc(sizeof(object_kv)*v.size()));
|
object_kv* p = static_cast<object_kv*>(o.zone->allocate_align(sizeof(object_kv)*v.size()));
|
||||||
object_kv* const pend = p + v.size();
|
object_kv* const pend = p + v.size();
|
||||||
o.via.map.ptr = p;
|
o.via.map.ptr = p;
|
||||||
o.via.map.size = v.size();
|
o.via.map.size = v.size();
|
||||||
@ -134,7 +134,7 @@ inline void operator<< (object::with_zone& o, const std::map<K,V>& v)
|
|||||||
o.via.map.ptr = nullptr;
|
o.via.map.ptr = nullptr;
|
||||||
o.via.map.size = 0;
|
o.via.map.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object_kv* p = static_cast<object_kv*>(o.zone->malloc(sizeof(object_kv)*v.size()));
|
object_kv* p = static_cast<object_kv*>(o.zone->allocate_align(sizeof(object_kv)*v.size()));
|
||||||
object_kv* const pend = p + v.size();
|
object_kv* const pend = p + v.size();
|
||||||
o.via.map.ptr = p;
|
o.via.map.ptr = p;
|
||||||
o.via.map.size = v.size();
|
o.via.map.size = v.size();
|
||||||
@ -184,7 +184,7 @@ inline void operator<< (object::with_zone& o, const std::multimap<K,V>& v)
|
|||||||
o.via.map.ptr = nullptr;
|
o.via.map.ptr = nullptr;
|
||||||
o.via.map.size = 0;
|
o.via.map.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object_kv* p = static_cast<object_kv*>(o.zone->malloc(sizeof(object_kv)*v.size()));
|
object_kv* p = static_cast<object_kv*>(o.zone->allocate_align(sizeof(object_kv)*v.size()));
|
||||||
object_kv* const pend = p + v.size();
|
object_kv* const pend = p + v.size();
|
||||||
o.via.map.ptr = p;
|
o.via.map.ptr = p;
|
||||||
o.via.map.size = v.size();
|
o.via.map.size = v.size();
|
||||||
|
@ -47,7 +47,7 @@ template <typename T1, typename T2>
|
|||||||
inline void operator<< (object::with_zone& o, const std::pair<T1, T2>& v)
|
inline void operator<< (object::with_zone& o, const std::pair<T1, T2>& v)
|
||||||
{
|
{
|
||||||
o.type = type::ARRAY;
|
o.type = type::ARRAY;
|
||||||
object* p = static_cast<object*>(o.zone->malloc(sizeof(object)*2));
|
object* p = static_cast<object*>(o.zone->allocate_align(sizeof(object)*2));
|
||||||
o.via.array.ptr = p;
|
o.via.array.ptr = p;
|
||||||
o.via.array.size = 2;
|
o.via.array.size = 2;
|
||||||
p[0] = object(v.first, o.zone);
|
p[0] = object(v.first, o.zone);
|
||||||
|
@ -56,7 +56,7 @@ inline void operator<< (object::with_zone& o, const std::set<T>& v)
|
|||||||
o.via.array.ptr = nullptr;
|
o.via.array.ptr = nullptr;
|
||||||
o.via.array.size = 0;
|
o.via.array.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object* p = static_cast<object*>(o.zone->malloc(sizeof(object)*v.size()));
|
object* p = static_cast<object*>(o.zone->allocate_align(sizeof(object)*v.size()));
|
||||||
object* const pend = p + v.size();
|
object* const pend = p + v.size();
|
||||||
o.via.array.ptr = p;
|
o.via.array.ptr = p;
|
||||||
o.via.array.size = v.size();
|
o.via.array.size = v.size();
|
||||||
@ -102,7 +102,7 @@ inline void operator<< (object::with_zone& o, const std::multiset<T>& v)
|
|||||||
o.via.array.ptr = nullptr;
|
o.via.array.ptr = nullptr;
|
||||||
o.via.array.size = 0;
|
o.via.array.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object* p = static_cast<object*>(o.zone->malloc(sizeof(object)*v.size()));
|
object* p = static_cast<object*>(o.zone->allocate_align(sizeof(object)*v.size()));
|
||||||
object* const pend = p + v.size();
|
object* const pend = p + v.size();
|
||||||
o.via.array.ptr = p;
|
o.via.array.ptr = p;
|
||||||
o.via.array.size = v.size();
|
o.via.array.size = v.size();
|
||||||
|
@ -42,7 +42,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::string& v)
|
|||||||
inline void operator<< (object::with_zone& o, const std::string& v)
|
inline void operator<< (object::with_zone& o, const std::string& v)
|
||||||
{
|
{
|
||||||
o.type = type::BIN;
|
o.type = type::BIN;
|
||||||
char* ptr = (char*)o.zone->malloc(v.size());
|
char* ptr = (char*)o.zone->allocate_align(v.size());
|
||||||
o.via.bin.ptr = ptr;
|
o.via.bin.ptr = ptr;
|
||||||
o.via.bin.size = (uint32_t)v.size();
|
o.via.bin.size = (uint32_t)v.size();
|
||||||
memcpy(ptr, v.data(), v.size());
|
memcpy(ptr, v.data(), v.size());
|
||||||
|
@ -77,7 +77,7 @@ inline void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_m
|
|||||||
o.via.map.ptr = nullptr;
|
o.via.map.ptr = nullptr;
|
||||||
o.via.map.size = 0;
|
o.via.map.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object_kv* p = static_cast<object_kv*>(o.zone->malloc(sizeof(object_kv)*v.size()));
|
object_kv* p = static_cast<object_kv*>(o.zone->allocate_align(sizeof(object_kv)*v.size()));
|
||||||
object_kv* const pend = p + v.size();
|
object_kv* const pend = p + v.size();
|
||||||
o.via.map.ptr = p;
|
o.via.map.ptr = p;
|
||||||
o.via.map.size = v.size();
|
o.via.map.size = v.size();
|
||||||
@ -127,7 +127,7 @@ inline void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_m
|
|||||||
o.via.map.ptr = nullptr;
|
o.via.map.ptr = nullptr;
|
||||||
o.via.map.size = 0;
|
o.via.map.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object_kv* p = static_cast<object_kv*>(o.zone->malloc(sizeof(object_kv)*v.size()));
|
object_kv* p = static_cast<object_kv*>(o.zone->allocate_align(sizeof(object_kv)*v.size()));
|
||||||
object_kv* const pend = p + v.size();
|
object_kv* const pend = p + v.size();
|
||||||
o.via.map.ptr = p;
|
o.via.map.ptr = p;
|
||||||
o.via.map.size = v.size();
|
o.via.map.size = v.size();
|
||||||
|
@ -74,7 +74,7 @@ inline void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_s
|
|||||||
o.via.array.ptr = nullptr;
|
o.via.array.ptr = nullptr;
|
||||||
o.via.array.size = 0;
|
o.via.array.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object* p = static_cast<object*>(o.zone->malloc(sizeof(object)*v.size()));
|
object* p = static_cast<object*>(o.zone->allocate_align(sizeof(object)*v.size()));
|
||||||
object* const pend = p + v.size();
|
object* const pend = p + v.size();
|
||||||
o.via.array.ptr = p;
|
o.via.array.ptr = p;
|
||||||
o.via.array.size = v.size();
|
o.via.array.size = v.size();
|
||||||
@ -120,7 +120,7 @@ inline void operator<< (object::with_zone& o, const MSGPACK_STD_TR1::unordered_m
|
|||||||
o.via.array.ptr = nullptr;
|
o.via.array.ptr = nullptr;
|
||||||
o.via.array.size = 0;
|
o.via.array.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object* p = static_cast<object*>(o.zone->malloc(sizeof(object)*v.size()));
|
object* p = static_cast<object*>(o.zone->allocate_align(sizeof(object)*v.size()));
|
||||||
object* const pend = p + v.size();
|
object* const pend = p + v.size();
|
||||||
o.via.array.ptr = p;
|
o.via.array.ptr = p;
|
||||||
o.via.array.size = v.size();
|
o.via.array.size = v.size();
|
||||||
|
@ -184,7 +184,7 @@ inline void operator<< (
|
|||||||
object::with_zone& o,
|
object::with_zone& o,
|
||||||
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
|
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
|
||||||
o.type = type::ARRAY;
|
o.type = type::ARRAY;
|
||||||
o.via.array.ptr = static_cast<object*>(o.zone->malloc(sizeof(object)*<%=i+1%>));
|
o.via.array.ptr = static_cast<object*>(o.zone->allocate_align(sizeof(object)*<%=i+1%>));
|
||||||
o.via.array.size = <%=i+1%>;
|
o.via.array.size = <%=i+1%>;
|
||||||
<%0.upto(i) {|j|%>
|
<%0.upto(i) {|j|%>
|
||||||
o.via.array.ptr[<%=j%>] = object(v.template get<<%=j%>>(), o.zone);<%}%>
|
o.via.array.ptr[<%=j%>] = object(v.template get<<%=j%>>(), o.zone);<%}%>
|
||||||
|
@ -61,7 +61,7 @@ inline void operator<< (object::with_zone& o, const std::vector<T>& v)
|
|||||||
o.via.array.ptr = nullptr;
|
o.via.array.ptr = nullptr;
|
||||||
o.via.array.size = 0;
|
o.via.array.size = 0;
|
||||||
} else {
|
} else {
|
||||||
object* p = static_cast<object*>(o.zone->malloc(sizeof(object)*v.size()));
|
object* p = static_cast<object*>(o.zone->allocate_align(sizeof(object)*v.size()));
|
||||||
object* const pend = p + v.size();
|
object* const pend = p + v.size();
|
||||||
o.via.array.ptr = p;
|
o.via.array.ptr = p;
|
||||||
o.via.array.size = v.size();
|
o.via.array.size = v.size();
|
||||||
|
@ -109,7 +109,7 @@ struct unpack_array {
|
|||||||
bool operator()(unpack_user&u, unsigned int n, object& o) const {
|
bool operator()(unpack_user&u, unsigned int n, object& o) const {
|
||||||
o.type = type::ARRAY;
|
o.type = type::ARRAY;
|
||||||
o.via.array.size = 0;
|
o.via.array.size = 0;
|
||||||
o.via.array.ptr = (object*)u.z().malloc(n*sizeof(object));
|
o.via.array.ptr = (object*)u.z().allocate_align(n*sizeof(object));
|
||||||
if(o.via.array.ptr == nullptr) { return false; }
|
if(o.via.array.ptr == nullptr) { return false; }
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -122,7 +122,7 @@ struct unpack_map {
|
|||||||
bool operator()(unpack_user& u, unsigned int n, object& o) const {
|
bool operator()(unpack_user& u, unsigned int n, object& o) const {
|
||||||
o.type = type::MAP;
|
o.type = type::MAP;
|
||||||
o.via.map.size = 0;
|
o.via.map.size = 0;
|
||||||
o.via.map.ptr = (object_kv*)u.z().malloc(n*sizeof(object_kv));
|
o.via.map.ptr = (object_kv*)u.z().allocate_align(n*sizeof(object_kv));
|
||||||
if(o.via.map.ptr == nullptr) { return false; }
|
if(o.via.map.ptr == nullptr) { return false; }
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -154,8 +154,8 @@ public:
|
|||||||
public:
|
public:
|
||||||
static zone* create(size_t chunk_size);
|
static zone* create(size_t chunk_size);
|
||||||
static void destroy(zone* zone);
|
static void destroy(zone* zone);
|
||||||
void* malloc(size_t size);
|
void* allocate_align(size_t size);
|
||||||
void* malloc_no_align(size_t size);
|
void* allocate_no_align(size_t size);
|
||||||
|
|
||||||
void push_finalizer(void (*func)(void*), void* data);
|
void push_finalizer(void (*func)(void*), void* data);
|
||||||
|
|
||||||
@ -172,12 +172,12 @@ public:
|
|||||||
<%}%>
|
<%}%>
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void undo_malloc(size_t size);
|
void undo_allocate(size_t size);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static void object_destructor(void* obj);
|
static void object_destructor(void* obj);
|
||||||
|
|
||||||
void* malloc_expand(size_t size);
|
void* allocate_expand(size_t size);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -201,16 +201,16 @@ inline zone::zone(size_t chunk_size) /* throw() */ :chunk_size_(chunk_size), chu
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void* zone::malloc(size_t size)
|
inline void* zone::allocate_align(size_t size)
|
||||||
{
|
{
|
||||||
return malloc_no_align(
|
return allocate_no_align(
|
||||||
((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1));
|
((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void* zone::malloc_no_align(size_t size)
|
inline void* zone::allocate_no_align(size_t size)
|
||||||
{
|
{
|
||||||
if(chunk_list_.free_ < size) {
|
if(chunk_list_.free_ < size) {
|
||||||
return malloc_expand(size);
|
return allocate_expand(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* ptr = chunk_list_.ptr_;
|
char* ptr = chunk_list_.ptr_;
|
||||||
@ -220,7 +220,7 @@ inline void* zone::malloc_no_align(size_t size)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void* zone::malloc_expand(size_t size)
|
inline void* zone::allocate_expand(size_t size)
|
||||||
{
|
{
|
||||||
chunk_list* const cl = &chunk_list_;
|
chunk_list* const cl = &chunk_list_;
|
||||||
|
|
||||||
@ -271,7 +271,7 @@ void zone::object_destructor(void* obj)
|
|||||||
reinterpret_cast<T*>(obj)->~T();
|
reinterpret_cast<T*>(obj)->~T();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void zone::undo_malloc(size_t size)
|
inline void zone::undo_allocate(size_t size)
|
||||||
{
|
{
|
||||||
chunk_list_.ptr_ -= size;
|
chunk_list_.ptr_ -= size;
|
||||||
chunk_list_.free_ += size;
|
chunk_list_.free_ += size;
|
||||||
@ -281,18 +281,18 @@ inline void zone::undo_malloc(size_t size)
|
|||||||
template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
||||||
T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>)
|
T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>)
|
||||||
{
|
{
|
||||||
void* x = malloc(sizeof(T));
|
void* x = allocate_align(sizeof(T));
|
||||||
try {
|
try {
|
||||||
finalizer_array_.push(&zone::object_destructor<T>, x);
|
finalizer_array_.push(&zone::object_destructor<T>, x);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
undo_malloc(sizeof(T));
|
undo_allocate(sizeof(T));
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return new (x) T(<%=(1..i).map{|j|"a#{j}"}.join(', ')%>);
|
return new (x) T(<%=(1..i).map{|j|"a#{j}"}.join(', ')%>);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
--finalizer_array_.tail_;
|
--finalizer_array_.tail_;
|
||||||
undo_malloc(sizeof(T));
|
undo_allocate(sizeof(T));
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
test/zone.cc
12
test/zone.cc
@ -1,12 +1,12 @@
|
|||||||
#include <msgpack.hpp>
|
#include <msgpack.hpp>
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
TEST(zone, malloc)
|
TEST(zone, allocate_align)
|
||||||
{
|
{
|
||||||
msgpack::zone z;
|
msgpack::zone z;
|
||||||
char* buf1 = (char*)z.malloc(4);
|
char* buf1 = (char*)z.allocate_align(4);
|
||||||
memcpy(buf1, "test", 4);
|
memcpy(buf1, "test", 4);
|
||||||
char* buf2 = (char*)z.malloc(4);
|
char* buf2 = (char*)z.allocate_align(4);
|
||||||
memcpy(buf2, "test", 4);
|
memcpy(buf2, "test", 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,11 +68,11 @@ TEST(zone, push_finalizer_unique_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(zone, malloc_no_align)
|
TEST(zone, allocate_no_align)
|
||||||
{
|
{
|
||||||
msgpack::zone z;
|
msgpack::zone z;
|
||||||
char* buf1 = (char*)z.malloc_no_align(4);
|
char* buf1 = (char*)z.allocate_no_align(4);
|
||||||
char* buf2 = (char*)z.malloc_no_align(4);
|
char* buf2 = (char*)z.allocate_no_align(4);
|
||||||
EXPECT_EQ(buf1+4, buf2);
|
EXPECT_EQ(buf1+4, buf2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user