mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-10-17 11:05:05 +02:00
lang/c/msgpack: optimize zone::alloc()
git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@61 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
#include <stdexcept>
|
||||
|
||||
#ifndef MSGPACK_ZONE_CHUNK_SIZE
|
||||
#define MSGPACK_ZONE_CHUNK_SIZE 8*1024
|
||||
#define MSGPACK_ZONE_CHUNK_SIZE 1024
|
||||
#endif
|
||||
|
||||
namespace msgpack {
|
||||
@@ -44,19 +44,19 @@ public:
|
||||
void push_finalizer(void (*func)(void* obj, void* user), T* obj, void* user);
|
||||
|
||||
public:
|
||||
object_nil* nnil() { return new (alloc()) object_nil(); }
|
||||
object_true* ntrue() { return new (alloc()) object_true(); }
|
||||
object_false* nfalse() { return new (alloc()) object_false(); }
|
||||
object_u8* nu8( uint8_t v) { return new (alloc()) object_u8(v); }
|
||||
object_u16* nu16(uint16_t v) { return new (alloc()) object_u16(v); }
|
||||
object_u32* nu32(uint32_t v) { return new (alloc()) object_u32(v); }
|
||||
object_u64* nu64(uint64_t v) { return new (alloc()) object_u64(v); }
|
||||
object_i8* ni8( int8_t v) { return new (alloc()) object_i8(v); }
|
||||
object_i16* ni16( int16_t v) { return new (alloc()) object_i16(v); }
|
||||
object_i32* ni32( int32_t v) { return new (alloc()) object_i32(v); }
|
||||
object_i64* ni64( int64_t v) { return new (alloc()) object_i64(v); }
|
||||
object_float* nfloat( float v) { return new (alloc()) object_float(v); }
|
||||
object_double* ndouble( double v) { return new (alloc()) object_double(v); }
|
||||
object_nil* nnil () { return new (alloc()) object_nil(); }
|
||||
object_true* ntrue () { return new (alloc()) object_true(); }
|
||||
object_false* nfalse () { return new (alloc()) object_false(); }
|
||||
object_u8* nu8 (uint8_t v) { return new (alloc()) object_u8(v); }
|
||||
object_u16* nu16 (uint16_t v) { return new (alloc()) object_u16(v); }
|
||||
object_u32* nu32 (uint32_t v) { return new (alloc()) object_u32(v); }
|
||||
object_u64* nu64 (uint64_t v) { return new (alloc()) object_u64(v); }
|
||||
object_i8* ni8 (int8_t v) { return new (alloc()) object_i8(v); }
|
||||
object_i16* ni16 (int16_t v) { return new (alloc()) object_i16(v); }
|
||||
object_i32* ni32 (int32_t v) { return new (alloc()) object_i32(v); }
|
||||
object_i64* ni64 (int64_t v) { return new (alloc()) object_i64(v); }
|
||||
object_float* nfloat (float v) { return new (alloc()) object_float(v); }
|
||||
object_double* ndouble(double v) { return new (alloc()) object_double(v); }
|
||||
|
||||
object_raw_ref* nraw_ref(void* ptr, uint32_t len)
|
||||
{ return new (alloc()) object_raw_ref(ptr, len); }
|
||||
@@ -149,7 +149,7 @@ private:
|
||||
user_finalizer_t m_user_finalizer;
|
||||
|
||||
private:
|
||||
void resize_pool(size_t n);
|
||||
void expand_chunk();
|
||||
|
||||
public:
|
||||
static void finalize_free(void* obj, void* user)
|
||||
@@ -173,6 +173,16 @@ inline bool zone::empty() const
|
||||
return m_used == 0 && m_user_finalizer.empty();
|
||||
}
|
||||
|
||||
inline void* zone::alloc()
|
||||
{
|
||||
if(m_pool.size() <= m_used/ZONE_CHUNK_SIZE) {
|
||||
expand_chunk();
|
||||
}
|
||||
void* data = m_pool[m_used/ZONE_CHUNK_SIZE][m_used%ZONE_CHUNK_SIZE].data;
|
||||
++m_used;
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
} // namespace msgpack
|
||||
|
||||
|
Reference in New Issue
Block a user