From fc40342711fa6e1a0444669b388d78a9cba12c21 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Tue, 20 Aug 2013 17:02:45 +0100 Subject: [PATCH] added new memory management to the most fragile part in this matter...the class system...well, the server test gives me a memory corruption, but all other are running now....anyway most likely this is in an unusable state right now. --- src/class/interface/i_class.c | 12 ++++++--- src/logger/interface/i_logger.c | 19 +++++++++++++- src/utils/memory.c | 46 +++++++++++++++------------------ tests/Makefile.am | 2 +- 4 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/class/interface/i_class.c b/src/class/interface/i_class.c index 0113902..196363d 100644 --- a/src/class/interface/i_class.c +++ b/src/class/interface/i_class.c @@ -27,6 +27,9 @@ #include "class/class.h" #include "class/interface/class.h" +#include "utils/memory.h" + + const struct interface i_Class = { "class", @@ -36,7 +39,7 @@ struct interface i_Class = { void * classNew(class_ptr class, ...) { - void * object = calloc(1, class->object_size + sizeof(void*)); + void * object = memCalloc(1, class->object_size + sizeof(void*)); va_list params; int ret; @@ -58,9 +61,12 @@ void classDelete(void ** object) { if (NULL != *object) { + void * mem; + CALL(*object, Class, dtor); - free(*object - sizeof(void*)); + mem = *object - sizeof(void*); + MEM_FREE(mem); *object = NULL; } } @@ -69,7 +75,7 @@ void * classClone(void * _object) { class_ptr class = GET_CLASS(_object); - void * object = calloc(1, class->object_size + sizeof(void*)); + void * object = memCalloc(1, class->object_size + sizeof(void*)); * (class_ptr *)object = class; object += sizeof(void*); diff --git a/src/logger/interface/i_logger.c b/src/logger/interface/i_logger.c index e1019bc..b1f6158 100644 --- a/src/logger/interface/i_logger.c +++ b/src/logger/interface/i_logger.c @@ -53,7 +53,24 @@ loggerLog(void * _object, logger_level level, const char * const fmt, ...) { vsnprintf(msg, msg_size + 1, fmt, params); va_end(params); - CALL(_object, Logger, log, level, msg); + // ----- DEBUG ------ + do { + struct i_Logger * iface; + + do { + class_ptr class = GET_CLASS(_object); + iface = (struct i_Logger *)IFACE_GET(class, &i_Logger); + while ((NULL == iface || NULL == iface->log) && HAS_PARENT(class)) { + class = class->parent; + iface = (struct i_Logger *)IFACE_GET(class, &i_Logger); + } + assert(NULL != iface->log); + } while(0); + + iface->log(_object, level, msg); + } while(0); + // ----- DEBUG ------ + //CALL(_object, Logger, log, level, msg); MEM_FREE(msg); } diff --git a/src/utils/memory.c b/src/utils/memory.c index a110461..64f34f4 100644 --- a/src/utils/memory.c +++ b/src/utils/memory.c @@ -42,6 +42,7 @@ */ #include +#include #define _GNU_SOURCE #include @@ -108,56 +109,51 @@ segmentFree(void * segment) void * memMalloc(size_t size) { - struct memSegment * seg = tfind(&size, &segments, segmentFindCmp); + struct memSegment ** seg_ptr = tfind(&size, &segments, segmentFindCmp); + struct memSegment * seg; - if (NULL == seg) { + if (NULL == seg_ptr) { seg = (struct memSegment *)malloc(sizeof(struct memSegment) + size); seg->size = size; - seg->ptr = seg + sizeof(struct memSegment); + seg->ptr = (void *)seg + sizeof(struct memSegment); } else { + seg = *seg_ptr; // remove the found one from the tree as we use it now. tdelete((void *)seg, &segments, segmentSearchCmp); - seg = *(struct memSegment **)seg; } return seg->ptr; } /** - * we do NOT ensure that the memory region is zeroed - * because we want the best performance. - * Most times this is not neccessary at all. + * this is a really memory wasting solution....just to be able to + * use calloc, which might be faster then malloc/memset solution. + * + * Maybe this is a bad idea, as we need to memset the buffer anyway + * if it comes from our tree, which hopefully should be the majority + * of cases. */ void * memCalloc(size_t nmemb, size_t size) { - size_t _size = nmemb * size; - size_t _inmemb = (sizeof(struct memSegment) / size) + 1; - struct memSegment * seg = tfind(&_size, &segments, segmentFindCmp); + size_t _size = nmemb * size; + void * mem = memMalloc(_size); + struct memSegment * seg = + (struct memSegment *)(mem - sizeof(struct memSegment)); - if (NULL == seg) { - seg = (struct memSegment *)calloc(nmemb + _inmemb, size); - seg->size = size; - seg->ptr = seg + sizeof(struct memSegment); - } else { - // remove the found one from the tree as we use it now. - tdelete((void *)seg, &segments, segmentSearchCmp); - seg = *(struct memSegment **)seg; - } + printf("DEBUG %zu : %zu\n", _size, seg->size); - return seg->ptr; + memset(mem, 0, _size); + + return mem; } void memFree(void ** mem) { if (NULL != *mem) { - struct memSegment * seg = *(struct memSegment **)mem; - - seg -= sizeof(struct memSegment); - - tsearch((void *)seg, &segments, segmentSearchCmp); + void * foo = tsearch(*mem - sizeof(struct memSegment), &segments, segmentSearchCmp); *mem = NULL; } } diff --git a/tests/Makefile.am b/tests/Makefile.am index 5902f03..18d5cca 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -8,6 +8,7 @@ COMMON = runtest.c CLASS = $(COMMON) \ ../src/class/interface.c \ ../src/class/interface/i_class.c \ + ../src/utils/memory.c \ mock/mock_class.c LOGGER = $(CLASS) \ @@ -15,7 +16,6 @@ LOGGER = $(CLASS) \ ../src/logger/stderr.c \ ../src/logger/syslog.c \ ../src/logger/interface/i_logger.c \ - ../src/utils/memory.c \ mock/mock_logger.c SOCKET = $(LOGGER) \