summaryrefslogtreecommitdiff
path: root/c/zone.h
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2009-03-01 15:49:24 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2009-03-01 15:49:24 +0900
commit21040d9cd3b03ee27248b39a6b657948fdac5f9d (patch)
tree77a26af7b379b07eae9ccc06d04349e9cc9e2566 /c/zone.h
parent319838e51757b59a9aa9e017491139602bcc1e68 (diff)
downloadmsgpack-python-21040d9cd3b03ee27248b39a6b657948fdac5f9d.tar.gz
zone::push_finalizer reverts memory allocation on exception
Diffstat (limited to 'c/zone.h')
-rw-r--r--c/zone.h37
1 files changed, 30 insertions, 7 deletions
diff --git a/c/zone.h b/c/zone.h
index 93a4642..a3dfe41 100644
--- a/c/zone.h
+++ b/c/zone.h
@@ -67,7 +67,7 @@ void msgpack_zone_free(msgpack_zone* zone);
static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
-bool msgpack_zone_push_finalizer(msgpack_zone* zone,
+static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone,
void (*func)(void* data), void* data);
bool msgpack_zone_is_empty(msgpack_zone* zone);
@@ -88,14 +88,37 @@ void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
msgpack_zone_chunk* chunk = zone->chunk_array.tail;
- if(chunk->free > size) {
- char* ptr = chunk->ptr;
- chunk->ptr += size;
- chunk->free -= size;
- return ptr;
+ if(chunk->free < size) {
+ return msgpack_zone_malloc_expand(zone, size);
+ }
+
+ char* ptr = chunk->ptr;
+ chunk->ptr += size;
+ chunk->free -= size;
+
+ return ptr;
+}
+
+
+bool msgpack_zone_push_finalizer_expand(msgpack_zone* zone,
+ void (*func)(void* data), void* data);
+
+bool msgpack_zone_push_finalizer(msgpack_zone* zone,
+ void (*func)(void* data), void* data)
+{
+ msgpack_zone_finalizer_array* const fa = &zone->finalizer_array;
+ msgpack_zone_finalizer* fin = fa->tail;
+
+ if(fin == fa->end) {
+ return msgpack_zone_push_finalizer_expand(zone, func, data);
}
- return msgpack_zone_malloc_expand(zone, size);
+ fin->func = func;
+ fin->data = data;
+
+ ++fa->tail;
+
+ return true;
}