Changeset: e4d2071d06af for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e4d2071d06af
Modified Files:
sql/common/sql_mem.c
sql/include/sql_mem.h
Branch: default
Log Message:
add v1 off hierarchical alloctor cleanup.
diffs (140 lines):
diff --git a/sql/common/sql_mem.c b/sql/common/sql_mem.c
--- a/sql/common/sql_mem.c
+++ b/sql/common/sql_mem.c
@@ -9,6 +9,8 @@
#include "monetdb_config.h"
#include "sql_mem.h"
+#define SA_BLOCK (64*1024)
+
sql_ref *
sql_ref_init(sql_ref *r)
{
@@ -30,10 +32,59 @@ sql_ref_dec(sql_ref *r)
return (--r->refcnt);
}
+typedef struct freed_t {
+ struct freed_t *n;
+ size_t sz;
+} freed_t;
-#define SA_BLOCK (64*1024)
+static void
+sa_destroy_freelist( freed_t *f )
+{
+ while(f) {
+ freed_t *n = f->n;
+ GDKfree(f);
+ f = n;
+ }
+}
+
+static void
+sa_free(sql_allocator *pa, void *blk)
+{
+ assert(!pa->pa);
+ size_t i;
-sql_allocator *sa_create(sql_allocator *pa)
+ for(i = 0; i < pa->nr; i++) {
+ if (pa->blks[i] == blk)
+ break;
+ }
+ assert (i < pa->nr);
+ for (; i < pa->nr-1; i++)
+ pa->blks[i] = pa->blks[i+1];
+ pa->nr--;
+
+ size_t sz = GDKmallocated(blk);
+ if (sz > (SA_BLOCK + 32)) {
+ _DELETE(blk);
+ } else {
+ freed_t *f = blk;
+ f->n = pa->freelist;
+
+ pa->freelist = f;
+ }
+}
+
+static void *
+sa_use_freed(sql_allocator *pa, size_t sz)
+{
+ (void)sz;
+
+ freed_t *f = pa->freelist;
+ pa->freelist = f->n;
+ return f;
+}
+
+sql_allocator *
+sa_create(sql_allocator *pa)
{
sql_allocator *sa = (pa)?SA_NEW(pa, sql_allocator):MNEW(sql_allocator);
if (sa == NULL)
@@ -43,6 +94,7 @@ sql_allocator *sa_create(sql_allocator *
sa->size = 64;
sa->nr = 1;
sa->blks = pa?SA_NEW_ARRAY(pa, char*, sa->size):NEW_ARRAY(char*,
sa->size);
+ sa->freelist = NULL;
if (sa->blks == NULL) {
if (!pa)
_DELETE(sa);
@@ -68,6 +120,8 @@ sql_allocator *sa_reset( sql_allocator *
for (i = 1; i<sa->nr; i++) {
if (!sa->pa)
_DELETE(sa->blks[i]);
+ else
+ sa_free(sa->pa, sa->blks[i]);
}
sa->nr = 1;
sa->used = 0;
@@ -77,7 +131,8 @@ sql_allocator *sa_reset( sql_allocator *
#undef sa_realloc
#undef sa_alloc
-void *sa_realloc( sql_allocator *sa, void *p, size_t sz, size_t oldsz )
+void *
+sa_realloc( sql_allocator *sa, void *p, size_t sz, size_t oldsz )
{
void *r = sa_alloc(sa, sz);
@@ -87,14 +142,17 @@ void *sa_realloc( sql_allocator *sa, voi
}
#define round16(sz) ((sz+15)&~15)
-void *sa_alloc( sql_allocator *sa, size_t sz )
+void *
+sa_alloc( sql_allocator *sa, size_t sz )
{
char *r;
sz = round16(sz);
if (sz > (SA_BLOCK-sa->used)) {
if (sa->pa)
r = SA_NEW_ARRAY(sa->pa,char,(sz > SA_BLOCK ? sz :
SA_BLOCK));
- else
+ else if (sz <= SA_BLOCK && sa->freelist) {
+ r = sa_use_freed(sa, sz > SA_BLOCK ? sz : SA_BLOCK);
+ } else
r = GDKmalloc(sz > SA_BLOCK ? sz : SA_BLOCK);
if (r == NULL) {
if (sa->eb.enabled)
@@ -152,6 +210,7 @@ void sa_destroy( sql_allocator *sa )
if (sa->pa)
return;
+ sa_destroy_freelist(sa->freelist);
for (size_t i = 0; i<sa->nr; i++) {
GDKfree(sa->blks[i]);
}
diff --git a/sql/include/sql_mem.h b/sql/include/sql_mem.h
--- a/sql/include/sql_mem.h
+++ b/sql/include/sql_mem.h
@@ -50,6 +50,7 @@ typedef struct sql_allocator {
char **blks;
size_t used; /* memory used in last block */
size_t usedmem; /* used memory */
+ void *freelist; /* list of freed blocks */
exception_buffer eb;
} sql_allocator;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list