Browse Source

simplified the quick fit interface

release0.1.5
Georg Hopp 12 years ago
parent
commit
8934e864d7
  1. 1
      include/cbuf.h
  2. 12
      include/utils/memory.h
  3. 5
      src/cbuf/cbuf.c
  4. 6
      src/logger/interface/i_logger.c
  5. 39
      src/utils/memory.c

1
include/cbuf.h

@ -44,7 +44,6 @@
CLASS(Cbuf) { CLASS(Cbuf) {
struct memSegment * shm_name_seg;
char * shm_name; // shared memory identifier char * shm_name; // shared memory identifier
char * data; char * data;

12
include/utils/memory.h

@ -26,16 +26,12 @@
#define CSTRA(val) val, sizeof(val)-1 //!< Const STRing Argument #define CSTRA(val) val, sizeof(val)-1 //!< Const STRing Argument
#define FREE(val) (ffree((void**)&(val))) #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 * memMalloc(size_t);
void * memCalloc(size_t, size_t);
void memFree(void **);
void memCleanup(); void memCleanup();
void ffree(void **); void ffree(void **);

5
src/cbuf/cbuf.c

@ -53,8 +53,7 @@ cbufCtor(void * _this, va_list * params)
int shm; int shm;
char * data; 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); sprintf(this->shm_name, "/%06d_%s", getpid(), shm_name);
/** /**
@ -111,7 +110,7 @@ cbufDtor(void * _this)
{ {
Cbuf this = _this; Cbuf this = _this;
MEM_FREE(this->shm_name_seg);
MEM_FREE(this->shm_name);
if (NULL != this->data && MAP_FAILED != this->data) { if (NULL != this->data && MAP_FAILED != this->data) {
munmap(this->data, this->bsize << 1); munmap(this->data, this->bsize << 1);

6
src/logger/interface/i_logger.c

@ -39,7 +39,7 @@ loggerLog(void * _object, logger_level level, const char * const fmt, ...) {
Logger object = _object; Logger object = _object;
if (level >= object->min_level) { if (level >= object->min_level) {
struct memSegment * msg = NULL;
char * msg = NULL;
size_t msg_size = 0; size_t msg_size = 0;
va_list params; va_list params;
@ -50,10 +50,10 @@ loggerLog(void * _object, logger_level level, const char * const fmt, ...) {
msg = memMalloc(msg_size + 1); msg = memMalloc(msg_size + 1);
va_start(params, fmt); va_start(params, fmt);
vsnprintf(msg->ptr, msg_size + 1, fmt, params);
vsnprintf(msg, msg_size + 1, fmt, params);
va_end(params); va_end(params);
CALL(_object, Logger, log, level, msg->ptr);
CALL(_object, Logger, log, level, msg);
MEM_FREE(msg); MEM_FREE(msg);
} }

39
src/utils/memory.c

@ -47,6 +47,11 @@
#include "utils/memory.h" #include "utils/memory.h"
struct memSegment {
size_t size;
void * ptr;
};
void * segments = NULL; void * segments = NULL;
@ -100,7 +105,7 @@ segmentFree(void * segment)
} }
struct memSegment *
void *
memMalloc(size_t size) memMalloc(size_t size)
{ {
struct memSegment * seg = tfind(&size, &segments, segmentFindCmp); struct memSegment * seg = tfind(&size, &segments, segmentFindCmp);
@ -116,7 +121,7 @@ memMalloc(size_t size)
seg = *(struct memSegment **)seg; seg = *(struct memSegment **)seg;
} }
return seg;
return seg->ptr;
} }
/** /**
@ -124,18 +129,36 @@ memMalloc(size_t size)
* because we want the best performance. * because we want the best performance.
* Most times this is not neccessary at all. * Most times this is not neccessary at all.
*/ */
struct memSegment *
void *
memCalloc(size_t nmemb, size_t size) 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 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;
} }
} }

Loading…
Cancel
Save