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