Changeset: e1d0326e5563 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e1d0326e5563
Modified Files:
        tools/monetdbe/monetdbe.c
Branch: monetdbe-proxy
Log Message:

Fix leak and shutdown logic.


diffs (82 lines):

diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -392,10 +392,32 @@ cleanup:
 }
 
 static int
+monetdbe_close_remote(monetdbe_database_internal *mdbe)
+{
+       assert(mdbe && mdbe->mid);
+
+       int err = 0;
+
+       if (mdbe->msg) {
+               err = 1;
+               clear_error(mdbe);
+       }
+
+       if ( (mdbe->msg = RMTdisconnect(NULL, &(mdbe->mid))) != MAL_SUCCEED) {
+               err = 1;
+               clear_error(mdbe);
+       }
+
+       GDKfree(mdbe->mid);
+       mdbe->mid = NULL;
+
+       return err;
+}
+
+static int
 monetdbe_close_internal(monetdbe_database_internal *mdbe)
 {
-       if (!mdbe)
-               return 0;
+       assert(mdbe);
 
        if (validate_database_handle_noerror(mdbe)) {
                open_dbs--;
@@ -675,7 +697,8 @@ monetdbe_open_remote(monetdbe_database_i
        if ( (mdbe->msg = runMAL(c, mb, 0, stk)) != MAL_SUCCEED ) {
                return -2;
        }
-       mdbe->mid = strdup(*getArgReference_str(stk, p, 0));
+
+       mdbe->mid = GDKstrdup(*getArgReference_str(stk, p, 0));
 
        garbageCollector(c, mb, stk, TRUE);
        freeStack(stk);
@@ -733,24 +756,24 @@ monetdbe_close(monetdbe_database dbhdl)
                return 0;
 
        monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl;
-       MT_lock_set(&embedded_lock);
+
+       int err = 0;
 
-       // TODO it is a bit unclear how to handle the error in a faulty 
disconnect.
-       char* msg = NULL;
-       if (mdbe->mid) {
-               msg = RMTdisconnect(NULL, &(mdbe->mid));
-       }
+       MT_lock_set(&embedded_lock);
+       if (mdbe->mid)
+               err = monetdbe_close_remote(mdbe);
 
-       int err = monetdbe_close_internal(mdbe);
+       err = (monetdbe_close_internal(mdbe) || err);
+
        if (!open_dbs)
                monetdbe_shutdown_internal();
        MT_lock_unset(&embedded_lock);
 
-       if (!err && msg) {
+       if (err) {
                return -2;
        }
 
-       return err;
+       return 0;
 }
 
 char *
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to