Skip to content

Commit 315bbd4

Browse files
committed
Merge branch 'chshaob1-alignment'
2 parents 2ddd794 + 288a6b2 commit 315bbd4

47 files changed

Lines changed: 270 additions & 220 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

erb/v1/cpp03_define_array.hpp.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ struct define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
7575
void msgpack_object(msgpack::object* o, msgpack::zone& z) const
7676
{
7777
o->type = msgpack::type::ARRAY;
78-
o->via.array.ptr = static_cast<msgpack::object*>(z.allocate_align(sizeof(msgpack::object)*<%=i+1%>));
78+
o->via.array.ptr = static_cast<msgpack::object*>(z.allocate_align(sizeof(msgpack::object)*<%=i+1%>, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
7979
o->via.array.size = <%=i+1%>;
8080
<%0.upto(i) {|j|%>
8181
o->via.array.ptr[<%=j%>] = msgpack::object(a<%=j%>, z);<%}%>

erb/v1/cpp03_define_map.hpp.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ struct define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
8282
void msgpack_object(msgpack::object* o, msgpack::zone& z) const
8383
{
8484
o->type = msgpack::type::MAP;
85-
o->via.map.ptr = static_cast<msgpack::object_kv*>(z.allocate_align(sizeof(msgpack::object_kv)*<%=(i+1)/2%>));
85+
o->via.map.ptr = static_cast<msgpack::object_kv*>(z.allocate_align(sizeof(msgpack::object_kv)*<%=(i+1)/2%>, MSGPACK_ZONE_ALIGNOF(msgpack::object_kv)));
8686
o->via.map.size = <%=(i+1)/2%>;
8787
<%0.step(i,2) {|j|%>
8888
o->via.map.ptr[<%=j/2%>].key = msgpack::object(a<%=j%>, z);

erb/v1/cpp03_msgpack_tuple.hpp.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ struct object_with_zone<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
207207
msgpack::object::with_zone& o,
208208
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const {
209209
o.type = msgpack::type::ARRAY;
210-
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*<%=i+1%>));
210+
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*<%=i+1%>, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
211211
o.via.array.size = <%=i+1%>;
212212
<%0.upto(i) {|j|%>
213213
o.via.array.ptr[<%=j%>] = msgpack::object(v.template get<<%=j%>>(), o.zone);<%}%>

erb/v1/cpp03_zone.hpp.erb

Lines changed: 25 additions & 18 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
}
@@ -300,7 +307,7 @@ inline std::size_t aligned_size(
300307
template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
301308
T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>)
302309
{
303-
void* x = allocate_align(sizeof(T));
310+
void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
304311
try {
305312
m_finalizer_array.push(&zone::object_destruct<T>, x);
306313
} catch (...) {

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

example/cpp03/class_non_intrusive.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ struct object_with_zone<my_class> {
6969
o.type = type::ARRAY;
7070
o.via.array.size = 2;
7171
o.via.array.ptr = static_cast<msgpack::object*>(
72-
o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size));
72+
o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
7373
o.via.array.ptr[0] = msgpack::object(v.get_name(), o.zone);
7474
o.via.array.ptr[1] = msgpack::object(v.get_age(), o.zone);
7575
}

include/msgpack/adaptor/tr1/unordered_map.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ struct object_with_zone<MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc>
8484
o.via.map.size = 0;
8585
} else {
8686
uint32_t size = checked_get_container_size(v.size());
87-
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
87+
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size, MSGPACK_ZONE_ALIGNOF(msgpack::object_kv)));
8888
msgpack::object_kv* const pend = p + size;
8989
o.via.map.ptr = p;
9090
o.via.map.size = size;
@@ -141,7 +141,7 @@ struct object_with_zone<MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Al
141141
o.via.map.size = 0;
142142
} else {
143143
uint32_t size = checked_get_container_size(v.size());
144-
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
144+
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size, MSGPACK_ZONE_ALIGNOF(msgpack::object_kv)));
145145
msgpack::object_kv* const pend = p + size;
146146
o.via.map.ptr = p;
147147
o.via.map.size = size;

include/msgpack/adaptor/tr1/unordered_set.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ struct object_with_zone<MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc>
8282
o.via.array.size = 0;
8383
} else {
8484
uint32_t size = checked_get_container_size(v.size());
85-
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
85+
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
8686
msgpack::object* const pend = p + size;
8787
o.via.array.ptr = p;
8888
o.via.array.size = size;
@@ -136,7 +136,7 @@ struct object_with_zone<MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Al
136136
o.via.array.size = 0;
137137
} else {
138138
uint32_t size = checked_get_container_size(v.size());
139-
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
139+
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
140140
msgpack::object* const pend = p + size;
141141
o.via.array.ptr = p;
142142
o.via.array.size = size;

include/msgpack/v1/adaptor/array_ref.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ struct object_with_zone<msgpack::type::array_ref<T> > {
253253
}
254254
else {
255255
uint32_t size = checked_get_container_size(v.size());
256-
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
256+
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
257257
msgpack::object* const pend = p + size;
258258
o.via.array.ptr = p;
259259
o.via.array.size = size;
@@ -280,7 +280,7 @@ struct object_with_zone<msgpack::type::array_ref<T[N]> > {
280280
if (!v.data) { throw msgpack::type_error(); }
281281
o.type = msgpack::type::ARRAY;
282282
uint32_t size = checked_get_container_size(v.size());
283-
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
283+
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
284284
msgpack::object* const pend = p + size;
285285
o.via.array.ptr = p;
286286
o.via.array.size = size;

include/msgpack/v1/adaptor/boost/fusion.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ struct object_with_zone<T, typename msgpack::enable_if<boost::fusion::traits::is
132132
void operator()(msgpack::object::with_zone& o, const T& v) const {
133133
uint32_t size = checked_get_container_size(boost::fusion::size(v));
134134
o.type = msgpack::type::ARRAY;
135-
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
135+
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
136136
o.via.array.size = size;
137137
uint32_t count = 0;
138138
boost::fusion::for_each(v, with_zone_imp(o, count));

0 commit comments

Comments
 (0)