Changeset: f48adc8428aa for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f48adc8428aa
Modified Files:
gdk/gdk.h
gdk/gdk_utils.c
Branch: resource_management
Log Message:
experiment with larger arena sizes
diffs (256 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2574,13 +2574,14 @@ gdk_export _Noreturn void eb_error(excep
typedef struct allocator {
struct allocator *pa;
- size_t size; /* size of the allocator in terms of blocks */
- size_t nr; /* number of blocks allocated */
+ size_t size; /* size of the allocator in terms of blocks */
+ size_t nr; /* number of blocks allocated */
char **blks;
- size_t used; /* memory used in last block */
- size_t usedmem; /* used memory */
- size_t objects; /* number of objects */
- size_t inuse; /* number of objects in use*/
+ size_t used; /* memory used in last block */
+ size_t usedmem; /* total used memory */
+ size_t blk_size; /* size of the last allocated block */
+ size_t objects; /* number of objects */
+ size_t inuse; /* number of objects in use*/
size_t freelist_hits; /* number of object reuse*/
void *freelist; /* list of freed objects */
void *freelist_blks; /* list of freed blks */
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2070,7 +2070,7 @@ eb_error(exception_buffer *eb, const cha
}
#define SA_NUM_BLOCKS 64
-#define SA_BLOCK_SIZE (64*1024)
+#define SA_BLOCK_SIZE (128*1024)
#define SA_HEADER_SIZE 2*(sizeof(size_t))
#define CANARY_VALUE ((size_t)0xDEADBEEFDEADBEEF)
@@ -2104,36 +2104,55 @@ sa_free_obj(allocator *pa, void *obj, si
pa->inuse -= 1;
}
-static void
-sa_free_blk(allocator *pa, void *blk)
-{
- // free blks are maintained on the root allocator
- if (pa->pa) {
- sa_free_blk(pa->pa, blk);
- } else {
- size_t i;
-
- for(i = 0; i < pa->nr; i++) {
- if (pa->blks[i] == blk)
- break;
- }
- assert (i < pa->nr);
-
- size_t sz = GDKmallocated(blk);
- if (sz > (SA_BLOCK_SIZE)) {
- GDKfree(blk);
- for (; i < pa->nr-1; i++)
- pa->blks[i] = pa->blks[i+1];
- pa->nr--;
- } else {
- freed_t *f = blk;
- f->sz = sz;
- f->n = pa->freelist_blks;
- pa->freelist_blks = f;
- }
- }
-}
-
+//static void
+//sa_free_blk(allocator *sa, void *blk)
+//{
+// // blks are maintained on the root allocator
+// if (sa->pa == NULL) {
+// size_t i;
+//
+// for(i = 0; i < sa->nr; i++) {
+// if (sa->blks[i] == blk)
+// break;
+// }
+// assert (i < sa->nr);
+//
+// GDKfree(blk);
+// for (; i < sa->nr-1; i++)
+// sa->blks[i] = sa->blks[i+1];
+// sa->nr--;
+// }
+// // free blks are maintained on the root allocator
+// //if (pa->pa) {
+// // sa_free_blk(pa->pa, blk);
+// //} else {
+// // size_t i;
+//
+// // for(i = 0; i < pa->nr; i++) {
+// // if (pa->blks[i] == blk)
+// // break;
+// // }
+// // assert (i < pa->nr);
+//
+// // // size_t sz = GDKmallocated(blk);
+// // GDKfree(blk);
+// // for (; i < pa->nr-1; i++)
+// // pa->blks[i] = pa->blks[i+1];
+// // pa->nr--;
+// // //if (sz > (SA_BLOCK_SIZE)) {
+// // // GDKfree(blk);
+// // // for (; i < pa->nr-1; i++)
+// // // pa->blks[i] = pa->blks[i+1];
+// // // pa->nr--;
+// // //} else {
+// // // freed_t *f = blk;
+// // // f->sz = sz;
+// // // f->n = pa->freelist_blks;
+// // // pa->freelist_blks = f;
+// // //}
+// //}
+//}
+//
/*
* Return first slot that will fit the size
@@ -2191,19 +2210,21 @@ sa_use_freed(allocator *pa, size_t sz)
allocator *sa_reset(allocator *sa)
{
- size_t i ;
+ size_t i;
for (i = 1; i < sa->nr; i++) {
- if (!sa->pa)
+ if (sa->pa == NULL) {
GDKfree(sa->blks[i]);
- else
- sa_free_blk(sa->pa, sa->blks[i]);
+ }
+ sa->blks[i] = NULL;
}
+
sa->freelist_blks = NULL;
sa->nr = 1;
sa->used = 0;
sa->freelist = NULL;
sa->usedmem = SA_BLOCK_SIZE;
+ sa->blk_size = SA_BLOCK_SIZE;
sa->objects = 0;
sa->inuse = 0;
return sa;
@@ -2243,15 +2264,18 @@ static void *
char *r = sa_use_freed(sa, sz);
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)
+ if (sz > (sa->blk_size - sa->used)) {
+ // out of space need new blk
+ size_t nsize = sa->blk_size;
+ // double the size
+ do {
+ nsize *= 2;
+ } while(sz > nsize);
+ if (sa->pa) {
r = (char*) _sa_alloc_internal(sa->pa, nsize);
- else
+ } else {
r = GDKmalloc(nsize);
+ }
if (r == NULL) {
if (sa->eb.enabled)
@@ -2276,18 +2300,23 @@ static void *
}
sa->blks = tmp;
}
- if (sz > SA_BLOCK_SIZE) {
- // move odd size blks behind
- sa->blks[sa->nr] = sa->blks[sa->nr-1];
- sa->blks[sa->nr-1] = r;
- sa->nr ++;
- sa->usedmem += sz;
- } else {
- sa->blks[sa->nr] = r;
- sa->nr ++;
- sa->used = sz;
- sa->usedmem += SA_BLOCK_SIZE;
- }
+ sa->blk_size = nsize;
+ sa->blks[sa->nr] = r;
+ sa->nr ++;
+ sa->used = sz;
+ sa->usedmem += sa->blk_size;
+ //if (sz > SA_BLOCK_SIZE) {
+ // // move odd size blks behind
+ // sa->blks[sa->nr] = sa->blks[sa->nr-1];
+ // sa->blks[sa->nr-1] = r;
+ // sa->nr ++;
+ // sa->usedmem += sz;
+ //} else {
+ // sa->blks[sa->nr] = r;
+ // sa->nr ++;
+ // sa->used = sz;
+ // sa->usedmem += SA_BLOCK_SIZE;
+ //}
} else {
r = sa->blks[sa->nr-1] + sa->used;
sa->used += sz;
@@ -2339,6 +2368,7 @@ sa_create(allocator *pa)
sa->pa = pa;
sa->nr = 1;
sa->usedmem = SA_BLOCK_SIZE;
+ sa->blk_size = SA_BLOCK_SIZE;
sa->freelist = NULL;
sa->freelist_blks = NULL;
sa->used = 0;
@@ -2364,17 +2394,19 @@ sa_zalloc( allocator *sa, size_t sz )
void
sa_destroy( allocator *sa )
{
- if (sa->pa) {
- sa_reset(sa);
- sa_free_blk(sa->pa, sa->blks[0]);
- return;
+ //if (sa->pa) {
+ // sa_reset(sa);
+ // sa_free_blk(sa->pa, sa->blks[0]);
+ // return;
+ //}
+ if (sa->pa == NULL) {
+ // root allocator
+ for (size_t i = 0; i < sa->nr; i++) {
+ GDKfree(sa->blks[i]);
+ }
+ GDKfree(sa->blks);
+ GDKfree(sa);
}
- // root allocator
- for (size_t i = 0; i<sa->nr; i++) {
- GDKfree(sa->blks[i]);
- }
- GDKfree(sa->blks);
- GDKfree(sa);
}
#undef sa_strndup
@@ -2446,6 +2478,6 @@ sa_free(allocator *sa, void *obj)
if (sz < SA_BLOCK_SIZE) {
sa_free_obj(sa, ptr, sz);
} else {
- sa_free_blk(sa, ptr);
+ // sa_free_blk(sa, ptr);
}
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]