Skip to content

Commit 288a6b2

Browse files
committed
Fixed zone expansion algorithm.
1 parent a0e4294 commit 288a6b2

6 files changed

Lines changed: 86 additions & 52 deletions

File tree

erb/v1/cpp03_zone.hpp.erb

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,9 @@ private:
178178
template <typename T>
179179
static void object_delete(void* obj);
180180

181-
void* allocate_expand(size_t size);
181+
static char* get_aligned(char* ptr, size_t align);
182+
183+
char* allocate_expand(size_t size);
182184
private:
183185
zone(const zone&);
184186
zone& operator=(const zone&);
@@ -188,37 +190,42 @@ inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_
188190
{
189191
}
190192

191-
inline void* zone::allocate_align(size_t size, size_t align)
193+
inline char* zone::get_aligned(char* ptr, size_t align)
192194
{
193-
char* aligned =
195+
return
194196
reinterpret_cast<char*>(
195197
reinterpret_cast<size_t>(
196-
(m_chunk_list.m_ptr + (align - 1))) / align * align);
198+
(ptr + (align - 1))) / align * align);
199+
}
200+
201+
inline void* zone::allocate_align(size_t size, size_t align)
202+
{
203+
char* aligned = get_aligned(m_chunk_list.m_ptr, align);
197204
size_t adjusted_size = size + (aligned - m_chunk_list.m_ptr);
198-
if(m_chunk_list.m_free >= adjusted_size) {
199-
m_chunk_list.m_free -= adjusted_size;
200-
m_chunk_list.m_ptr += adjusted_size;
201-
return aligned;
205+
if (m_chunk_list.m_free < adjusted_size) {
206+
size_t enough_size = size + align - 1;
207+
char* ptr = allocate_expand(enough_size);
208+
aligned = get_aligned(ptr, align);
209+
adjusted_size = size + (aligned - m_chunk_list.m_ptr);
202210
}
203-
return reinterpret_cast<char*>(
204-
reinterpret_cast<size_t>(
205-
allocate_expand(size + (align - 1))) / align * align);
211+
m_chunk_list.m_free -= adjusted_size;
212+
m_chunk_list.m_ptr += adjusted_size;
213+
return aligned;
206214
}
207215

208216
inline void* zone::allocate_no_align(size_t size)
209217
{
218+
char* ptr = m_chunk_list.m_ptr;
210219
if(m_chunk_list.m_free < size) {
211-
return allocate_expand(size);
220+
ptr = allocate_expand(size);
212221
}
213-
214-
char* ptr = m_chunk_list.m_ptr;
215222
m_chunk_list.m_free -= size;
216223
m_chunk_list.m_ptr += size;
217224

218225
return ptr;
219226
}
220227

221-
inline void* zone::allocate_expand(size_t size)
228+
inline char* zone::allocate_expand(size_t size)
222229
{
223230
chunk_list* const cl = &m_chunk_list;
224231

@@ -240,8 +247,8 @@ inline void* zone::allocate_expand(size_t size)
240247

241248
c->m_next = cl->m_head;
242249
cl->m_head = c;
243-
cl->m_free = sz - size;
244-
cl->m_ptr = ptr + size;
250+
cl->m_free = sz;
251+
cl->m_ptr = ptr;
245252

246253
return ptr;
247254
}

erb/v1/cpp03_zone_decl.hpp.erb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
#define MSGPACK_ZONE_ALIGN sizeof(void*)
2525
#endif
2626

27+
#if defined(_MSC_VER)
28+
#define MSGPACK_ZONE_ALIGNOF(type) __alignof(type)
29+
#else
30+
#define MSGPACK_ZONE_ALIGNOF(type) __alignof__(type)
31+
#endif
32+
// For a compiler that doesn't support __alignof__:
33+
// #define MSGPACK_ZONE_ALIGNOF(type) MSGPACK_ZONE_ALIGN
34+
2735
<% GENERATION_LIMIT = 15 %>
2836
namespace msgpack {
2937

include/msgpack/v1/detail/cpp03_zone.hpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,9 @@ class zone {
223223
template <typename T>
224224
static void object_delete(void* obj);
225225

226-
void* allocate_expand(size_t size);
226+
static char* get_aligned(char* ptr, size_t align);
227+
228+
char* allocate_expand(size_t size);
227229
private:
228230
zone(const zone&);
229231
zone& operator=(const zone&);
@@ -233,37 +235,42 @@ inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_
233235
{
234236
}
235237

236-
inline void* zone::allocate_align(size_t size, size_t align)
238+
inline char* zone::get_aligned(char* ptr, size_t align)
237239
{
238-
char* aligned =
240+
return
239241
reinterpret_cast<char*>(
240242
reinterpret_cast<size_t>(
241-
(m_chunk_list.m_ptr + (align - 1))) / align * align);
243+
(ptr + (align - 1))) / align * align);
244+
}
245+
246+
inline void* zone::allocate_align(size_t size, size_t align)
247+
{
248+
char* aligned = get_aligned(m_chunk_list.m_ptr, align);
242249
size_t adjusted_size = size + (aligned - m_chunk_list.m_ptr);
243-
if(m_chunk_list.m_free >= adjusted_size) {
244-
m_chunk_list.m_free -= adjusted_size;
245-
m_chunk_list.m_ptr += adjusted_size;
246-
return aligned;
247-
}
248-
return reinterpret_cast<char*>(
249-
reinterpret_cast<size_t>(
250-
allocate_expand(size + (align - 1))) / align * align);
250+
if (m_chunk_list.m_free < adjusted_size) {
251+
size_t enough_size = size + align - 1;
252+
char* ptr = allocate_expand(enough_size);
253+
aligned = get_aligned(ptr, align);
254+
adjusted_size = size + (aligned - m_chunk_list.m_ptr);
255+
}
256+
m_chunk_list.m_free -= adjusted_size;
257+
m_chunk_list.m_ptr += adjusted_size;
258+
return aligned;
251259
}
252260

253261
inline void* zone::allocate_no_align(size_t size)
254262
{
263+
char* ptr = m_chunk_list.m_ptr;
255264
if(m_chunk_list.m_free < size) {
256-
return allocate_expand(size);
265+
ptr = allocate_expand(size);
257266
}
258-
259-
char* ptr = m_chunk_list.m_ptr;
260267
m_chunk_list.m_free -= size;
261268
m_chunk_list.m_ptr += size;
262269

263270
return ptr;
264271
}
265272

266-
inline void* zone::allocate_expand(size_t size)
273+
inline char* zone::allocate_expand(size_t size)
267274
{
268275
chunk_list* const cl = &m_chunk_list;
269276

@@ -285,8 +292,8 @@ inline void* zone::allocate_expand(size_t size)
285292

286293
c->m_next = cl->m_head;
287294
cl->m_head = c;
288-
cl->m_free = sz - size;
289-
cl->m_ptr = ptr + size;
295+
cl->m_free = sz;
296+
cl->m_ptr = ptr;
290297

291298
return ptr;
292299
}

include/msgpack/v1/detail/cpp03_zone_decl.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
#else
3030
#define MSGPACK_ZONE_ALIGNOF(type) __alignof__(type)
3131
#endif
32+
// For a compiler that doesn't support __alignof__:
33+
// #define MSGPACK_ZONE_ALIGNOF(type) MSGPACK_ZONE_ALIGN
34+
3235

3336
namespace msgpack {
3437

include/msgpack/v1/detail/cpp11_zone.hpp

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -219,44 +219,51 @@ class zone {
219219
template <typename T>
220220
static void object_delete(void* obj);
221221

222-
void* allocate_expand(size_t size);
222+
static char* get_aligned(char* ptr, size_t align);
223+
224+
char* allocate_expand(size_t size);
223225
};
224226

225227
inline zone::zone(size_t chunk_size) noexcept:m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
226228
{
227229
}
228230

229-
inline void* zone::allocate_align(size_t size, size_t align)
231+
inline char* zone::get_aligned(char* ptr, size_t align)
230232
{
231-
char* aligned =
233+
return
232234
reinterpret_cast<char*>(
233235
reinterpret_cast<size_t>(
234-
(m_chunk_list.m_ptr + (align - 1))) / align * align);
236+
(ptr + (align - 1))) / align * align);
237+
}
238+
239+
inline void* zone::allocate_align(size_t size, size_t align)
240+
{
241+
char* aligned = get_aligned(m_chunk_list.m_ptr, align);
235242
size_t adjusted_size = size + (aligned - m_chunk_list.m_ptr);
236-
if(m_chunk_list.m_free >= adjusted_size) {
237-
m_chunk_list.m_free -= adjusted_size;
238-
m_chunk_list.m_ptr += adjusted_size;
239-
return aligned;
243+
if (m_chunk_list.m_free < adjusted_size) {
244+
size_t enough_size = size + align - 1;
245+
char* ptr = allocate_expand(enough_size);
246+
aligned = get_aligned(ptr, align);
247+
adjusted_size = size + (aligned - m_chunk_list.m_ptr);
240248
}
241-
return reinterpret_cast<char*>(
242-
reinterpret_cast<size_t>(
243-
allocate_expand(size + (align - 1))) / align * align);
249+
m_chunk_list.m_free -= adjusted_size;
250+
m_chunk_list.m_ptr += adjusted_size;
251+
return aligned;
244252
}
245253

246254
inline void* zone::allocate_no_align(size_t size)
247255
{
256+
char* ptr = m_chunk_list.m_ptr;
248257
if(m_chunk_list.m_free < size) {
249-
return allocate_expand(size);
258+
ptr = allocate_expand(size);
250259
}
251-
252-
char* ptr = m_chunk_list.m_ptr;
253260
m_chunk_list.m_free -= size;
254261
m_chunk_list.m_ptr += size;
255262

256263
return ptr;
257264
}
258265

259-
inline void* zone::allocate_expand(size_t size)
266+
inline char* zone::allocate_expand(size_t size)
260267
{
261268
chunk_list* const cl = &m_chunk_list;
262269

@@ -278,8 +285,8 @@ inline void* zone::allocate_expand(size_t size)
278285

279286
c->m_next = cl->m_head;
280287
cl->m_head = c;
281-
cl->m_free = sz - size;
282-
cl->m_ptr = ptr + size;
288+
cl->m_free = sz;
289+
cl->m_ptr = ptr;
283290

284291
return ptr;
285292
}

include/msgpack/v1/detail/cpp11_zone_decl.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#else
3232
#define MSGPACK_ZONE_ALIGNOF(type) __alignof__(type)
3333
#endif
34+
// For a compiler that doesn't support __alignof__:
35+
// #define MSGPACK_ZONE_ALIGNOF(type) MSGPACK_ZONE_ALIGN
3436

3537
namespace msgpack {
3638

0 commit comments

Comments
 (0)