Bläddra i källkod

refactor: 重构了内存管理器

撤销了afMemory动态库
SongZihuan 3 år sedan
förälder
incheckning
c85ba4114b

+ 5 - 0
CMakeLists.txt

@@ -9,6 +9,10 @@ SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH})
 
 SET(BUILD_SHARED_LIBS TRUE)  # 默认编译动态库
 
+IF(Build_Memory)
+    ADD_DEFINITIONS(-DBUILD_MEM=1)
+ENDIF()
+
 IF(MSVC)
     SET(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
     MESSAGE("Build with MSVC")
@@ -42,6 +46,7 @@ ADD_SUBDIRECTORY(src)
 IF(ENABLE_aFunTEST)
     ENABLE_TESTING()
     ADD_SUBDIRECTORY(test)
+    MESSAGE("Enable Test Success!")
 ENDIF()
 
 INSTALL(TARGETS aFun)

+ 12 - 33
include/mem.h

@@ -6,40 +6,19 @@
 #ifndef MEM__H
 #define MEM__H
 
-#include "stdlib.h"
+#if BUILD_MEM
+#include <stdlib.h>
 
-// 开关
-#define BUILD_VTMEM 1
+static void *safeCalloc(size_t n, size_t size);
+static void *safeCalloc(size_t n, size_t size) {
+    void *re = calloc(n, size);
+    if (re == NULL)
+        exit(1);
+    return re;
+}
 
-// 默认情况
-#define safeCalloc(n, size) (calloc((n), (size)))
-#define safeFree(p) ((((p)!=NULL) ? (free(p), NULL) : NULL), (p)=NULL)
-#define print_memInfo() NULL
-#define safeFree_ free
-
-#if BUILD_VTMEM
-#undef safeCalloc
-
-void *safeCalloc(size_t n, size_t size);
-
-#if DEBUG_VTMEM
-#undef safeFree
-#undef safeFree_
-#undef print_memInfo
-
-void safeFreeDebug(void *p);
-int print_memInfo();
-
-#define safeFree safeFreeDebug
-#define safeFree_ safeFreeDebug
-#else
-
-#undef safeFree_
-void safeFree_(void *p);
-
-#endif  // DEBUG_VTMEM
-#elif DEBUG_VTMEM
-#error "The option \"debug afmem\" can be turned on only when the option \"build afmem\" is turned on"
-#endif  // BUILD_VTMEM
+#define calloc(n, size) (safeCalloc(n, size))
+#define free(p) ((((p)!=NULL) ? (free(p), NULL) : NULL), (p)=NULL)
 
+#endif
 #endif  // MEM__H

+ 3 - 3
include/tool.h

@@ -29,8 +29,8 @@ time33_t w_time33(wchar_t *str);
 // string 工具
 #define EQ_STR(str1, str2) (!strcmp((str1), (str2)))
 #define EQ_WSTR(wid1, wid2) (!wcscmp((wid1), (wid2)))
-#define NEW_STR(size) (char *)safeCalloc((size) + 1, sizeof(char))
-#define NEW_WSTR(size) (wchar_t *)safeCalloc((size) + 1, sizeof(wchar_t))
+#define NEW_STR(size) (char *)calloc((size) + 1, sizeof(char))
+#define NEW_WSTR(size) (wchar_t *)calloc((size) + 1, sizeof(wchar_t))
 #define STR_LEN(p) (((p) == NULL) ? 0 : strlen((p)))
 #define WSTR_LEN(p) (((p) == NULL) ? 0 : wcslen((p)))
 char *strCopy(const char *str);
@@ -121,6 +121,6 @@ struct DlcSymbol_ *copySymbol_(struct DlcSymbol_ *ds);
 struct DlcSymbol_ *getSymbol_(struct DlcHandle *dlc, const char *name);
 void freeSymbol_(struct DlcSymbol_ *symbol);
 bool freeLibary(struct DlcHandle *dlc);
-void dlcExit();
+void dlcExit(void);
 
 #endif //TOOL__H

+ 1 - 2
src/CMakeLists.txt

@@ -3,11 +3,10 @@
     ADD_SUBDIRECTORY(dlfcn)
 ENDIF()
 
-ADD_SUBDIRECTORY(memory)
 ADD_SUBDIRECTORY(tool)
 ADD_SUBDIRECTORY(cjson)
 
-SET(libary af_memory af_tool af_json)
+SET(libary af_tool af_json)
 
 ADD_EXECUTABLE(aFun main.c)
 TARGET_LINK_LIBRARIES(aFun ${libary})

+ 1 - 1
src/cjson/CMakeLists.txt

@@ -5,6 +5,6 @@ ADD_LIBRARY(cJson cJSON.c)
 PROJECT(af_json LANGUAGES C)
 ADD_LIBRARY(af_json tool.c)
 SET_TARGET_PROPERTIES(af_json PROPERTIES OUTPUT_NAME "aFunJson")
-TARGET_LINK_LIBRARIES(af_json af_memory af_tool cJson)
+TARGET_LINK_LIBRARIES(af_json af_tool cJson)
 
 INSTALL(TARGETS af_json cJson)

+ 3 - 3
src/cjson/tool.c

@@ -8,11 +8,11 @@
 #endif
 
 static void *safeMalloc(size_t size) {
-    return safeCalloc(1, size);
+    return calloc(1, size);
 }
 
 void cJsonInit() {
-    static cJSON_Hooks hooks = {.malloc_fn=safeMalloc, .free_fn=safeFree_};
+    static cJSON_Hooks hooks = {.malloc_fn=safeMalloc, .free_fn=free};
     cJSON_InitHooks(&hooks);
 }
 
@@ -29,6 +29,6 @@ cJSON *parseJsonFile(FILE *file) {
     }
 
     re = cJSON_Parse(tmp);
-    safeFree_(tmp);
+    free(tmp);
     return re;
 }

