swmem.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /************************************************************************
  2. * AUTHOR: NiuJiuRu
  3. * FILENAME: swmem.h
  4. * DESCRIPTION: 可分块/可跟踪内存泄漏位置的内存管理
  5. * NOTE:
  6. * HISTORY:
  7. * 1, [2010-09-06] created by NiuJiuRu
  8. * 2, [2013-05-30] modified by NiuJiuRu, 优化"sw_mem_alloc()"函数, 提高
  9. 内存分配的速度
  10. ***********************************************************************/
  11. #ifndef __SWMEM_H__
  12. #define __SWMEM_H__
  13. #ifdef __cplusplus
  14. extern "C"
  15. {
  16. #endif
  17. ////////////////////////////////////////////////////////////////
  18. // 基本内存函数
  19. /* 内存使用情况检查回调函数 */
  20. typedef void (*PMemCheckCallback)(const char *filename, int line, const char *ptr, int size, void *lpParameter);
  21. /* 创建内存管理模块, align = 1, 2, 4, 8, 16, ... */
  22. void *sw_mem_create(char *buf, int size, int align);
  23. /* 销毁内存管理模块 */
  24. void sw_mem_destroy(void *hMem);
  25. /* 复位内存管理模块 */
  26. void sw_mem_reset(void *hMem);
  27. /* 检查内存节点, 并返回历史上最大消耗过的内存数 */
  28. int sw_mem_check(const void *hMem, PMemCheckCallback proc, void *lpParameter);
  29. /* 获得总的内存大小 */
  30. int sw_mem_getTotalSize(const void *hMem);
  31. /* 分配内存 */
  32. void *sw_mem_alloc(void *hMem, int size, const char *filename, int line);
  33. /* 分配内存并初始化为"0x00" */
  34. void *sw_mem_calloc(void *hMem, int size, const char *filename, int line);
  35. /* 复制字符串 */
  36. char *sw_mem_strdup(void *hMem, const char *str, const char *filename, int line);
  37. /* 重新申请内存 */
  38. void *sw_mem_realloc(void *hMem, void *ptr, int size, const char *filename, int line);
  39. /* 释放内存 */
  40. void sw_mem_free(void *hMem, void *ptr, const char *filename, int line);
  41. ////////////////////////////////////////////////////////////////
  42. // 扩展内存函数-全局堆
  43. /* 内存管理模块的全局堆 */
  44. extern void *g_hSwHeap;
  45. /* 初试化内存管理模块的全局堆, align = 1, 2, 4, 8, 16, ... */
  46. bool sw_heap_init(char *buf, int size, int align);
  47. /* 释放内存管理模块的全局堆 */
  48. void sw_heap_exit();
  49. /* 检查全局堆的内存使用情况, 并返回历史上最大消耗过的内存数 */
  50. int sw_heap_check(PMemCheckCallback proc, void *lpParameter);
  51. /* 获得全局堆总的内存大小 */
  52. int sw_heap_getTotalSize();
  53. // 申请内存, 如果初试化了内存管理模块的全局堆, 则使用堆内空间和自定义的分配操作, 否则等同于系统的"malloc()"函数
  54. #define sw_heap_malloc(size) (g_hSwHeap ? sw_mem_alloc(g_hSwHeap, (size), __FILE__, __LINE__) : malloc((size)))
  55. // 申请内存并全部初始化为"0x00", 如果初试化了内存管理模块的全局堆, 则使用堆内空间和自定义的分配操作, 否则等同于系统的"calloc()"函数
  56. #define sw_heap_calloc(size) (g_hSwHeap ? sw_mem_calloc(g_hSwHeap, (size), __FILE__, __LINE__) : calloc((size), 1))
  57. // 复制字符串, 如果初试化了内存管理模块的全局堆, 则使用堆内空间和自定义的复制操作, 否则等同于系统的"strdup()"函数
  58. #define sw_heap_strdup(str) (g_hSwHeap ? sw_mem_strdup(g_hSwHeap, (str), __FILE__, __LINE__) : strdup((str)))
  59. // 重新分配内存, 如果初试化了内存管理模块的全局堆, 则使用堆内空间和自定义的重新分配操作, 否则等同于系统的"realloc()"函数
  60. #define sw_heap_realloc(ptr, size) (g_hSwHeap ? sw_mem_realloc(g_hSwHeap, (ptr), (size), __FILE__, __LINE__) : realloc((ptr), (size)))
  61. // 释放内存, 如果初试化了内存管理模块的全局堆, 则使用堆内空间和自定义的释放操作, 否则等同于系统的"free()"函数
  62. #define sw_heap_free(ptr) (g_hSwHeap ? sw_mem_free(g_hSwHeap, (ptr), __FILE__, __LINE__) : free((ptr)))
  63. ////////////////////////////////////////////////////////////////
  64. // 扩展内存函数-栈(先进后出)
  65. // 定义栈数据结构
  66. typedef void (*PStackDataFreeCallback)(void *addr, int size); // 栈数据内存释放回调函数
  67. struct stk_data
  68. {
  69. long addr;
  70. int size;
  71. PStackDataFreeCallback freeFun;
  72. unsigned long wParam; // 附加参数1(可选)
  73. unsigned long lParam; // 附加参数2(可选)
  74. };
  75. // 创建一个栈, "hMem"为空时在系统内存中创建, "hMem"不为空时在给定的内存中创建
  76. void *sw_stack_create(void *hMem);
  77. // 数据压栈
  78. bool sw_stack_push(void *hStack, struct stk_data data);
  79. // 数据弹出栈
  80. // 注意: 如果只弹出数据而不接收结果("result"为空时), 弹出过程中将会自动调用数据压栈时设定的内存释放回调函数
  81. void sw_stack_pop(void *hStack, struct stk_data *result);
  82. // 得到一个栈内当前的数据元个数
  83. int sw_stack_getDataElementsCnt(const void *hStack);
  84. // 销毁一个栈, 并在销毁过程中自动调用数据压栈时设定的内存释放回调函数
  85. void sw_stack_destroy(void *hStack);
  86. #ifdef __cplusplus
  87. }
  88. #endif
  89. #endif /*__SWMEM_H__*/