diff options
| author | frsyuki <frsyuki@users.sourceforge.jp> | 2009-03-01 15:49:24 +0900 |
|---|---|---|
| committer | frsyuki <frsyuki@users.sourceforge.jp> | 2009-03-01 15:49:24 +0900 |
| commit | 21040d9cd3b03ee27248b39a6b657948fdac5f9d (patch) | |
| tree | 77a26af7b379b07eae9ccc06d04349e9cc9e2566 /c/zone.h | |
| parent | 319838e51757b59a9aa9e017491139602bcc1e68 (diff) | |
| download | msgpack-python-21040d9cd3b03ee27248b39a6b657948fdac5f9d.tar.gz | |
zone::push_finalizer reverts memory allocation on exception
Diffstat (limited to 'c/zone.h')
| -rw-r--r-- | c/zone.h | 37 |
1 files changed, 30 insertions, 7 deletions
@@ -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; } |
