1#ifndef MALLOC_IMPL_H 2#define MALLOC_IMPL_H 3 4#include <sys/mman.h> 5#ifdef __LITEOS_DEBUG__ 6#include <stdbool.h> 7 8#define BACKTRACE_DEPTH_MAX 5 /* The max depth of backtrace */ 9#define BACKTRACE_START_OFFSET 0 /* The start offset of backtrace */ 10#define SECONDARY_CALL_OFFSET 2 /* The backtrace offset for secondary call backtrace() */ 11#define BACKTRACE_OFFSET (BACKTRACE_START_OFFSET + SECONDARY_CALL_OFFSET) 12#define PREFIX_PLACE_HOLDER 10 /* Reserve positions for file name prefix "pid()_" */ 13#define PTHREAD_NUM_MAX 128 /* Same as number of task of kernel */ 14#define NODE_MAGIC 0xFCFCFCFC /* Magic number for node of chunk */ 15#define FREE_MAGIC 0xFE /* Magic number for filling freed heap memory not recycled to heap pool */ 16#define RECYCLE_MAX 128 /* The queue size for free() to recycle */ 17#define RECYCLE_SIZE_MAX 0x300000 /* The max sum size of freed chunk for recycle list */ 18#define ITEM_BUFFER_SIZE 256 /* The buffer max size for one item of memory debug info */ 19#define CHECK_POINT_TRACE_MAX 2 /* The trace max for check point */ 20 21hidden void *__expand_heap(size_t *); 22 23hidden void __malloc_donate(char *, char *); 24 25hidden void *__memalign(size_t, size_t); 26#else 27#include "dynlink.h" 28#endif 29 30struct chunk { 31#ifdef __LITEOS_DEBUG__ 32 unsigned int checksum; 33#endif 34 size_t psize, csize; 35 struct chunk *next, *prev; 36}; 37 38struct bin { 39#ifdef __LITEOS_DEBUG__ 40 unsigned int checksum; 41#endif 42 volatile int lock[2]; 43 struct chunk *head; 44 struct chunk *tail; 45}; 46 47#ifdef __LITEOS_DEBUG__ 48struct heap_block { 49 struct heap_block *next; 50 struct heap_block *prev; 51}; 52 53struct list { 54 struct list *prev; 55 struct list *next; 56}; 57 58struct node { 59 short tid, pid; 60 void *ptr; 61 size_t size; 62 void *lr[BACKTRACE_DEPTH_MAX]; 63 struct list list; 64}; 65 66struct stat_bin { 67 volatile int lock[2]; 68 struct list head; 69 size_t t_total_size; 70}; 71 72#define ROUNDUP(a, b) (((a) + ((b) - 1)) & ~((b) - 1)) 73#define SIZE_ALIGN ROUNDUP(sizeof(struct chunk), 0x10) 74#define SIZE_MASK (-SIZE_ALIGN) 75#define OVERHEAD (sizeof(struct chunk)) 76#define BLOCK_HEAD (sizeof(struct heap_block) + OVERHEAD) 77#define CHUNK_BLOCK_OFFSET (sizeof(struct heap_block)) 78#define CHUNK_TO_BLOCK(c) (struct heap_block *)((char *)(c) - CHUNK_BLOCK_OFFSET) 79#define BLOCK_TO_CHUNK(p) (struct chunk *)((char *)(p) + CHUNK_BLOCK_OFFSET) 80#define MMAP_THRESHOLD (0x1c00*(4*sizeof(size_t))) 81#define DONTCARE SIZE_ALIGN 82#else 83#define SIZE_ALIGN (4*sizeof(size_t)) 84#define SIZE_MASK (-SIZE_ALIGN) 85#define OVERHEAD (2*sizeof(size_t)) 86#define MMAP_THRESHOLD (0x1c00*SIZE_ALIGN) 87#define DONTCARE 16 88#endif 89#define RECLAIM 163840 90 91#define CHUNK_SIZE(c) ((c)->csize & -2) 92#define CHUNK_PSIZE(c) ((c)->psize & -2) 93#define PREV_CHUNK(c) ((struct chunk *)((char *)(c) - CHUNK_PSIZE(c))) 94#define NEXT_CHUNK(c) ((struct chunk *)((char *)(c) + CHUNK_SIZE(c))) 95#define MEM_TO_CHUNK(p) (struct chunk *)((char *)(p) - OVERHEAD) 96#define CHUNK_TO_MEM(c) (void *)((char *)(c) + OVERHEAD) 97#ifdef __LITEOS_DEBUG__ 98#define BIN_TO_CHUNK(i) (&mal.bins[i].checksum) 99#else 100#define BIN_TO_CHUNK(i) (MEM_TO_CHUNK(&mal.bins[i].head)) 101#endif 102 103#define C_INUSE ((size_t)1) 104 105#define IS_MMAPPED(c) !((c)->csize & (C_INUSE)) 106 107hidden void __bin_chunk(struct chunk *); 108 109#ifdef __LITEOS_DEBUG__ 110hidden extern int __malloc_replaced; 111 112hidden extern bool g_enable_check; 113hidden extern int g_recycle_num; 114hidden extern size_t g_recycle_size; 115hidden extern int g_mem_lock[]; 116hidden extern void insert_node(void *ptr, size_t size); 117hidden extern int delete_node(void *ptr); 118hidden extern void insert_block_list(struct chunk *ptr); 119hidden extern void insert_free_tail(struct chunk *self); 120hidden extern struct chunk *get_free_head(void); 121hidden extern void get_free_trace(void *ptr); 122hidden extern void clean_recycle_list(bool clean_all); 123hidden extern void check_chunk_integrity(struct chunk *cur); 124hidden extern void calculate_checksum(struct chunk *cur, struct chunk *next); 125#endif 126#endif 127