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