summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--c/zone.c19
-rw-r--r--c/zone.h26
2 files changed, 27 insertions, 18 deletions
diff --git a/c/zone.c b/c/zone.c
index 7a275f6..877f4ed 100644
--- a/c/zone.c
+++ b/c/zone.c
@@ -19,7 +19,6 @@
#include <stdlib.h>
#include <string.h>
-
static inline bool init_chunk_array(msgpack_zone_chunk_array* ca, size_t chunk_size)
{
// glibcは72バイト以下のmallocが高速
@@ -74,25 +73,11 @@ static inline void clear_chunk_array(msgpack_zone_chunk_array* ca)
ca->array[0].ptr = (char*)ca->array[0].alloc;
}
-void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
+void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size)
{
msgpack_zone_chunk_array* const ca = &zone->chunk_array;
- msgpack_zone_chunk* chunk = ca->tail;
-
- if(chunk->free > size) {
- // chunkに空き容量がある
- // 空き容量を消費して返す
-
- char* ptr = chunk->ptr;
-
- chunk->ptr += size;
- chunk->free -= size;
-
- return ptr;
- }
-
- chunk = ++ca->tail;
+ msgpack_zone_chunk* chunk = ++ca->tail;
if(chunk == ca->end) {
// ca->arrayに空きがない
diff --git a/c/zone.h b/c/zone.h
index 3c1188d..93a4642 100644
--- a/c/zone.h
+++ b/c/zone.h
@@ -65,7 +65,7 @@ void msgpack_zone_destroy(msgpack_zone* zone);
msgpack_zone* msgpack_zone_new(size_t chunk_size);
void msgpack_zone_free(msgpack_zone* zone);
-void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
+static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
bool msgpack_zone_push_finalizer(msgpack_zone* zone,
void (*func)(void* data), void* data);
@@ -75,6 +75,30 @@ bool msgpack_zone_is_empty(msgpack_zone* zone);
void msgpack_zone_clear(msgpack_zone* zone);
+
+#ifndef MSGPACK_ZONE_ALIGN
+#define MSGPACK_ZONE_ALIGN sizeof(int)
+#endif
+
+void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size);
+
+void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
+{
+ size = ((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1);
+
+ msgpack_zone_chunk* chunk = zone->chunk_array.tail;
+
+ if(chunk->free > size) {
+ char* ptr = chunk->ptr;
+ chunk->ptr += size;
+ chunk->free -= size;
+ return ptr;
+ }
+
+ return msgpack_zone_malloc_expand(zone, size);
+}
+
+
#ifdef __cplusplus
}
#endif