Browse Source

first version of Quick Fit memory management

release0.1.5
Georg Hopp 13 years ago
parent
commit
add2a19904
  1. 13
      include/utils/memory.h
  2. 35
      src/utils/memory.c

13
include/utils/memory.h

@ -25,7 +25,18 @@
#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)))
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 ffree(void **);

35
src/utils/memory.c

@ -42,16 +42,13 @@
*/
#include <stdlib.h>
#define _GNU_SOURCE
#include <search.h>
#include "utils/memory.h"
struct memSegment {
size_t size;
void * ptr;
};
void ** segments = NULL;
void * segments = NULL;
/**
* this will interpret any memory segment that is not smaller
@ -95,11 +92,18 @@ segmentSearchCmp(const void * search, const void * subject)
return idx;
}
static
void
segmentFree(void * segment)
{
free(segment);
}
struct memSegment *
memMalloc(size_t size)
{
struct memSegment * seg = tfind(&size, segments, segmentFindCmp);
struct memSegment * seg = tfind(&size, &segments, segmentFindCmp);
if (NULL == seg) {
seg = (struct memSegment *)malloc(sizeof(struct memSegment) + size);
@ -107,8 +111,9 @@ memMalloc(size_t size)
seg->size = size;
seg->ptr = seg + sizeof(struct memSegment);
} else {
// remove the found one from the tree.
tdelete((void *)seg, segments, segmentSearchCmp);
// remove the found one from the tree as we use it now.
tdelete((void *)seg, &segments, segmentSearchCmp);
seg = *(struct memSegment **)seg;
}
return seg;
@ -125,6 +130,20 @@ memCalloc(size_t nmemb, size_t size)
return memMalloc(nmemb * size);
}
void
memFree(struct memSegment ** seg)
{
if (NULL != *seg) {
tsearch((void *)*seg, &segments, segmentSearchCmp);
*seg = NULL;
}
}
void
memCleanup()
{
tdestroy(segments, segmentFree);
}
void
ffree(void ** data)

Loading…
Cancel
Save