Skip to content

Commit

Permalink
Merge pull request #160 from redboltz/fix_memory_allocation
Browse files Browse the repository at this point in the history
Fixed memory size caluclation problem.
  • Loading branch information
nobu-k committed Nov 16, 2014
2 parents 96c6887 + d6cc549 commit 3d20ec6
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 13 deletions.
7 changes: 6 additions & 1 deletion erb/cpp03_zone.hpp.erb
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,12 @@ inline void* zone::allocate_expand(size_t size)
size_t sz = m_chunk_size;

while(sz < size) {
sz *= 2;
size_t tmp_sz = sz * 2;
if (tmp_sz <= sz) {
sz = size;
break;
}
sz = tmp_sz;
}

chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
Expand Down
7 changes: 6 additions & 1 deletion include/msgpack/detail/cpp03_zone.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,12 @@ inline void* zone::allocate_expand(size_t size)
size_t sz = m_chunk_size;

while(sz < size) {
sz *= 2;
size_t tmp_sz = sz * 2;
if (tmp_sz <= sz) {
sz = size;
break;
}
sz = tmp_sz;
}

chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
Expand Down
7 changes: 6 additions & 1 deletion include/msgpack/detail/cpp11_zone.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,12 @@ inline void* zone::allocate_expand(size_t size)
size_t sz = m_chunk_size;

while(sz < size) {
sz *= 2;
size_t tmp_sz = sz * 2;
if (tmp_sz <= sz) {
sz = size;
break;
}
sz = tmp_sz;
}

chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
Expand Down
10 changes: 8 additions & 2 deletions include/msgpack/sbuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,14 @@ static inline int msgpack_sbuffer_write(void* data, const char* buf, size_t len)
size_t nsize = (sbuf->alloc) ?
sbuf->alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;

while(nsize < sbuf->size + len) { nsize *= 2; }
while(nsize < sbuf->size + len) {
size_t tmp_nsize = nsize * 2;
if (tmp_nsize <= nsize) {
nsize = sbuf->size + len;
break;
}
nsize = tmp_nsize;
}

tmp = realloc(sbuf->data, nsize);
if(!tmp) { return -1; }
Expand Down Expand Up @@ -109,4 +116,3 @@ static inline void msgpack_sbuffer_clear(msgpack_sbuffer* sbuf)
#endif

#endif /* msgpack/sbuffer.h */

9 changes: 8 additions & 1 deletion include/msgpack/sbuffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,14 @@ class sbuffer {
size_t nsize = (m_alloc > 0) ?
m_alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;

while(nsize < m_size + len) { nsize *= 2; }
while(nsize < m_size + len) {
size_t tmp_nsize = nsize * 2;
if (tmp_nsize <= nsize) {
nsize = m_size + len;
break;
}
nsize = tmp_nsize;
}

void* tmp = ::realloc(m_data, nsize);
if(!tmp) {
Expand Down
7 changes: 6 additions & 1 deletion include/msgpack/unpack.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1101,7 +1101,12 @@ inline void unpacker::expand_buffer(std::size_t size)
if(m_off == COUNTER_SIZE) {
std::size_t next_size = (m_used + m_free) * 2; // include COUNTER_SIZE
while(next_size < size + m_used) {
next_size *= 2;
std::size_t tmp_next_size = next_size * 2;
if (tmp_next_size <= next_size) {
next_size = size + m_used;
break;
}
next_size = tmp_next_size;
}

char* tmp = static_cast<char*>(::realloc(m_buffer, next_size));
Expand Down
7 changes: 6 additions & 1 deletion include/msgpack/vrefbuffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,12 @@ class vrefbuffer {
const size_t reqsize = nused + tosize;
size_t nnext = (to->m_end - to->m_array) * 2;
while(nnext < reqsize) {
nnext *= 2;
size_t tmp_nnext = nnext * 2;
if (tmp_nnext <= nnext) {
nnext = reqsize;
break;
}
nnext = tmp_nnext;
}

iovec* nvec = static_cast<iovec*>(::realloc(
Expand Down
14 changes: 12 additions & 2 deletions src/unpack.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,12 @@ bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size)
if(mpac->off == COUNTER_SIZE) {
size_t next_size = (mpac->used + mpac->free) * 2; // include COUNTER_SIZE
while(next_size < size + mpac->used) {
next_size *= 2;
size_t tmp_next_size = next_size * 2;
if (tmp_next_size <= next_size) {
next_size = size + mpac->used;
break;
}
next_size = tmp_next_size;
}

char* tmp = (char*)realloc(mpac->buffer, next_size);
Expand All @@ -411,7 +416,12 @@ bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size)
size_t next_size = mpac->initial_buffer_size; // include COUNTER_SIZE
size_t not_parsed = mpac->used - mpac->off;
while(next_size < size + not_parsed + COUNTER_SIZE) {
next_size *= 2;
size_t tmp_next_size = next_size * 2;
if (tmp_next_size <= next_size) {
next_size = size + not_parsed + COUNTER_SIZE;
break;
}
next_size = tmp_next_size;
}

char* tmp = (char*)malloc(next_size);
Expand Down
7 changes: 6 additions & 1 deletion src/vrefbuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,12 @@ int msgpack_vrefbuffer_migrate(msgpack_vrefbuffer* vbuf, msgpack_vrefbuffer* to)
const size_t reqsize = nused + tosize;
size_t nnext = (size_t)(to->end - to->array) * 2;
while(nnext < reqsize) {
nnext *= 2;
size_t tmp_nnext = nnext * 2;
if (tmp_nnext <= nnext) {
nnext = reqsize;
break;
}
nnext = tmp_nnext;
}

struct iovec* nvec = (struct iovec*)realloc(
Expand Down
8 changes: 6 additions & 2 deletions src/zone.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,12 @@ void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size)
size_t sz = zone->chunk_size;

while(sz < size) {
sz *= 2;
size_t tmp_sz = sz * 2;
if (tmp_sz <= sz) {
tmp_sz = size;
break;
}
sz = tmp_sz;
}

msgpack_zone_chunk* chunk = (msgpack_zone_chunk*)malloc(
Expand Down Expand Up @@ -218,4 +223,3 @@ void msgpack_zone_free(msgpack_zone* zone)
msgpack_zone_destroy(zone);
free(zone);
}

0 comments on commit 3d20ec6

Please sign in to comment.