lvgl: Better heap alignment

This commit is contained in:
CTCaer 2020-04-30 03:49:40 +03:00
parent 6749dad1a4
commit a7c64f8ba2

View file

@ -56,10 +56,10 @@
typedef union { typedef union {
struct { struct {
MEM_UNIT used: 1; //1: if the entry is used MEM_UNIT used: 1; //1: if the entry is used
MEM_UNIT d_size: 31; //Size off the data (1 means 4 bytes) MEM_UNIT d_size: 31; //Size of the data
}; };
MEM_UNIT header; //The header (used + d_size) MEM_UNIT header; //The header (used + d_size)
uint32_t align[8]; //Align header size to 32 bytes MEM_UNIT align[8]; //Align header size to MEM_UNIT * 8 bytes
} lv_mem_header_t; } lv_mem_header_t;
static_assert(sizeof(lv_mem_header_t) == 32, "Node header must be 32 bytes!"); static_assert(sizeof(lv_mem_header_t) == 32, "Node header must be 32 bytes!");
@ -130,10 +130,10 @@ void * lv_mem_alloc(uint32_t size)
return &zero_mem; return &zero_mem;
} }
/*Round the size up to 32*/ /*Round the size to lv_mem_header_t*/
if(size & 0x1F) { if(size & (sizeof(lv_mem_header_t) - 1)) {
size = size & (~0x1F); size = size & (~(sizeof(lv_mem_header_t) - 1));
size += 0x20; size += sizeof(lv_mem_header_t);
} }
void * alloc = NULL; void * alloc = NULL;
@ -233,6 +233,12 @@ void lv_mem_free(const void * data)
void * lv_mem_realloc(void * data_p, uint32_t new_size) void * lv_mem_realloc(void * data_p, uint32_t new_size)
{ {
/*Round the size to lv_mem_header_t*/
if(new_size & (sizeof(lv_mem_header_t) - 1)) {
new_size = new_size & (~(sizeof(lv_mem_header_t) - 1));
new_size += sizeof(lv_mem_header_t);
}
/*data_p could be previously freed pointer (in this case it is invalid)*/ /*data_p could be previously freed pointer (in this case it is invalid)*/
if(data_p != NULL) { if(data_p != NULL) {
lv_mem_ent_t * e = (lv_mem_ent_t *)((uint8_t *) data_p - sizeof(lv_mem_header_t)); lv_mem_ent_t * e = (lv_mem_ent_t *)((uint8_t *) data_p - sizeof(lv_mem_header_t));
@ -444,13 +450,6 @@ static void * ent_alloc(lv_mem_ent_t * e, uint32_t size)
*/ */
static void ent_trunc(lv_mem_ent_t * e, uint32_t size) static void ent_trunc(lv_mem_ent_t * e, uint32_t size)
{ {
/*Round the size up to 32*/
if(size & 0x1F) {
size = size & (~0x1F);
size += 0x20;
}
/*Don't let empty space only for a header without data*/ /*Don't let empty space only for a header without data*/
if(e->header.d_size == size + sizeof(lv_mem_header_t)) { if(e->header.d_size == size + sizeof(lv_mem_header_t)) {
size = e->header.d_size; size = e->header.d_size;