diff --git a/include/cbuf.h b/include/cbuf.h index 12f1da8..dd3fd87 100644 --- a/include/cbuf.h +++ b/include/cbuf.h @@ -44,7 +44,6 @@ CLASS(Cbuf) { - struct memSegment * shm_name_seg; char * shm_name; // shared memory identifier char * data; diff --git a/include/utils/memory.h b/include/utils/memory.h index 1cc1dcd..6d886e5 100644 --- a/include/utils/memory.h +++ b/include/utils/memory.h @@ -26,17 +26,13 @@ #define CSTRA(val) val, sizeof(val)-1 //!< Const STRing Argument #define FREE(val) (ffree((void**)&(val))) -#define MEM_FREE(seg) (memFree((struct memSegment **)&(seg))) +#define MEM_FREE(seg) (memFree((void **)&(seg))) -struct memSegment { - size_t size; - void * ptr; -}; -struct memSegment * memMalloc(size_t); -struct memSegment * memCalloc(size_t, size_t); -void memFree(struct memSegment **); -void memCleanup(); +void * memMalloc(size_t); +void * memCalloc(size_t, size_t); +void memFree(void **); +void memCleanup(); void ffree(void **); diff --git a/src/cbuf/cbuf.c b/src/cbuf/cbuf.c index dfed914..a2b6e1c 100644 --- a/src/cbuf/cbuf.c +++ b/src/cbuf/cbuf.c @@ -53,8 +53,7 @@ cbufCtor(void * _this, va_list * params) int shm; char * data; - this->shm_name_seg = memMalloc(strlen(shm_name) + 7 + 2); - this->shm_name = this->shm_name_seg->ptr; + this->shm_name = memMalloc(strlen(shm_name) + 7 + 2); sprintf(this->shm_name, "/%06d_%s", getpid(), shm_name); /** @@ -111,7 +110,7 @@ cbufDtor(void * _this) { Cbuf this = _this; - MEM_FREE(this->shm_name_seg); + MEM_FREE(this->shm_name); if (NULL != this->data && MAP_FAILED != this->data) { munmap(this->data, this->bsize << 1); diff --git a/src/logger/interface/i_logger.c b/src/logger/interface/i_logger.c index 188ec78..e1019bc 100644 --- a/src/logger/interface/i_logger.c +++ b/src/logger/interface/i_logger.c @@ -39,9 +39,9 @@ loggerLog(void * _object, logger_level level, const char * const fmt, ...) { Logger object = _object; if (level >= object->min_level) { - struct memSegment * msg = NULL; - size_t msg_size = 0; - va_list params; + char * msg = NULL; + size_t msg_size = 0; + va_list params; va_start(params, fmt); msg_size = vsnprintf(NULL, msg_size, fmt, params); @@ -50,10 +50,10 @@ loggerLog(void * _object, logger_level level, const char * const fmt, ...) { msg = memMalloc(msg_size + 1); va_start(params, fmt); - vsnprintf(msg->ptr, msg_size + 1, fmt, params); + vsnprintf(msg, msg_size + 1, fmt, params); va_end(params); - CALL(_object, Logger, log, level, msg->ptr); + CALL(_object, Logger, log, level, msg); MEM_FREE(msg); } diff --git a/src/utils/memory.c b/src/utils/memory.c index dda9651..a110461 100644 --- a/src/utils/memory.c +++ b/src/utils/memory.c @@ -47,6 +47,11 @@ #include "utils/memory.h" +struct memSegment { + size_t size; + void * ptr; +}; + void * segments = NULL; @@ -100,7 +105,7 @@ segmentFree(void * segment) } -struct memSegment * +void * memMalloc(size_t size) { struct memSegment * seg = tfind(&size, &segments, segmentFindCmp); @@ -116,7 +121,7 @@ memMalloc(size_t size) seg = *(struct memSegment **)seg; } - return seg; + return seg->ptr; } /** @@ -124,18 +129,36 @@ memMalloc(size_t size) * because we want the best performance. * Most times this is not neccessary at all. */ -struct memSegment * +void * memCalloc(size_t nmemb, size_t size) { - return memMalloc(nmemb * size); + size_t _size = nmemb * size; + size_t _inmemb = (sizeof(struct memSegment) / size) + 1; + struct memSegment * seg = tfind(&_size, &segments, segmentFindCmp); + + 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; + } + + return seg->ptr; } void -memFree(struct memSegment ** seg) +memFree(void ** mem) { - if (NULL != *seg) { - tsearch((void *)*seg, &segments, segmentSearchCmp); - *seg = NULL; + if (NULL != *mem) { + struct memSegment * seg = *(struct memSegment **)mem; + + seg -= sizeof(struct memSegment); + + tsearch((void *)seg, &segments, segmentSearchCmp); + *mem = NULL; } }