Changeset: 873f62bba050 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/873f62bba050
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_scenario.h
Branch: Jan2022
Log Message:

MAL functions may point to the SQL module, so hold context lock


diffs (99 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -969,6 +969,7 @@ monet5_resolve_function(ptr M, sql_func 
        }
 
        c = MCgetClient(clientID);
+       MT_lock_set(&mal_contextLock);
        for (m = findModule(c->usermodule, mname); m; m = m->link) {
                for (Symbol s = findSymbolInModule(m, fname); s; s = s->peer) {
                        InstrPtr sig = getSignature(s);
@@ -976,6 +977,7 @@ monet5_resolve_function(ptr M, sql_func 
 
                        if ((sig->varargs & VARARGS) == VARARGS || f->vararg || 
f->varres) {
                                f->side_effect = (bit) s->def->unsafeProp;
+                               MT_lock_unset(&mal_contextLock);
                                return 1;
                        } else if (nfargs == argc && (nfres == sig->retc || 
(sig->retc == 1 && (IS_FILT(f) || IS_PROC(f))))) {
                                /* I removed this code because, it was 
triggering many errors on te SQL <-> MAL translation */
@@ -1012,10 +1014,12 @@ monet5_resolve_function(ptr M, sql_func 
                                }
                                if (all_match)*/
                                f->side_effect = (bit) s->def->unsafeProp;
+                               MT_lock_unset(&mal_contextLock);
                                return 1;
                        }
                }
        }
+       MT_lock_unset(&mal_contextLock);
        return 0;
 }
 
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
@@ -77,6 +77,17 @@ int SQLdebug = 0;
 static const char *sqlinit = NULL;
 static MT_Lock sql_contextLock = MT_LOCK_INITIALIZER(sql_contextLock);
 
+static str
+SQLCacheRemove(Module m, const char *nme)
+{
+       /* Warning, this function doesn't do any locks, so be careful with 
concurrent symbol insert/deletes */
+       Symbol s = findSymbolInModule(m, nme);
+       if (s == NULL)
+               throw(MAL, "cache.remove", SQLSTATE(42000) "internal error, 
symbol missing\n");
+       deleteSymbol(m, s);
+       return MAL_SUCCEED;
+}
+
 /* if 'mod' not NULL, use it otherwise get the module from the client id */
 static void
 monet5_freecode(const char *mod, int clientid, const char *name)
@@ -91,9 +102,14 @@ monet5_freecode(const char *mod, int cli
                if (c)
                        m = c->usermodule;
        }
-
-       if (m && (msg = SQLCacheRemove(m, name)))
-               freeException(msg);     /* do something with error? */
+       if (m) {
+               if (mod)
+                       MT_lock_set(&mal_contextLock);
+               msg = SQLCacheRemove(m, name);
+               if (mod)
+                       MT_lock_unset(&mal_contextLock);
+               freeException(msg); /* do something with error? */
+       }
 }
 
 static str SQLinit(Client c);
@@ -1333,16 +1349,6 @@ SQLengine(Client c)
 }
 
 str
-SQLCacheRemove(Module m, const char *nme)
-{
-       Symbol s = findSymbolInModule(m, nme);
-       if (s == NULL)
-               throw(MAL, "cache.remove", SQLSTATE(42000) "internal error, 
symbol missing\n");
-       deleteSymbol(m, s);
-       return MAL_SUCCEED;
-}
-
-str
 SQLcallback(Client c, str msg)
 {
        if (msg) {
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
@@ -31,7 +31,6 @@ extern str handle_error(mvc *m, int psta
 extern str SQLstatement(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 extern str SQLcompile(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 extern str SQLinclude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
-extern str SQLCacheRemove(Module m, const char *nme);
 sql5_export str SQLescapeString(str s);
 
 extern str SYSupdate_tables(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to