rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

commit d370fc6201427d77c3e169ca2c3b87e7dc6beb6b
parent 2e2faaeb89023bdfde43ae0104db1b95e2309691
Author: vaplv <vaplv@free.fr>
Date:   Wed, 18 Jun 2014 17:41:19 +0200

Improve memory layout

Fix issues with non POD data structures

Diffstat:
Msrc/dynamic_array.h | 20++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/dynamic_array.h b/src/dynamic_array.h @@ -39,7 +39,8 @@ struct DARRAY_TYPE__ { DARRAY_DATA* data; - DARRAY_DATA buf[16]; /* Static buffer. Avoid mem alloc on small arrays */ + /* Avoids alloc on small arrays */ + char ALIGN(ALIGNOF(DARRAY_DATA)) buf[16*sizeof(DARRAY_DATA)]; size_t size; size_t capacity; struct mem_allocator* allocator; @@ -88,10 +89,13 @@ DARRAY_FUNC__(init) (struct mem_allocator* allocator, /* May be NULL <=> use default allocator */ struct DARRAY_TYPE__* darray) { + size_t i; ASSERT(darray); - darray->data = darray->buf; + darray->data = (DARRAY_DATA*)darray->buf; darray->size = 0; darray->capacity = sizeof(darray->buf)/sizeof(DARRAY_DATA); + FOR_EACH(i, 0, darray->capacity) + DARRAY_FUNCTOR_INIT(allocator, darray->data + i); darray->allocator = allocator ? allocator : &mem_default_allocator; } @@ -110,7 +114,7 @@ DARRAY_FUNC__(release)(struct DARRAY_TYPE__* darray) { ASSERT(darray); DARRAY_FUNC__(clear)(darray); - if( darray->data != darray->buf ) + if( darray->data != (DARRAY_DATA*)darray->buf ) MEM_FREE(darray->allocator, darray->data); } @@ -144,7 +148,7 @@ DARRAY_FUNC__(reserve)(struct DARRAY_TYPE__* darray, const size_t sz) } } } - if(darray->data != darray->buf) + if(darray->data != (DARRAY_DATA*)darray->buf) MEM_FREE(darray->allocator, darray->data); darray->data = data; @@ -248,10 +252,10 @@ DARRAY_FUNC__(copy_and_clear) return 0; } - if(src->data != src->buf && src->allocator == dst->allocator) { + if(src->data != (DARRAY_DATA*)src->buf && src->allocator == dst->allocator) { /* Give the ownership of src->m_Data to dst */ - if(dst->data != dst->buf) { - DARRAY_FUNC__(clear)(dst); + DARRAY_FUNC__(clear)(dst); + if(dst->data != (DARRAY_DATA*)dst->buf) { MEM_FREE(dst->allocator, dst->data); } dst->data = src->data; @@ -274,7 +278,7 @@ DARRAY_FUNC__(copy_and_clear) res = DARRAY_FUNCTOR_COPY_AND_RELEASE(dst_data+i, src_data+i); if(res) return res; } - DARRAY_FUNC__(clear)(src); + src->size = 0; } return res; }