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

Reply via email to