diff --git a/lv_misc/lv_ll.c b/lv_misc/lv_ll.c index 0ebea4922..c8b08c9aa 100644 --- a/lv_misc/lv_ll.c +++ b/lv_misc/lv_ll.c @@ -51,11 +51,19 @@ void lv_ll_init(lv_ll_t * ll_p, uint32_t n_size) { ll_p->head = NULL; ll_p->tail = NULL; - - if(n_size & 0x3) { /*Round up to 4*/ - n_size &= ~0x3; - n_size += 4; +#ifdef LV_MEM_ENV64 + /*Round the size up to 8*/ + if(n_size & 0x7) { + n_size = n_size & (~0x7); + n_size += 8; } +#else + /*Round the size up to 4*/ + if(n_size & 0x3) { + n_size = n_size & (~0x3); + n_size += 4; + } +#endif ll_p->n_size = n_size; } @@ -312,20 +320,21 @@ void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) { if(n_act == n_after) return; /*Can't move before itself*/ - if(n_after == NULL) { - void * n_before = lv_ll_get_tail(ll_p); - node_set_next(ll_p, n_before, n_act); - node_set_prev(ll_p, n_act, n_before); - node_set_next(ll_p, n_act, NULL); - ll_p->tail = n_act; - } else { - void * n_before = lv_ll_get_prev(ll_p, n_after); - /*Move the node between `n_before` and `n_after`*/ - node_set_next(ll_p, n_before, n_act); - node_set_prev(ll_p, n_act, n_before); - node_set_prev(ll_p, n_after, n_act); - node_set_next(ll_p, n_act, n_after); - } + + void * n_before = lv_ll_get_prev(ll_p, n_after); + if(n_act == n_before) return; /*Already before `n_after`*/ + + /*It's much easier to remove from the list and add again*/ + lv_ll_rem(ll_p, n_act); + + /*Add again by setting the prev. and next nodes*/ + node_set_next(ll_p, n_before, n_act); + node_set_prev(ll_p, n_act, n_before); + node_set_prev(ll_p, n_after, n_act); + node_set_next(ll_p, n_act, n_after); + + /*If `n_act` was moved before NULL then it become the new tail*/ + if(n_after == NULL) ll_p->tail = n_act; } /********************** @@ -340,7 +349,11 @@ void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) */ static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev) { - memcpy(act + LL_PREV_P_OFFSET(ll_p), &prev, sizeof(lv_ll_node_t *)); + if(act == NULL) return; /*Can't set the prev node of `NULL`*/ + + uint32_t node_p_size = sizeof(lv_ll_node_t *); + if(prev) memcpy(act + LL_PREV_P_OFFSET(ll_p), &prev, node_p_size); + else memset(act + LL_PREV_P_OFFSET(ll_p), 0, node_p_size); } /** @@ -351,6 +364,10 @@ static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * pre */ static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next) { - memcpy(act + LL_NEXT_P_OFFSET(ll_p), &next, sizeof(lv_ll_node_t *)); + if(act == NULL) return; /*Can't set the next node of `NULL`*/ + + uint32_t node_p_size = sizeof(lv_ll_node_t *); + if(next) memcpy(act + LL_NEXT_P_OFFSET(ll_p), &next, node_p_size); + else memset(act + LL_NEXT_P_OFFSET(ll_p), 0, node_p_size); } diff --git a/lv_misc/lv_mem.c b/lv_misc/lv_mem.c index 6a54eb104..d3603d240 100644 --- a/lv_misc/lv_mem.c +++ b/lv_misc/lv_mem.c @@ -20,25 +20,14 @@ *********************/ #define LV_MEM_ADD_JUNK 0 /*Add memory junk on alloc (0xaa) and free(0xbb) (just for testing purposes)*/ -// Check windows -#if __WIN64 -# define ENVIRONMENT64 -#endif -// Check GCC -#if __GNUC__ -# if __x86_64__ || __ppc64__ -# define ENVIRONMENT64 -# endif -#endif - - -#ifdef ENVIRONMENT64 +#ifdef LV_MEM_ENV64 # define MEM_UNIT uint64_t #else # define MEM_UNIT uint32_t #endif + /********************** * TYPEDEFS **********************/ @@ -109,7 +98,7 @@ void * lv_mem_alloc(uint32_t size) return &zero_mem; } -#ifdef ENVIRONMENT64 +#ifdef LV_MEM_ENV64 /*Round the size up to 8*/ if(size & 0x7) { size = size & (~0x7); @@ -393,7 +382,7 @@ static void * ent_alloc(lv_mem_ent_t * e, uint32_t size) */ static void ent_trunc(lv_mem_ent_t * e, uint32_t size) { -#ifdef ENVIRONMENT64 +#ifdef LV_MEM_ENV64 /*Round the size up to 8*/ if(size & 0x7) { size = size & (~0x7); diff --git a/lv_misc/lv_mem.h b/lv_misc/lv_mem.h index a179c78f0..ceb668a76 100644 --- a/lv_misc/lv_mem.h +++ b/lv_misc/lv_mem.h @@ -27,6 +27,17 @@ extern "C" { /********************* * DEFINES *********************/ +// Check windows +#if __WIN64 +# define LV_MEM_ENV64 +#endif + +// Check GCC +#if __GNUC__ +# if __x86_64__ || __ppc64__ +# define LV_MEM_ENV64 +# endif +#endif /********************** * TYPEDEFS