Changeset: 614dc6d74aeb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/614dc6d74aeb
Modified Files:
gdk/gdk.h
gdk/gdk_utils.c
monetdb5/mal/mal_instruction.c
Branch: resource_management
Log Message:
store size infront of each slot
diffs (truncated from 320 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -625,7 +625,7 @@ gdk_export char *sa_strconcat( allocator
gdk_export size_t sa_size( allocator *sa );
gdk_export void sa_open( allocator *sa ); /* open new frame of tempory
allocations */
gdk_export void sa_close( allocator *sa ); /* close temporary frame, reset to
old state */
-gdk_export void sa_free( allocator *sa, void *, size_t sz);
+gdk_export void sa_free( allocator *sa, void *);
#define ma_create(pa) sa_create(pa)
#define ma_destroy(ma) sa_destroy(ma)
@@ -633,6 +633,7 @@ gdk_export void sa_free( allocator *sa,
#define ma_zalloc(ma, sz) (void*)sa_zalloc(ma, sz)
#define ma_open(ma) sa_open(ma)
#define ma_close(ma) sa_close(ma)
+#define ma_free(ma, obj) sa_free(ma, obj)
#define MA_NEW( sa, type ) ((type*)sa_alloc( sa,
sizeof(type)))
#define MA_ZNEW( sa, type ) ((type*)sa_zalloc( sa,
sizeof(type)))
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2051,6 +2051,7 @@ GDKprintinfo(void)
printf("SIGUSR1 info end\n");
}
+
exception_buffer *
eb_init(exception_buffer *eb)
{
@@ -2077,6 +2078,7 @@ eb_error( exception_buffer *eb, char *ms
#define SA_NUM_BLOCKS 64
#define SA_BLOCK_SIZE (64*1024)
+#define SA_HEADER_SIZE 2*(sizeof(size_t))
typedef struct freed_t {
struct freed_t *n;
@@ -2097,7 +2099,6 @@ static void
sa_free_obj(allocator *pa, void *obj, size_t sz)
{
assert(sz > 0);
- assert(!pa->pa); // must be root allocator
size_t i;
char *obj_start = (char *) obj;
@@ -2123,6 +2124,9 @@ sa_free_obj(allocator *pa, void *obj, si
static void
sa_free_blk(allocator *pa, void *blk)
{
+ // free blks are maintained on the root allocator
+ if (pa->pa)
+ return sa_free_blk(pa->pa, blk);
assert(!pa->pa); // must be root allocator
size_t i;
@@ -2142,29 +2146,23 @@ sa_free_blk(allocator *pa, void *blk)
freed_t *f = blk;
f->n = pa->freelist_blks;
f->sz = sz;
-
pa->freelist_blks = f;
}
}
/*
- * Returns first that match size
+ * Return first slot that will fit the size
*/
static void *
sa_use_freed_obj(allocator *pa, size_t sz)
{
- if (pa->pa)
- return sa_use_freed_obj(pa->pa, sz);
freed_t *prev = NULL;
freed_t *curr = pa->freelist;
- // size_t objects = pa->objects;
- // size_t inuse = pa->inuse;
- // size_t nr_free_objects = objects - inuse;
int MAX_ITERATIONS = 100;
int cntr = 0;
- while(curr && (cntr <= MAX_ITERATIONS)) {
- if (sz == curr->sz) {
+ while(curr && (cntr < MAX_ITERATIONS)) {
+ if (sz <= curr->sz) {
if (prev) {
prev->n = curr->n;
} else {
@@ -2206,41 +2204,6 @@ sa_use_freed(allocator *pa, size_t sz)
return NULL;
}
-allocator *
-sa_create(allocator *pa)
-{
- allocator *sa = (pa)?(allocator*)sa_alloc(pa,
sizeof(allocator)):(allocator*)GDKmalloc(sizeof(allocator));
- if (sa == NULL)
- return NULL;
- eb_init(&sa->eb);
- sa->pa = pa;
- sa->size = SA_NUM_BLOCKS;
- sa->nr = 1;
- sa->blks = pa?(char**)sa_alloc(pa, sizeof(char*) *
sa->size):(char**)GDKmalloc(sizeof(char*) * sa->size);
- if (sa->blks == NULL) {
- if (!pa)
- GDKfree(sa);
- return NULL;
- }
- sa->blks[0] = pa?(char*)sa_alloc(pa,
SA_BLOCK_SIZE):(char*)GDKmalloc(SA_BLOCK_SIZE);
- sa->usedmem = SA_BLOCK_SIZE;
- if (sa->blks[0] == NULL) {
- if (!pa)
- GDKfree(sa->blks);
- if (!pa)
- GDKfree(sa);
- return NULL;
- }
- sa->freelist = NULL;
- sa->freelist_blks = NULL;
- sa->used = 0;
- sa->objects = 0;
- sa->inuse = 0;
- sa->freelist_hits = 0;
- sa->tmp_active = 0;
- sa->tmp_used = 0;
- return sa;
-}
allocator *sa_reset( allocator *sa )
{
@@ -2252,8 +2215,8 @@ allocator *sa_reset( allocator *sa )
else
sa_free_blk(sa->pa, sa->blks[i]);
}
- if (!sa->pa)
- sa->freelist_blks = NULL;
+ //if (!sa->pa)
+ sa->freelist_blks = NULL;
sa->nr = 1;
sa->used = 0;
sa->freelist = NULL;
@@ -2263,6 +2226,19 @@ allocator *sa_reset( allocator *sa )
return sa;
}
+static void * _sa_alloc_internal(allocator* sa, size_t sz);
+
+static void *
+_sa_realloc_internal( allocator *sa, void *p, size_t sz, size_t oldsz )
+{
+ void *r = _sa_alloc_internal(sa, sz);
+
+ if (r)
+ memmove(r, p, oldsz);
+ return r;
+}
+
+
#undef sa_realloc
#undef sa_alloc
void *
@@ -2277,23 +2253,22 @@ sa_realloc( allocator *sa, void *p, size
#define round16(sz) ((sz+15)&~15)
#define round_block_size(sz) ((sz + (SA_BLOCK_SIZE - 1))&~(SA_BLOCK_SIZE - 1))
-void *
-sa_alloc( allocator *sa, size_t sz )
+static void *
+_sa_alloc_internal( allocator *sa, size_t sz )
{
sz = round16(sz);
- char *r = sa_use_freed(sa, sz);
+ char *r = sa_use_freed(sa, sz - SA_HEADER_SIZE);
if (r)
return r;
/* we don't want super large allocs for temp storage */
//if (sa->tmp_active && sz >= SA_BLOCK_SIZE)
// assert(0);
if (sz > (SA_BLOCK_SIZE - sa->used)) {
+ size_t nsize = (sz > SA_BLOCK_SIZE) ? sz : SA_BLOCK_SIZE;
if (sa->pa)
- r = (char*)sa_alloc(sa->pa, sz > SA_BLOCK_SIZE ?
- sz : SA_BLOCK_SIZE);
+ r = (char*) _sa_alloc_internal(sa->pa, nsize);
else
- r = GDKmalloc(sz > SA_BLOCK_SIZE ?
- sz : SA_BLOCK_SIZE);
+ r = GDKmalloc(nsize);
if (r == NULL) {
if (sa->eb.enabled)
@@ -2305,7 +2280,7 @@ sa_alloc( allocator *sa, size_t sz )
size_t osz = sa->size;
sa->size *=2;
if (sa->pa)
- tmp = (char**)sa_realloc(sa->pa, sa->blks,
sizeof(char*) * sa->size, sizeof(char*) * osz);
+ tmp = (char**)_sa_realloc_internal(sa->pa,
sa->blks, sizeof(char*) * sa->size, sizeof(char*) * osz);
else
tmp = GDKrealloc(sa->blks, sizeof(char*) *
sa->size);
if (tmp == NULL) {
@@ -2319,7 +2294,7 @@ sa_alloc( allocator *sa, size_t sz )
sa->blks = tmp;
}
if (sz > SA_BLOCK_SIZE) {
- // larger block goes infront
+ // move odd size blks behind
sa->blks[sa->nr] = sa->blks[sa->nr-1];
sa->blks[sa->nr-1] = r;
sa->nr ++;
@@ -2339,6 +2314,56 @@ sa_alloc( allocator *sa, size_t sz )
return r;
}
+void *
+sa_alloc( allocator *sa, size_t sz )
+{
+ size_t nsize = round16(sz) + SA_HEADER_SIZE;
+ char* r = (char*) _sa_alloc_internal(sa, nsize);
+ if (r) {
+ // store size in header
+ *((size_t *) r) = nsize - SA_HEADER_SIZE;
+ return r + SA_HEADER_SIZE;
+ }
+ return NULL;
+}
+
+
+allocator *
+sa_create(allocator *pa)
+{
+ allocator *sa = (pa)? (allocator*)_sa_alloc_internal(pa,
sizeof(allocator)) : (allocator*)GDKmalloc(sizeof(allocator));
+ if (sa == NULL)
+ return NULL;
+ sa->size = SA_NUM_BLOCKS;
+ sa->blks = (pa)? (char**)_sa_alloc_internal(pa, sizeof(char*) *
sa->size) : (char**)GDKmalloc(sizeof(char*) * sa->size);
+ if (sa->blks == NULL) {
+ if (!pa)
+ GDKfree(sa);
+ return NULL;
+ }
+ sa->blks[0] = (pa)? (char*)_sa_alloc_internal(pa, SA_BLOCK_SIZE) :
(char*)GDKmalloc(SA_BLOCK_SIZE);
+ if (sa->blks[0] == NULL) {
+ if (!pa) {
+ GDKfree(sa->blks);
+ GDKfree(sa);
+ }
+ return NULL;
+ }
+ eb_init(&sa->eb);
+ sa->pa = pa;
+ sa->nr = 1;
+ sa->usedmem = SA_BLOCK_SIZE;
+ sa->freelist = NULL;
+ sa->freelist_blks = NULL;
+ sa->used = 0;
+ sa->objects = 0;
+ sa->inuse = 0;
+ sa->freelist_hits = 0;
+ sa->tmp_active = 0;
+ sa->tmp_used = 0;
+ return sa;
+}
+
#undef sa_zalloc
void *sa_zalloc( allocator *sa, size_t sz )
{
@@ -2354,7 +2379,6 @@ void sa_destroy( allocator *sa )
if (sa->pa) {
sa_reset(sa);
sa_free_blk(sa->pa, sa->blks[0]);
- // TODO free sa object from parent
sa_free_obj(sa->pa, sa, sizeof(allocator));
return;
}
@@ -2429,12 +2453,15 @@ sa_close( allocator *sa )
}
void
-sa_free(allocator *sa, void *obj, size_t sz)
+sa_free(allocator *sa, void *obj)
{
- sz = round16(sz); // allign size as per sa_alloc
+ if (!obj) return; // nothing to do
+ // retrieve size from header
+ char* ptr = (char *) obj - SA_HEADER_SIZE;
+ size_t sz = *((size_t *) ptr);
if (sz < SA_BLOCK_SIZE) {
sa_free_obj(sa, obj, sz);
} else {
- sa_free_blk(sa, obj);
+ sa_free_blk(sa, ptr);
}
}
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -478,8 +478,8 @@ void
freeInstruction(InstrPtr p)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]