summaryrefslogtreecommitdiff
path: root/c/zone.h
diff options
context:
space:
mode:
Diffstat (limited to 'c/zone.h')
-rw-r--r--c/zone.h49
1 files changed, 44 insertions, 5 deletions
diff --git a/c/zone.h b/c/zone.h
index ff6ca62..3dc9f52 100644
--- a/c/zone.h
+++ b/c/zone.h
@@ -19,19 +19,58 @@
#define MSGPACK_ZONE_H__
#include <stddef.h>
+#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
-struct _msgpack_zone;
-typedef struct _msgpack_zone msgpack_zone;
+typedef struct msgpack_zone_chunk {
+ size_t free;
+ char* ptr;
+ void* alloc;
+} msgpack_zone_chunk;
-msgpack_zone* msgpack_zone_new();
-void msgpack_zone_free(msgpack_zone* z);
+typedef struct msgpack_zone_finalizer {
+ void (*func)(void* data);
+ void* data;
+} msgpack_zone_finalizer;
-void* msgpack_zone_malloc(msgpack_zone* z, size_t size);
+typedef struct msgpack_zone_chunk_array {
+ msgpack_zone_chunk* tail;
+ msgpack_zone_chunk* end;
+ msgpack_zone_chunk* array;
+} msgpack_zone_chunk_array;
+
+typedef struct msgpack_zone_finalizer_array {
+ msgpack_zone_finalizer* tail;
+ msgpack_zone_finalizer* end;
+ msgpack_zone_finalizer* array;
+} msgpack_zone_finalizer_array;
+
+typedef struct msgpack_zone {
+ msgpack_zone_chunk_array chunk_array;
+ msgpack_zone_finalizer_array finalizer_array;
+ size_t chunk_size;
+} msgpack_zone;
+
+#ifndef MSGPACK_ZONE_CHUNK_SIZE
+#define MSGPACK_ZONE_CHUNK_SIZE 2048
+#endif
+
+bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size);
+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);
+
+bool msgpack_zone_push_finalizer(msgpack_zone* zone,
+ void (*func)(void* data), void* data);
+
+bool msgpack_zone_is_empty(msgpack_zone* zone);
#ifdef __cplusplus