summaryrefslogtreecommitdiff
path: root/cpp/zone.hpp.erb
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>2009-02-15 09:09:57 +0000
committerfrsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>2009-02-15 09:09:57 +0000
commit4d13f614b6839ac4ca78f5526ab79e911f33ea65 (patch)
treec64a0719f7ba0176fa67bdd0eee266274be4a7da /cpp/zone.hpp.erb
parenta721837ed0c1b9783deb72a09d51dfad79411262 (diff)
downloadmsgpack-python-4d13f614b6839ac4ca78f5526ab79e911f33ea65.tar.gz
lang/c/msgpack: optimize zone::alloc()
git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@61 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
Diffstat (limited to 'cpp/zone.hpp.erb')
-rw-r--r--cpp/zone.hpp.erb40
1 files changed, 25 insertions, 15 deletions
diff --git a/cpp/zone.hpp.erb b/cpp/zone.hpp.erb
index ac08595..d63fae8 100644
--- a/cpp/zone.hpp.erb
+++ b/cpp/zone.hpp.erb
@@ -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