Changeset: c4b09f11ceb5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c4b09f11ceb5
Modified Files:
monetdb5/mal/mal_client.c
monetdb5/mal/mal_scenario.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_scenario.h
Branch: Dec2016
Log Message:
Plug memory leaks.
- When SQLstatementIntern initializes a SQL client, also reset it.
- When sql.init() is called from MAL, replace the exitclient function
with SQLexitClient so that the SQL client gets cleaned up.
- Free all variables on the client global stack (c->glb) when the
client exits.
diffs (135 lines):
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -385,8 +385,10 @@ freeClient(Client c)
c->username = 0;
}
c->mythread = 0;
- GDKfree(c->glb);
- c->glb = NULL;
+ if (c->glb) {
+ freeStack(c->glb);
+ c->glb = NULL;
+ }
if( c->error_row){
BBPdecref(c->error_row->batCacheid,TRUE);
BBPdecref(c->error_fld->batCacheid,TRUE);
diff --git a/monetdb5/mal/mal_scenario.c b/monetdb5/mal/mal_scenario.c
--- a/monetdb5/mal/mal_scenario.c
+++ b/monetdb5/mal/mal_scenario.c
@@ -402,7 +402,7 @@ setScenario(Client c, str nme)
{
int i;
str msg;
- Scenario scen = scenarioRec;
+ Scenario scen;
scen = findScenario(nme);
if (scen == NULL)
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -399,12 +399,14 @@ SQLstatementIntern(Client c, str *expr,
str msg = MAL_SUCCEED;
backend *be, *sql = (backend *) c->sqlcontext;
size_t len = strlen(*expr);
+ int inited = 0;
#ifdef _SQL_COMPILE
mnstr_printf(c->fdout, "#SQLstatement:%s\n", *expr);
#endif
if (!sql) {
- msg = SQLinitEnvironment(c, NULL, NULL, NULL);
+ inited = 1;
+ msg = SQLinitClient(c);
sql = (backend *) c->sqlcontext;
}
if (msg){
@@ -416,8 +418,11 @@ SQLstatementIntern(Client c, str *expr,
m = sql->mvc;
ac = m->session->auto_commit;
o = MNEW(mvc);
- if (!o)
+ if (!o) {
+ if (inited)
+ SQLresetClient(c);
throw(SQL, "SQLstatement", "Out of memory");
+ }
*o = *m;
/* hide query cache, this causes crashes in SQLtrans() due to
uninitialized memory otherwise */
m->qc = NULL;
@@ -637,6 +642,8 @@ endofcompile:
m->vars = vars;
m->session->status = status;
m->session->auto_commit = ac;
+ if (inited)
+ SQLresetClient(c);
return msg;
}
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
@@ -588,13 +588,8 @@ SQLinitClient(Client c)
}
str
-SQLexitClient(Client c)
+SQLresetClient(Client c)
{
-#ifdef _SQL_SCENARIO_DEBUG
- mnstr_printf(GDKout, "#SQLexitClient\n");
-#endif
- if (SQLinitialized == FALSE)
- throw(SQL, "SQLexitClient", "Catalogue not available");
if (c->sqlcontext) {
backend *be = NULL;
mvc *m = NULL;
@@ -622,6 +617,20 @@ SQLexitClient(Client c)
c->sqlcontext = NULL;
}
c->state[MAL_SCENARIO_READER] = NULL;
+ return MAL_SUCCEED;
+}
+
+str
+SQLexitClient(Client c)
+{
+ str err;
+#ifdef _SQL_SCENARIO_DEBUG
+ mnstr_printf(GDKout, "#SQLexitClient\n");
+#endif
+ if (SQLinitialized == FALSE)
+ throw(SQL, "SQLexitClient", "Catalogue not available");
+ if ((err = SQLresetClient(c)) != MAL_SUCCEED)
+ return err;
MALexitClient(c);
return MAL_SUCCEED;
}
@@ -633,10 +642,14 @@ SQLexitClient(Client c)
str
SQLinitEnvironment(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
+ str err;
+
(void) mb;
(void) stk;
(void) pci;
- return SQLinitClient(cntxt);
+ if ((err = SQLinitClient(cntxt)) == MAL_SUCCEED)
+ cntxt->phase[MAL_SCENARIO_EXITCLIENT] = SQLexitClient;
+ return err;
}
diff --git a/sql/backends/monet5/sql_scenario.h
b/sql/backends/monet5/sql_scenario.h
--- a/sql/backends/monet5/sql_scenario.h
+++ b/sql/backends/monet5/sql_scenario.h
@@ -25,6 +25,7 @@ sql5_export void SQLtrans(mvc *m);
sql5_export str SQLexit(Client c);
sql5_export str SQLexitClient(Client c);
+sql5_export str SQLresetClient(Client c);
sql5_export str SQLinitClient(Client c);
sql5_export str SQLreader(Client c);
sql5_export str SQLparser(Client c);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list