luat_lvgl_mem.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "luat_base.h"
  2. #include "luat_mem.h"
  3. #define LUAT_LOG_TAG "lv_mem"
  4. #include "luat_log.h"
  5. typedef struct lv_mem_block {
  6. uint8_t magic;
  7. uint8_t ZERO;
  8. uint16_t size;
  9. uint8_t ptr[4];
  10. }lv_mem_block_t;
  11. void* luat_lvgl_malloc(int len) {
  12. if (len == 0)
  13. return NULL;
  14. lv_mem_block_t *block = luat_heap_malloc(len + 4);
  15. if (block == NULL)
  16. return NULL;
  17. block->magic = 0xAA;
  18. block->ZERO = 0;
  19. block->size = len;
  20. return block->ptr;
  21. }
  22. void* luat_lvgl_free(void* ptr) {
  23. if (ptr == NULL)
  24. return NULL;
  25. lv_mem_block_t *block = (lv_mem_block_t *)(((uint8_t*)ptr) - 4);
  26. if (block->magic == 0xAA && block->ZERO == 0) {
  27. luat_heap_free((void*)block);
  28. }
  29. else {
  30. LLOGW("bad lv_mem_block %p %d %d", block, block->magic, block->ZERO);
  31. }
  32. return NULL;
  33. }
  34. void* luat_lvgl_realloc(void* ptr, int _new) {
  35. if (_new == 0) {
  36. luat_lvgl_free(ptr);
  37. return NULL;
  38. }
  39. lv_mem_block_t *block = (lv_mem_block_t *)(((uint8_t*)ptr) - 4);
  40. if (block->magic == 0xAA && block->ZERO == 0) {
  41. lv_mem_block_t * tmp = luat_heap_realloc((void*)block, _new);
  42. if (tmp == NULL) {
  43. return NULL;
  44. }
  45. tmp->size = _new;
  46. return tmp->ptr;
  47. }
  48. else {
  49. LLOGW("bad lv_mem_block %p %d %d", block, block->magic, block->ZERO);
  50. return NULL;
  51. }
  52. }
  53. int luat_lvgl_mem_get_size(void* ptr) {
  54. if (ptr == NULL)
  55. return 0;
  56. lv_mem_block_t *block = (lv_mem_block_t *)(((uint8_t*)ptr) - 4);
  57. if (block->magic == 0xAA && block->ZERO == 0) {
  58. return block->size;
  59. }
  60. else {
  61. LLOGW("bad lv_mem_block %p %d %d", block, block->magic, block->ZERO);
  62. return 64; // 很危险
  63. }
  64. }