Changeset: d53b6b9713c5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d53b6b9713c5
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_scenario.c
        sql/common/sql_mem.c
        sql/common/sql_stack.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_var.c
Branch: default
Log Message:

fixed lots of leaks. (for now we keep old malloc/cleanup functions for the 
variable stack, as mal and gdk
still require this)


diffs (truncated from 466 to 300 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -440,6 +440,7 @@ create_table_from_emit(Client cntxt, cha
                return msg;
 
        /* for some reason we don't have an allocator here, so make one */
+       assert(!sql->sa);
        if (!(sql->sa = sa_create(sql->pa))) {
                msg = sql_error(sql, 02, SQLSTATE(HY013) "CREATE TABLE: %s", 
MAL_MALLOC_FAIL);
                goto cleanup;
@@ -526,6 +527,7 @@ append_to_table_from_emit(Client cntxt, 
                return msg;
 
        /* for some reason we don't have an allocator here, so make one */
+       assert(!sql->sa);
        if (!(sql->sa = sa_create(sql->pa))) {
                msg = sql_error(sql, 02, SQLSTATE(HY013) "APPEND TABLE: %s", 
MAL_MALLOC_FAIL);
                goto cleanup;
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -291,6 +291,7 @@ SQLresetClient(Client c)
        if (c->sqlcontext == NULL)
                throw(SQL, "SQLexitClient", SQLSTATE(42000) "MVC catalogue not 
available");
        if (c->sqlcontext) {
+               sql_allocator *pa = NULL;
                backend *be = c->sqlcontext;
                mvc *m = be->mvc;
 
@@ -305,11 +306,13 @@ SQLresetClient(Client c)
                res_tables_destroy(be->results);
                be->results = NULL;
 
+               pa = m->pa;
                mvc_destroy(m);
                backend_destroy(be);
                c->state[MAL_SCENARIO_OPTIMIZE] = NULL;
                c->state[MAL_SCENARIO_PARSER] = NULL;
                c->sqlcontext = NULL;
+               sa_destroy(pa);
        }
        c->state[MAL_SCENARIO_READER] = NULL;
        if (other && !msg)
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
@@ -35,24 +35,26 @@ sql_ref_dec(sql_ref *r)
 
 sql_allocator *sa_create(sql_allocator *pa)
 {
-       sql_allocator *sa = MNEW(sql_allocator);
-       if (sa == NULL) {
+       sql_allocator *sa = (pa)?SA_NEW(pa, sql_allocator):MNEW(sql_allocator);
+       if (sa == NULL)
                return NULL;
-       }
        eb_init(&sa->eb);
        sa->pa = pa;
        sa->size = 64;
        sa->nr = 1;
-       sa->blks = NEW_ARRAY(char*,sa->size);
+       sa->blks = pa?SA_NEW_ARRAY(pa, char*, sa->size):NEW_ARRAY(char*, 
sa->size);
        if (sa->blks == NULL) {
-               _DELETE(sa);
+               if (!pa)
+                       _DELETE(sa);
                return NULL;
        }
-       sa->blks[0] = NEW_ARRAY(char,SA_BLOCK);
+       sa->blks[0] = pa?SA_NEW_ARRAY(pa, char, SA_BLOCK):NEW_ARRAY(char, 
SA_BLOCK);
        sa->usedmem = SA_BLOCK;
        if (sa->blks[0] == NULL) {
-               _DELETE(sa->blks);
-               _DELETE(sa);
+               if (!pa)
+                       _DELETE(sa->blks);
+               if (!pa)
+                       _DELETE(sa);
                return NULL;
        }
        sa->used = 0;
@@ -64,7 +66,8 @@ sql_allocator *sa_reset( sql_allocator *
        size_t i ;
 
        for (i = 1; i<sa->nr; i++) {
-               _DELETE(sa->blks[i]);
+               if (!sa->pa)
+                       _DELETE(sa->blks[i]);
        }
        sa->nr = 1;
        sa->used = 0;
@@ -89,7 +92,10 @@ void *sa_alloc( sql_allocator *sa, size_
        char *r;
        sz = round16(sz);
        if (sz > (SA_BLOCK-sa->used)) {
-               r = GDKmalloc(sz > SA_BLOCK ? sz : SA_BLOCK);
+               if (sa->pa)
+                       r = SA_NEW_ARRAY(sa->pa,char,(sz > SA_BLOCK ? sz : 
SA_BLOCK));
+           else
+                       r = GDKmalloc(sz > SA_BLOCK ? sz : SA_BLOCK);
                if (r == NULL) {
                        if (sa->eb.enabled)
                                eb_error(&sa->eb, "out of memory", 1000);
@@ -97,8 +103,12 @@ void *sa_alloc( sql_allocator *sa, size_
                }
                if (sa->nr >= sa->size) {
                        char **tmp;
+                       size_t osz = sa->size;
                        sa->size *=2;
-                       tmp = RENEW_ARRAY(char*,sa->blks,sa->size);
+                       if (sa->pa)
+                               tmp = SA_RENEW_ARRAY(sa->pa, char*, sa->blks, 
sa->size, osz);
+                       else
+                               tmp = RENEW_ARRAY(char*, sa->blks, sa->size);
                        if (tmp == NULL) {
                                sa->size /= 2; /* undo */
                                if (sa->eb.enabled)
@@ -137,9 +147,10 @@ void *sa_zalloc( sql_allocator *sa, size
 
 void sa_destroy( sql_allocator *sa )
 {
-       size_t i ;
+       if (sa->pa)
+               return;
 
-       for (i = 0; i<sa->nr; i++) {
+       for (size_t i = 0; i<sa->nr; i++) {
                GDKfree(sa->blks[i]);
        }
        GDKfree(sa->blks);
diff --git a/sql/common/sql_stack.c b/sql/common/sql_stack.c
--- a/sql/common/sql_stack.c
+++ b/sql/common/sql_stack.c
@@ -12,6 +12,7 @@
 sql_stack *
 sql_stack_new(sql_allocator *sa, int size)
 {
+       assert(sa);
        sql_stack *s = SA_NEW(sa, sql_stack);
        if (s == NULL)
                return NULL;
@@ -22,7 +23,7 @@ sql_stack_new(sql_allocator *sa, int siz
                .values = SA_NEW_ARRAY(sa, void*, size),
        };
        if (s->values == NULL) {
-               _DELETE(s);
+               //_DELETE(s);
                return NULL;
        }
        return s;
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -115,6 +115,7 @@ mvc_fix_depend(mvc *m, sql_column *depid
        }
 }
 
+static sql_allocator *store_allocator = NULL;
 int
 mvc_init(sql_allocator *pa, int debug, store_type store, int ro, int su)
 {
@@ -124,6 +125,7 @@ mvc_init(sql_allocator *pa, int debug, s
        mvc *m;
        str msg;
 
+       store_allocator = pa;
        TRC_DEBUG(SQL_TRANS, "Initialization\n");
        keyword_init();
        if(scanner_init_keywords() != 0) {
@@ -389,6 +391,7 @@ mvc_exit(void)
        TRC_DEBUG(SQL_TRANS, "MVC exit\n");
        store_exit();
        keyword_exit();
+       sa_destroy(store_allocator);
 }
 
 void
@@ -807,6 +810,7 @@ mvc_create(sql_allocator *pa, int client
        }
        if (init_global_variables(m) < 0) {
                qc_destroy(m->qc);
+               list_destroy(m->global_vars);
                return NULL;
        }
        m->sym = NULL;
@@ -828,6 +832,7 @@ mvc_create(sql_allocator *pa, int client
        store_unlock();
        if (!m->session) {
                qc_destroy(m->qc);
+               list_destroy(m->global_vars);
                return NULL;
        }
 
@@ -911,6 +916,7 @@ mvc_destroy(mvc *m)
        sql_session_destroy(m->session);
        store_unlock();
 
+       list_destroy(m->global_vars);
        stack_pop_until(m, 0);
 
        if (m->scanner.log) /* close and destroy stream */
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -145,8 +145,11 @@ typedef struct mvc {
 } mvc;
 
 extern sql_table *mvc_init_create_view(mvc *sql, sql_schema *s, const char 
*name, const char *query);
+
+/* should return structure */
 extern int mvc_init(sql_allocator *pa, int debug, store_type store, int ro, 
int su);
 extern void mvc_exit(void);
+
 extern void mvc_logmanager(void);
 extern void mvc_idlemanager(void);
 
diff --git a/sql/server/sql_var.c b/sql/server/sql_var.c
--- a/sql/server/sql_var.c
+++ b/sql/server/sql_var.c
@@ -22,6 +22,9 @@ destroy_sql_var(void *data)
        sql_var *svar = (sql_var*) data;
        VALclear(&(svar->var.data));
        svar->var.data.vtype = 0;
+       _DELETE(svar->sname);
+       _DELETE(svar->name);
+       _DELETE(svar);
 }
 
 #define SQLglobal(sname, name, val) \
@@ -85,14 +88,17 @@ init_global_variables(mvc *sql)
 sql_var*
 push_global_var(mvc *sql, const char *sname, const char *name, sql_subtype 
*type)
 {
-       sql_var *svar = SA_ZNEW(sql->pa, sql_var);
+       sql_var *svar = ZNEW(sql_var);
 
        if (!svar)
                return NULL;
-       if (!(svar->name = sa_strdup(sql->pa, name))) {
+       if (!(svar->name = _STRDUP(name))) {
+               _DELETE(svar);
                return NULL;
        }
-       if (!(svar->sname = sa_strdup(sql->pa, sname))) {
+       if (!(svar->sname = _STRDUP(sname))) {
+               _DELETE(svar->name);
+               _DELETE(svar);
                return NULL;
        }
        atom_init(&(svar->var));
@@ -102,6 +108,9 @@ push_global_var(mvc *sql, const char *sn
                svar->var.tpe = *type;
        }
        if (!list_append(sql->global_vars, svar)) {
+               _DELETE(svar->name);
+               _DELETE(svar->sname);
+               _DELETE(svar);
                return NULL;
        }
        return svar;
@@ -112,11 +121,12 @@ frame_push_var(mvc *sql, const char *nam
 {
        assert(sql->topframes > 0);
        sql_frame *f = sql->frames[sql->topframes - 1];
-       sql_var *svar = SA_ZNEW(sql->pa, sql_var);
+       sql_var *svar = ZNEW(sql_var);
 
        if (!svar)
                return NULL;
-       if (!(svar->name = sa_strdup(sql->pa, name))) {
+       if (!(svar->name = _STRDUP(name))) {
+               _DELETE(svar);
                return NULL;
        }
        atom_init(&(svar->var));
@@ -126,29 +136,44 @@ frame_push_var(mvc *sql, const char *nam
                svar->var.tpe = *type;
        }
        if (!f->vars && !(f->vars = list_create(destroy_sql_var))) {
+               _DELETE(svar->name);
+               _DELETE(svar);
                return NULL;
        }
        if (!list_append(f->vars, svar)) {
+               _DELETE(svar->name);
+               _DELETE(svar);
                return NULL;
        }
        return svar;
 }
 
+static void
+destroy_sql_local_table(void *data)
+{
+       sql_local_table *slt = (sql_local_table*) data;
+       _DELETE(slt);
+}
+
 sql_local_table*
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to