MessagePack for C
Loading...
Searching...
No Matches
zone.h
Go to the documentation of this file.
1/*
2 * MessagePack for C memory pool implementation
3 *
4 * Copyright (C) 2008-2010 FURUHASHI Sadayuki
5 *
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)
9 */
10#ifndef MSGPACK_ZONE_H
11#define MSGPACK_ZONE_H
12
13#include "sysdep.h"
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19
30
36
39
45
51
52#ifndef MSGPACK_ZONE_CHUNK_SIZE
53#define MSGPACK_ZONE_CHUNK_SIZE 8192
54#endif
55
57bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size);
60
62msgpack_zone* msgpack_zone_new(size_t chunk_size);
65
66static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
67static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size);
68
69static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone,
70 void (*func)(void* data), void* data);
71
72static inline void msgpack_zone_swap(msgpack_zone* a, msgpack_zone* b);
73
76
79
83#ifndef MSGPACK_ZONE_ALIGN
84#define MSGPACK_ZONE_ALIGN sizeof(void*)
85#endif
86
88void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size);
89
90static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size)
91{
92 char* ptr;
94
95 if(zone->chunk_list.free < size) {
96 return msgpack_zone_malloc_expand(zone, size);
97 }
98
99 ptr = cl->ptr;
100 cl->free -= size;
101 cl->ptr += size;
102
103 return ptr;
104}
105
106static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
107{
108 char* aligned =
109 (char*)(
110 (uintptr_t)(
111 zone->chunk_list.ptr + (MSGPACK_ZONE_ALIGN - 1)
112 ) & ~(uintptr_t)(MSGPACK_ZONE_ALIGN - 1)
113 );
114 size_t adjusted_size = size + (size_t)(aligned - zone->chunk_list.ptr);
115 if(zone->chunk_list.free >= adjusted_size) {
118 return aligned;
119 }
120 {
121 void* ptr = msgpack_zone_malloc_expand(zone, size + (MSGPACK_ZONE_ALIGN - 1));
122 if (ptr) {
123 return (char*)((uintptr_t)(ptr) & ~(uintptr_t)(MSGPACK_ZONE_ALIGN - 1));
124 }
125 }
126 return NULL;
127}
128
129
131 void (*func)(void* data), void* data);
132
133static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone,
134 void (*func)(void* data), void* data)
135{
138
139 if(fin == fa->end) {
140 return msgpack_zone_push_finalizer_expand(zone, func, data);
141 }
142
143 fin->func = func;
144 fin->data = data;
145
146 ++fa->tail;
147
148 return true;
149}
150
151static inline void msgpack_zone_swap(msgpack_zone* a, msgpack_zone* b)
152{
153 msgpack_zone tmp = *a;
154 *a = *b;
155 *b = tmp;
156}
157
158
159#ifdef __cplusplus
160}
161#endif
162
163#endif /* msgpack/zone.h */
MSGPACK_DLLEXPORT void msgpack_zone_free(msgpack_zone *zone)
struct msgpack_zone_chunk msgpack_zone_chunk
Definition zone.h:38
MSGPACK_DLLEXPORT bool msgpack_zone_init(msgpack_zone *zone, size_t chunk_size)
MSGPACK_DLLEXPORT bool msgpack_zone_is_empty(msgpack_zone *zone)
MSGPACK_DLLEXPORT msgpack_zone * msgpack_zone_new(size_t chunk_size)
MSGPACK_DLLEXPORT void msgpack_zone_clear(msgpack_zone *zone)
MSGPACK_DLLEXPORT void msgpack_zone_destroy(msgpack_zone *zone)
Definition zone.h:40
msgpack_zone_chunk * head
Definition zone.h:43
char * ptr
Definition zone.h:42
size_t free
Definition zone.h:41
Definition zone.h:31
msgpack_zone_finalizer * array
Definition zone.h:34
msgpack_zone_finalizer * tail
Definition zone.h:32
msgpack_zone_finalizer * end
Definition zone.h:33
Definition zone.h:26
void * data
Definition zone.h:28
void(* func)(void *data)
Definition zone.h:27
Definition zone.h:46
size_t chunk_size
Definition zone.h:49
msgpack_zone_chunk_list chunk_list
Definition zone.h:47
msgpack_zone_finalizer_array finalizer_array
Definition zone.h:48
const char * data
Definition unpack_template.h:94
const char size_t len
Definition unpack_template.h:94
bool msgpack_zone_push_finalizer_expand(msgpack_zone *zone, void(*func)(void *data), void *data)
MSGPACK_DLLEXPORT void * msgpack_zone_malloc_expand(msgpack_zone *zone, size_t size)
#define MSGPACK_ZONE_ALIGN
Definition zone.h:84