2 * MessagePack for C memory pool implementation
4 * Copyright (C) 2008-2010 FURUHASHI Sadayuki
6 * Distributed under the Boost Software License, Version 1.0.
7 * (See accompanying file LICENSE_1_0.txt or copy at
8 * http://www.boost.org/LICENSE_1_0.txt)
10 #ifndef MSGPACK_ZONE_H
11 #define MSGPACK_ZONE_H
21 * @defgroup msgpack_zone Memory zone
26 typedef struct msgpack_zone_finalizer
{
27 void (*func
)(void* data
);
29 } msgpack_zone_finalizer
;
31 typedef struct msgpack_zone_finalizer_array
{
32 msgpack_zone_finalizer
* tail
;
33 msgpack_zone_finalizer
* end
;
34 msgpack_zone_finalizer
* array
;
35 } msgpack_zone_finalizer_array
;
37 struct msgpack_zone_chunk
;
38 typedef struct msgpack_zone_chunk msgpack_zone_chunk
;
40 typedef struct msgpack_zone_chunk_list
{
43 msgpack_zone_chunk
* head
;
44 } msgpack_zone_chunk_list
;
46 typedef struct msgpack_zone
{
47 msgpack_zone_chunk_list chunk_list
;
48 msgpack_zone_finalizer_array finalizer_array
;
52 #ifndef MSGPACK_ZONE_CHUNK_SIZE
53 #define MSGPACK_ZONE_CHUNK_SIZE 8192
57 bool msgpack_zone_init(msgpack_zone
* zone
, size_t chunk_size
);
59 void msgpack_zone_destroy(msgpack_zone
* zone
);
62 msgpack_zone
* msgpack_zone_new(size_t chunk_size
);
64 void msgpack_zone_free(msgpack_zone
* zone
);
66 static inline void* msgpack_zone_malloc(msgpack_zone
* zone
, size_t size
);
67 static inline void* msgpack_zone_malloc_no_align(msgpack_zone
* zone
, size_t size
);
69 static inline bool msgpack_zone_push_finalizer(msgpack_zone
* zone
,
70 void (*func
)(void* data
), void* data
);
72 static inline void msgpack_zone_swap(msgpack_zone
* a
, msgpack_zone
* b
);
75 bool msgpack_zone_is_empty(msgpack_zone
* zone
);
78 void msgpack_zone_clear(msgpack_zone
* zone
);
83 #ifndef MSGPACK_ZONE_ALIGN
84 #define MSGPACK_ZONE_ALIGN sizeof(void*)
88 void* msgpack_zone_malloc_expand(msgpack_zone
* zone
, size_t size
);
90 static inline void* msgpack_zone_malloc_no_align(msgpack_zone
* zone
, size_t size
)
93 msgpack_zone_chunk_list
* cl
= &zone
->chunk_list
;
95 if(zone
->chunk_list
.free
< size
) {
96 return msgpack_zone_malloc_expand(zone
, size
);
106 static inline void* msgpack_zone_malloc(msgpack_zone
* zone
, size_t size
)
111 zone
->chunk_list
.ptr
+ (MSGPACK_ZONE_ALIGN
- 1)
112 ) / MSGPACK_ZONE_ALIGN
* MSGPACK_ZONE_ALIGN
114 size_t adjusted_size
= size
+ (size_t)(aligned
- zone
->chunk_list
.ptr
);
115 if(zone
->chunk_list
.free
>= adjusted_size
) {
116 zone
->chunk_list
.free
-= adjusted_size
;
117 zone
->chunk_list
.ptr
+= adjusted_size
;
121 void* ptr
= msgpack_zone_malloc_expand(zone
, size
+ (MSGPACK_ZONE_ALIGN
- 1));
123 return (char*)((size_t)(ptr
) / MSGPACK_ZONE_ALIGN
* MSGPACK_ZONE_ALIGN
);
130 bool msgpack_zone_push_finalizer_expand(msgpack_zone
* zone
,
131 void (*func
)(void* data
), void* data
);
133 static inline bool msgpack_zone_push_finalizer(msgpack_zone
* zone
,
134 void (*func
)(void* data
), void* data
)
136 msgpack_zone_finalizer_array
* const fa
= &zone
->finalizer_array
;
137 msgpack_zone_finalizer
* fin
= fa
->tail
;
140 return msgpack_zone_push_finalizer_expand(zone
, func
, data
);
151 static inline void msgpack_zone_swap(msgpack_zone
* a
, msgpack_zone
* b
)
153 msgpack_zone tmp
= *a
;
163 #endif /* msgpack/zone.h */