}
#else /*LODEPNG_COMPILE_ALLOCATORS*/
/* TODO: support giving additional void* payload to the custom allocators */
-#include "lvgl/lvgl.h"
+/*------------------------------------start----------------------------------------*/
+
+typedef struct node {
+ void* ptr;
+ struct node* next;
+} node_t;
-/* 结构体用于保存每个已分配的内存块的信息 */
typedef struct {
- void * ptr;
-} malloc_info_t;
+ node_t* head;
+} linked_list_t;
+
+linked_list_t *lvgl_my_malloc_linklist = NULL;
-static lv_ll_t malloc_ll;
-static char is_first = 1;
-static void my_mem_init(void) {
- _lv_ll_init(&malloc_ll, sizeof(malloc_info_t));
+linked_list_t* create_list() {
+ linked_list_t* list = (linked_list_t*)malloc(sizeof(linked_list_t));
+ if(list == NULL){
+ return NULL;
+ }
+ list->head = NULL;
+ return list;
}
-static void * my_lv_mem_alloc(size_t size) {
- if(is_first) {
- is_first = 0;
- my_mem_init();
- }
- void * ptr = malloc(size);
- if (ptr) {
- malloc_info_t * info = (malloc_info_t *)_lv_ll_ins_tail(&malloc_ll);
- info->ptr = ptr;
- }
- return ptr;
-}
-
-static void * my_lv_mem_realloc(void * ptr, size_t new_size) {
- void * new_ptr = realloc(ptr, new_size);
- if (new_ptr && new_ptr != ptr) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- if (info->ptr == ptr) {
- info->ptr = new_ptr;
- break;
- }
- }
+void add_node(linked_list_t* list, void* ptr) {
+ if(list && ptr){
+ node_t* new_node = (node_t*)malloc(sizeof(node_t));
+ if(new_node) {
+ new_node->ptr = ptr;
+ new_node->next = list->head;
+ list->head = new_node;
}
- return new_ptr;
+ }
}
-static void my_lv_mem_free(void * ptr) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- if (info->ptr == ptr) {
- _lv_ll_remove(&malloc_ll, info);
- return;
- }
+void remove_node(linked_list_t* list, void* ptr) {
+ if(list && ptr){
+ node_t* temp = list->head;
+ node_t* prev = NULL;
+
+ if (temp != NULL && temp->ptr == ptr) {
+ list->head = temp->next;
+ if(temp->ptr) {
+ free(temp->ptr);
+ }
+ free(temp);
+ temp = NULL;
+ return;
+ }
+
+ while (temp != NULL && temp->ptr != ptr) {
+ prev = temp;
+ temp = temp->next;
+ }
+
+ if (temp == NULL) return;
+ if(temp->ptr) {
+ free(temp->ptr);
+ }
+
+
+ prev->next = temp->next;
+ free(temp);
+ temp = NULL;
+ }
+}
+
+
+void remove_node1(linked_list_t* list, void* ptr) {
+ if(list && ptr){
+ node_t* temp = list->head;
+ node_t* prev = NULL;
+
+ if (temp != NULL && temp->ptr == ptr) {
+ list->head = temp->next;
+ free(temp);
+ temp = NULL;
+ return;
+ }
+
+ while (temp != NULL && temp->ptr != ptr) {
+ prev = temp;
+ temp = temp->next;
+ }
+
+ if (temp == NULL) return;
+
+ prev->next = temp->next;
+ free(temp);
+ temp = NULL;
}
- free(ptr);
}
-void my_lodpng_lv_free_all(void) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- free(info->ptr);
+void lvlg_my_free_all() {
+ if(lvgl_my_malloc_linklist) {
+ node_t* current = lvgl_my_malloc_linklist->head;
+ node_t* next;
+ while (current != NULL) {
+ next = current->next;
+ if(current->ptr)
+ free(current->ptr); // 释放节点所指向的内存
+ if(current)
+ free(current); // 释放节点本身
+ current = next;
}
- _lv_ll_clear(&malloc_ll);
+
+ lvgl_my_malloc_linklist->head = NULL; // 将链表头设置为 NULL
+ // free(lvgl_my_malloc_linklist); // 释放链表本身
+ // lvgl_my_malloc_linklist = NULL;
+ }
}
+void* lvgl_my_malloc(size_t size){
+ if(lvgl_my_malloc_linklist == NULL) {
+ lvgl_my_malloc_linklist = create_list();
+ }
+ void* ret = malloc(size);
+ if(ret) {
+ add_node(lvgl_my_malloc_linklist, ret);
+ }
+ return ret;
+}
+
+void* lvgl_my_realloc(void* ptr, size_t new_size) {
+ void* new_ptr = realloc(ptr, new_size);
+ if (new_ptr) {
+ remove_node1(lvgl_my_malloc_linklist, ptr); // 删除旧的节点
+ add_node(lvgl_my_malloc_linklist, new_ptr); // 添加一个新的节点
+ }
+ return new_ptr;
+}
+void lvgl_my_free(void* ptr) {
+ if(ptr) {
+ remove_node(lvgl_my_malloc_linklist, ptr);
+ ptr = NULL;
+ }
+
+}
+/*------------------------------------end----------------------------------------*/
void* lodepng_malloc(size_t size) {
- return my_lv_mem_alloc(size);
+ return lvgl_my_malloc(size);
}
void* lodepng_realloc(void* ptr, size_t new_size) {
- return my_lv_mem_realloc(ptr, new_size);
+ return lvgl_my_realloc(ptr, new_size);
}
void lodepng_free(void* ptr) {
- if(ptr)
- my_lv_mem_free(ptr);
+ if(ptr) {
+ lvgl_my_free(ptr);
+ ptr = NULL;
+ }
+
}
+
#endif /*LODEPNG_COMPILE_ALLOCATORS*/
/* convince the compiler to inline a function, for use when this measurably improves performance */
#include <stdlib.h>
#include "lv_ll.h"
-typedef struct {
- void * ptr;
-} malloc_info_t;
+extern void* lvgl_my_malloc(size_t size);
+extern void* lvgl_my_realloc(void* ptr, size_t new_size);
+extern void lvgl_my_free(void* ptr);
-static lv_ll_t malloc_ll;
-static char is_first = 1;
-
-static void my_mem_init(void) {
- _lv_ll_init(&malloc_ll, sizeof(malloc_info_t));
-}
-
-static void * my_lv_mem_alloc(size_t size) {
- if(is_first) {
- is_first = 0;
- my_mem_init();
- }
- void * ptr = malloc(size);
- if (ptr) {
- malloc_info_t * info = (malloc_info_t *)_lv_ll_ins_tail(&malloc_ll);
- info->ptr = ptr;
- }
- return ptr;
-}
-
-static void * my_lv_mem_realloc(void * ptr, size_t new_size) {
- void * new_ptr = realloc(ptr, new_size);
- if (new_ptr && new_ptr != ptr) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- if (info->ptr == ptr) {
- info->ptr = new_ptr;
- break;
- }
- }
- }
- return new_ptr;
-}
-
-static void my_lv_mem_free(void * ptr) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- if (info->ptr == ptr) {
- _lv_ll_remove(&malloc_ll, info);
- return;
- }
- }
- free(ptr);
-}
-
-void my_png_lv_free_all(void) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- free(info->ptr);
- }
- _lv_ll_clear(&malloc_ll);
-}
#undef lv_mem_alloc
-#define lv_mem_alloc my_lv_mem_alloc
+#define lv_mem_alloc lvgl_my_malloc
#undef lv_mem_realloc
-#define lv_mem_realloc my_lv_mem_realloc
+#define lv_mem_realloc lvgl_my_realloc
static void png_free(void *ptr)
{
if(ptr) {
- my_lv_mem_free(ptr);
+ lvgl_my_free(ptr);
ptr = NULL;
}
}
+
#undef lv_mem_free
#define lv_mem_free png_free
**********************/
#include <stdlib.h>
-
-typedef struct {
- void * ptr;
-} malloc_info_t;
-
-static lv_ll_t malloc_ll;
-static char is_first = 1;
-
-static void my_mem_init(void) {
- _lv_ll_init(&malloc_ll, sizeof(malloc_info_t));
-}
-
-static void * my_lv_mem_alloc(size_t size) {
- if(is_first) {
- is_first = 0;
- my_mem_init();
- }
- void * ptr = malloc(size);
- if (ptr) {
- malloc_info_t * info = (malloc_info_t *)_lv_ll_ins_tail(&malloc_ll);
- info->ptr = ptr;
- }
- return ptr;
-}
-
-static void * my_lv_mem_realloc(void * ptr, size_t new_size) {
- void * new_ptr = realloc(ptr, new_size);
- if (new_ptr && new_ptr != ptr) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- if (info->ptr == ptr) {
- info->ptr = new_ptr;
- break;
- }
- }
- }
- return new_ptr;
-}
-
-static void my_lv_mem_free(void * ptr) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- if (info->ptr == ptr) {
- _lv_ll_remove(&malloc_ll, info);
- return;
- }
- }
- free(ptr);
-}
-
-void my_sjpg_lv_free_all(void) {
- malloc_info_t * info;
- _LV_LL_READ(&malloc_ll, info) {
- free(info->ptr);
- }
- _lv_ll_clear(&malloc_ll);
-}
+extern void* lvgl_my_malloc(size_t size);
+extern void* lvgl_my_realloc(void* ptr, size_t new_size);
+extern void lvgl_my_free(void* ptr);
#undef lv_mem_alloc
-#define lv_mem_alloc my_lv_mem_alloc
+#define lv_mem_alloc lvgl_my_malloc
#undef lv_mem_realloc
-#define lv_mem_realloc my_lv_mem_realloc
+#define lv_mem_realloc lvgl_my_realloc
static void png_free(void *ptr)
{
if(ptr) {
- my_lv_mem_free(ptr);
+ lvgl_my_free(ptr);
ptr = NULL;
}
}