Changeset: b36daa8b05a7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b36daa8b05a7 Modified Files: monetdb5/extras/rapi/rapi.c Branch: default Log Message:
Unset lock on failure; don't allow entry if initialization failed. diffs (43 lines): diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c --- a/monetdb5/extras/rapi/rapi.c +++ b/monetdb5/extras/rapi/rapi.c @@ -57,7 +57,7 @@ static bool RAPIEnabled(void) { // The R-environment should be single threaded, calling for some protective measures. static MT_Lock rapiLock = MT_LOCK_INITIALIZER("rapiLock"); -static int rapiInitialized = FALSE; +static bool rapiInitialized = false; static char* rtypenames[] = { "NIL", "SYM", "LIST", "CLO", "ENV", "PROM", "LANG", "SPECIAL", "BUILTIN", "CHAR", "LGL", "unknown", "unknown", "INT", "REAL", "CPLX", "STR", "DOT", "ANY", "VEC", "EXPR", "BCODE", @@ -155,7 +155,7 @@ static char *RAPIinitialize(void) { // install.packages() uses system2 to call gcc etc., so we cannot disable it (perhaps store the pointer somewhere just for that?) //SET_INTERNAL(install("system"), R_NilValue); - rapiInitialized++; + rapiInitialized = true; return NULL; } #else @@ -259,6 +259,10 @@ str RAPIeval(Client cntxt, MalBlkPtr mb, "Embedded R has not been enabled. Start server with --set %s=true", rapi_enableflag); } + if (!rapiInitialized) { + throw(MAL, "rapi.eval", + "Embedded R initialization has failed"); + } if (!grouped) { sql_subfunc *sqlmorefun = (*(sql_subfunc**) getArgReference(stk, pci, pci->retc)); @@ -523,8 +527,9 @@ str RAPIprelude(void *ret) { char *initstatus; initstatus = RAPIinitialize(); if (initstatus != 0) { + MT_lock_unset(&rapiLock); throw(MAL, "rapi.eval", - "failed to initialise R environment (%s)", initstatus); + "failed to initialize R environment (%s)", initstatus); } Rf_defineVar(Rf_install("MONETDB_LIBDIR"), ScalarString(RSTR(LIBDIR)), R_GlobalEnv); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list