+ 0 - 6
src/memory/CMakeLists.txt

@@ -1,6 +0,0 @@
-PROJECT(af_memory LANGUAGES C)
-
-ADD_LIBRARY(af_memory ${af_memory_SOURCE_DIR}/mem.c)
-SET_TARGET_PROPERTIES(af_memory PROPERTIES OUTPUT_NAME "aFunMemory")
-
-INSTALL(TARGETS af_memory)

+ 0 - 63
src/memory/mem.c

@@ -1,63 +0,0 @@
-/*
- * 文件名: mem.c
- * 目标: 内存管理
- * 对应头文件: mem.h
- * 由宏 BUILD_VTMEM 和宏 DEBUG_VTMEM 联合控制行为
- * BUILD_VTMEM 开启时启用该组件, 关闭时safeCalloc等函数与原生的calloc相同
- * DEBUG_VTMEM 开启时会自动统计申请成功的内存总量和释放的内存总量。
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include "mem.h"
-
-#if BUILD_VTMEM
-#if DEBUG_VTMEM
-#include <stdio.h>
-static unsigned long long used_mem = 0;  // 已经使用的内存
-
-struct afmem_block {
-    size_t size;
-};
-
-void safeFreeDebug(void *p) {
-    if (p == NULL)
-        return;
-    p -= sizeof(struct afmem_block);  // 往回偏移, 得到malloc函数分配的真实指针
-    used_mem -= ((struct afmem_block *)p)->size;
-    free(p);  // 偏移
-}
-
-void *safeCalloc(size_t n, size_t size) {
-    size_t r_size = n * size + sizeof(struct afmem_block);
-    void *re = malloc(r_size);
-    if (re == NULL)
-        exit(1);
-    used_mem += n * size;
-    memset(re, 0, r_size);  // 清空为0, 用malloc模拟calloc的行为
-    ((struct afmem_block *)re)->size = n * size;  // 记录大小
-    return (char *)re + sizeof(struct afmem_block);  // 偏移
-}
-
-int print_memInfo() {
-    return printf("used_mem = %llu\n", used_mem);
-}
-
-#else
-// 无 void safeFree_(void *p);
-// 无 print_memInfo();
-
-void *safeCalloc(size_t n, size_t size) {
-    void *re = calloc(n, size);
-    if (re == NULL)
-        exit(1);
-    return re;
-}
-
-void safeFree_(void *p) {
-    if (p != NULL)
-        free(p);
-}
-
-#endif
-#endif

+ 1 - 1
src/tool/CMakeLists.txt

@@ -4,6 +4,6 @@ AUX_SOURCE_DIRECTORY(${af_tool_SOURCE_DIR} src)  # 寻找源文件
 ADD_LIBRARY(af_tool ${src})
 
 SET_TARGET_PROPERTIES(af_tool PROPERTIES OUTPUT_NAME "aFunTool")
-TARGET_LINK_LIBRARIES(af_tool af_memory dl)
+TARGET_LINK_LIBRARIES(af_tool dl)
 
 INSTALL(TARGETS af_tool)

+ 8 - 11
src/tool/dlc.c

@@ -21,10 +21,7 @@ struct DlcHandle {
 static struct DlcHandle *dlc_l = NULL;
 static int gc_count = 0;
 
-#include <stdio.h>
-
 struct DlcHandle *openLibary(const char *file, int mode) {
-    printf("file = %s\n", file);
     void *handle = dlopen(file, mode);
     struct DlcHandle *dlc;
 
@@ -39,7 +36,7 @@ struct DlcHandle *openLibary(const char *file, int mode) {
         }
     }
 
-    dlc = safeCalloc(1, sizeof(struct DlcHandle));
+    dlc = calloc(1, sizeof(struct DlcHandle));
     dlc->handle = handle;
 
     dlc->count = 1;
@@ -73,12 +70,12 @@ static bool freeLibary_(struct DlcHandle *dlc, bool f) {
     if (dlc->next != NULL)
         dlc->next->last = dlc->last;
 
-    safeFree_(dlc);
+    free(dlc);
     return true;
 }
 
 struct DlcSymbol_ *makeSymbol_(void *symbol) {
-    struct DlcSymbol_ *ds = safeCalloc(1, sizeof(struct DlcSymbol_));
+    struct DlcSymbol_ *ds = calloc(1, sizeof(struct DlcSymbol_));
     ds->symbol = symbol;
     ds->dlc = NULL;
     return ds;
@@ -96,7 +93,7 @@ struct DlcSymbol_ *copySymbol_(struct DlcSymbol_ *ds) {
     if (ds == NULL)
         return NULL;
 
-    struct DlcSymbol_ *new = safeCalloc(1, sizeof(struct DlcSymbol_));
+    struct DlcSymbol_ *new = calloc(1, sizeof(struct DlcSymbol_));
     new->symbol = ds->symbol;
     if (ds->dlc != NULL)
         blindSymbol(new, ds->dlc);
@@ -108,13 +105,13 @@ struct DlcSymbol_ *getSymbol_(struct DlcHandle *dlc, const char *name) {
     if (symbol == NULL)
         return NULL;
 
-    struct DlcSymbol_ *ds = safeCalloc(1, sizeof(struct DlcSymbol_));
+    struct DlcSymbol_ *ds = calloc(1, sizeof(struct DlcSymbol_));
     ds->symbol = symbol;
     blindSymbol(ds, dlc);
     return ds;
 }
 
-void dlcGC() {
+void dlcGC(void) {
     for (struct DlcHandle *tmp = dlc_l, *next; tmp != NULL; tmp = next) {
         next = tmp->next;
         if (tmp->link == 0 && tmp->count == 0)
@@ -128,13 +125,13 @@ void freeSymbol_(struct DlcSymbol_ *symbol) {
         gc_count++;
     }
 
-    safeFree_(symbol);
+    free(symbol);
 
     if (gc_count >= GC_SZIE)
         dlcGC();
 }
 
-void dlcExit() {
+void dlcExit(void) {
     while (dlc_l != NULL)
         freeLibary_(dlc_l, true);
 }

+ 1 - 1
src/tool/file.c

@@ -56,7 +56,7 @@ char *getFileName(char *path_1){
         *point = NUL;
 
     name = strCopy(slash);
-    safeFree_(path);
+    free(path);
 
     if (!isalpha(*name) && *name != '_')
         name = strJoin("_", name, false, true);

+ 14 - 14
src/tool/string.c

@@ -39,7 +39,7 @@ wchar_t *wstrWithWchar(wchar_t *str, size_t size, int free_old, ...) {  // free_
         tmp[base_len + i] = (wchar_t)va_arg(va, int);
     va_end(va);
     if (free_old)
-        safeFree_(str);
+        free(str);
     return tmp;
 }
 
@@ -54,7 +54,7 @@ wchar_t *wstrWithWchar_(wchar_t *str, wint_t new, bool free_old) {
         wcscpy(tmp, str);
     tmp[base_len] = new;
     if (free_old)
-        safeFree_(str);
+        free(str);
     return tmp;
 }
 
@@ -68,7 +68,7 @@ wchar_t *wstrExpansion(wchar_t *str, size_t size, bool free_old) {
     if (base_len != 0)
         wcscpy(tmp, str);
     if (free_old)
-        safeFree_(str);
+        free(str);
     return tmp;
 }
 
@@ -107,9 +107,9 @@ char *strJoin(char *first, char *second, bool free_first, bool free_last) {
         strcat(new, second);
 
     if (free_first)
-        safeFree_(first);
+        free(first);
     if (free_last)
-        safeFree_(second);
+        free(second);
     return new;
 }
 
@@ -123,9 +123,9 @@ char *strJoin_(char *first, char *second, bool free_first, bool free_last) {
     if (second != NULL)
         strcat(new, second);
     if (free_first)
-        safeFree_(first);
+        free(first);
     if (free_last)
-        safeFree_(second);
+        free(second);
     return new;
 }
 
@@ -148,9 +148,9 @@ wchar_t *wstrJoin(wchar_t *first, wchar_t *second, bool free_first, bool free_la
         wcscat(new, second);
 
     if (free_first)
-        safeFree_(first);
+        free(first);
     if (free_last)
-        safeFree_(second);
+        free(second);
     return new;
 }
 
@@ -164,9 +164,9 @@ wchar_t *wstrJoin_(wchar_t *first, wchar_t *second, bool free_first, bool free_l
         wcscat(new, second);
 
     if (free_first)
-        safeFree_(first);
+        free(first);
     if (free_last)
-        safeFree_(second);
+        free(second);
     return new;
 }
 
@@ -185,7 +185,7 @@ wchar_t *wstrCopySelf(wchar_t *str, long times){
     for (long i=0; i < times; i++)
         new_str = wstrJoin_(new_str, str, true, false);
     if (need_free)
-        safeFree_(str);
+        free(str);
     return new_str;
 }
 
@@ -210,7 +210,7 @@ wchar_t *convertToWstr(char *str, bool free_old) {
     wchar_t *tmp = NEW_WSTR(len);
     mbstowcs(tmp, str, len);
     if (free_old)
-        safeFree_(str);
+        free(str);
     return tmp;
 }
 
@@ -223,6 +223,6 @@ char *convertToStr(wchar_t *wstr, bool free_old) {
     char *tmp = NEW_STR(len);
     wcstombs(tmp, wstr, len);
     if (free_old)
-        safeFree_(wstr);
+        free(wstr);
     return tmp;
 }

+ 1 - 1
test/CMakeLists.txt

@@ -5,7 +5,7 @@ SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
 
 FUNCTION(ADD_aFunTest TEST_NAME TEST_SOURCE)
     ADD_EXECUTABLE(aFunTest_${TEST_NAME} ${TEST_SOURCE})
-    TARGET_LINK_LIBRARIES(aFunTest_${TEST_NAME} af_memory af_tool af_json)
+    TARGET_LINK_LIBRARIES(aFunTest_${TEST_NAME} af_tool af_json)
     ADD_TEST(NAME aFunTest_${TEST_NAME} COMMAND $<TARGET_FILE:aFunTest_${TEST_NAME}>)
 ENDFUNCTION()
 

+ 4 - 4
test/test_mem.c

@@ -1,12 +1,12 @@
 #include "mem.h"
 
 int main() {
-    int *p = safeCalloc(1, sizeof(int));
+    int *p = calloc(1, sizeof(int));
     *p = 10;
-    safeFree(p);
+    free(p);
 
-    p = safeCalloc(1, sizeof(int));
+    p = calloc(1, sizeof(int));
     *p = 10;
-    safeFree_(p);
+    free(p);
     return 0;
 }