Skip to content

Commit

Permalink
Kill the library vendor executable after load
Browse files Browse the repository at this point in the history
Belonging to [master]:
  - OpenModelica/OMCompiler#2505
  • Loading branch information
adeas31 authored and OpenModelica-Hudson committed Jun 20, 2018
1 parent def3e2e commit ab5e5ee
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 53 deletions.
14 changes: 7 additions & 7 deletions Compiler/FFrontEnd/FBuiltin.mo
Expand Up @@ -381,8 +381,8 @@ algorithm
true = intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.METAMODELICA);
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelica),Error.FILE_NOT_FOUND_ERROR,{fileModelica},Absyn.dummyInfo);
Error.assertionOrAddSourceMessage(System.regularFileExists(fileMetaModelica),Error.FILE_NOT_FOUND_ERROR,{fileMetaModelica},Absyn.dummyInfo);
Absyn.PROGRAM(classes=classes1,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelica,"UTF-8",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(fileMetaModelica,"UTF-8",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes1,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(fileMetaModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
classes = listAppend(classes1,classes2);
p = Absyn.PROGRAM(classes,Absyn.TOP());
(p as Absyn.PROGRAM(classes=classes)) = MetaUtil.createMetaClassesInProgram(p);
Expand All @@ -395,8 +395,8 @@ algorithm
true = intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.PARMODELICA);
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelica),Error.FILE_NOT_FOUND_ERROR,{fileModelica},Absyn.dummyInfo);
Error.assertionOrAddSourceMessage(System.regularFileExists(fileParModelica),Error.FILE_NOT_FOUND_ERROR,{fileParModelica},Absyn.dummyInfo);
Absyn.PROGRAM(classes=classes1,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelica,"UTF-8",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(fileParModelica,"UTF-8",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes1,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(fileParModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
classes = listAppend(classes1,classes2);
p = Absyn.PROGRAM(classes,Absyn.TOP());
sp = List.map(classes, SCodeUtil.translateClass);
Expand All @@ -407,7 +407,7 @@ algorithm
equation
true = intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.MODELICA) or intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.OPTIMICA);
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelica),Error.FILE_NOT_FOUND_ERROR,{fileModelica},Absyn.dummyInfo);
(p as Absyn.PROGRAM(classes=classes)) = Parser.parsebuiltin(fileModelica,"UTF-8",NONE(),acceptedGram=Flags.METAMODELICA);
(p as Absyn.PROGRAM(classes=classes)) = Parser.parsebuiltin(fileModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
sp = List.map(classes, SCodeUtil.translateClass);
assocLst = getGlobalRoot(Global.builtinIndex);
setGlobalRoot(Global.builtinIndex, (Flags.MODELICA,(p,sp))::assocLst);
Expand All @@ -417,8 +417,8 @@ algorithm
true = intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.PDEMODELICA);
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelica),Error.FILE_NOT_FOUND_ERROR,{fileModelica},Absyn.dummyInfo);
Error.assertionOrAddSourceMessage(System.regularFileExists(filePDEModelica),Error.FILE_NOT_FOUND_ERROR,{filePDEModelica},Absyn.dummyInfo);
Absyn.PROGRAM(classes=classes1,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelica,"UTF-8",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(filePDEModelica,"UTF-8",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes1,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(filePDEModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
classes = listAppend(classes1,classes2);
p = Absyn.PROGRAM(classes,Absyn.TOP());
sp = List.map(classes, SCodeUtil.translateClass);
Expand Down
18 changes: 15 additions & 3 deletions Compiler/FrontEnd/ClassLoader.mo
Expand Up @@ -185,6 +185,8 @@ algorithm
Absyn.Class cl;
list<String> filenames;
LoadFileStrategy strategy;
Boolean lveStarted;
Option<Integer> lveInstance;

case (_,_,_,false,_)
equation
Expand All @@ -204,14 +206,24 @@ algorithm
encodingfile = stringAppendList({path,pd,name,pd,"package.encoding"});
encoding = System.trimChar(System.trimChar(if System.regularFileExists(encodingfile) then System.readFile(encodingfile) else Util.getOptionOrDefault(optEncoding,"UTF-8"),"\n")," ");

if Config.getRunningTestsuite() or Config.noProc()==1 then
if encrypted then
(lveStarted, lveInstance) = Parser.startLibraryVendorExecutable(path + pd + name);
if not lveStarted then
fail();
end if;
end if;

if (Config.getRunningTestsuite() or Config.noProc()==1) and not encrypted then
strategy = STRATEGY_ON_DEMAND(encoding);
else
filenames = getAllFilesFromDirectory(path + pd + name, encrypted);
// print("Files load in parallel:\n" + stringDelimitList(filenames, "\n") + "\n");
strategy = STRATEGY_HASHTABLE(Parser.parallelParseFiles(filenames, encoding, Config.noProc(), encrypted));
strategy = STRATEGY_HASHTABLE(Parser.parallelParseFiles(filenames, encoding, Config.noProc(), path + pd + name, lveInstance));
end if;
cl = loadCompletePackageFromMp(id, name, path, strategy, Absyn.TOP(), Error.getNumErrorMessages(), encrypted);
if (encrypted and lveStarted) then
Parser.stopLibraryVendorExecutable(lveInstance);
end if;
then
cl;
end match;
Expand Down Expand Up @@ -711,7 +723,7 @@ algorithm
fail();
end if; */
then BaseHashTable.get(filename, strategy.ht);
case STRATEGY_ON_DEMAND() then Parser.parse(filename, strategy.encoding,NONE());
case STRATEGY_ON_DEMAND() then Parser.parse(filename, strategy.encoding);
end match;
end getProgramFromStrategy;

Expand Down
54 changes: 32 additions & 22 deletions Compiler/FrontEnd/Parser.mo
Expand Up @@ -57,10 +57,11 @@ public
function parse "Parse a mo-file"
input String filename;
input String encoding;
input Option<Integer> serverContext;
input String libraryPath = "";
input Option<Integer> lveInstance = NONE();
output Absyn.Program outProgram;
algorithm
outProgram := parsebuiltin(filename,encoding,serverContext);
outProgram := parsebuiltin(filename,encoding,libraryPath,lveInstance);
/* Check that the program is not totally off the charts */
_ := SCodeUtil.translateAbsyn2SCode(outProgram);
end parse;
Expand All @@ -85,7 +86,8 @@ end parsestring;
function parsebuiltin "Like parse, but skips the SCode check to avoid infinite loops for ModelicaBuiltin.mo."
input String filename;
input String encoding;
input Option<Integer> serverContext;
input String libraryPath = "";
input Option<Integer> lveInstance = NONE();
input Integer acceptedGram=Config.acceptedGrammar();
input Integer languageStandardInt=Flags.getConfigEnum(Flags.LANGUAGE_STANDARD);
output Absyn.Program outProgram;
Expand All @@ -94,7 +96,7 @@ protected
String realpath;
algorithm
realpath := Util.replaceWindowsBackSlashWithPathDelimiter(System.realpath(filename));
outProgram := ParserExt.parse(realpath, Util.testsuiteFriendly(realpath), acceptedGram, encoding, languageStandardInt, Config.getRunningTestsuite(), serverContext);
outProgram := ParserExt.parse(realpath, Util.testsuiteFriendly(realpath), acceptedGram, encoding, languageStandardInt, Config.getRunningTestsuite(), libraryPath, lveInstance);
end parsebuiltin;

function parsestringexp "Parse a string as if it was a sequence of statements"
Expand Down Expand Up @@ -124,12 +126,13 @@ function parallelParseFiles
input list<String> filenames;
input String encoding;
input Integer numThreads = Config.noProc();
input Boolean encrypted = false;
input String libraryPath = "";
input Option<Integer> lveInstance = NONE();
output HashTableStringToProgram.HashTable ht;
protected
list<ParserResult> partialResults;
algorithm
partialResults := parallelParseFilesWork(filenames, encoding, numThreads, encrypted);
partialResults := parallelParseFilesWork(filenames, encoding, numThreads, libraryPath, lveInstance);
ht := HashTableStringToProgram.emptyHashTableSized(Util.nextPrime(listLength(partialResults)));
for res in partialResults loop
ht := match res
Expand Down Expand Up @@ -157,6 +160,20 @@ algorithm
result := MetaModelica.Dangerous.listReverseInPlace(result);
end parallelParseFilesToProgramList;

function startLibraryVendorExecutable
input String lvePath;
output Boolean success;
output Option<Integer> lveInstance "Stores a pointer. If it is declared as Integer, it is truncated to 32-bit.";
algorithm
(success, lveInstance) := ParserExt.startLibraryVendorExecutable(lvePath);
end startLibraryVendorExecutable;

function stopLibraryVendorExecutable
input Option<Integer> lveInstance "Stores a pointer. If it is declared as Integer, it is truncated to 32-bit.";
algorithm
ParserExt.stopLibraryVendorExecutable(lveInstance);
end stopLibraryVendorExecutable;

protected

uniontype ParserResult
Expand All @@ -170,20 +187,13 @@ function parallelParseFilesWork
input list<String> filenames;
input String encoding;
input Integer numThreads;
input Boolean encrypted = false;
input String libraryPath = "";
input Option<Integer> lveInstance = NONE();
output list<ParserResult> partialResults;
protected
list<tuple<String,String,Option<Integer>>> workList;
Boolean success;
Option<Integer> decryptionServer;
list<tuple<String,String,String,Option<Integer>>> workList = list((file,encoding,libraryPath,lveInstance) for file in filenames);
algorithm
if encrypted then
(success, decryptionServer) := ParserExt.startDecryptionServer();
workList := list((file,encoding,decryptionServer) for file in filenames);
else
workList := list((file,encoding,NONE()) for file in filenames);
end if;
if Config.getRunningTestsuite() or Config.noProc()==1 or numThreads == 1 or listLength(filenames)<2 or encrypted then
if Config.getRunningTestsuite() or Config.noProc()==1 or numThreads == 1 or listLength(filenames)<2 or not(libraryPath == "") then
partialResults := list(loadFileThread(t) for t in workList);
else
// GC.disable(); // Seems to sometimes break building nightly omc
Expand All @@ -193,15 +203,15 @@ algorithm
end parallelParseFilesWork;

function loadFileThread
input tuple<String,String,Option<Integer>> inFileEncoding;
input tuple<String,String,String,Option<Integer>> inFileEncoding;
output ParserResult result;
algorithm
result := matchcontinue inFileEncoding
local
String filename,encoding;
Option<Integer> decryptionServer;
case (filename,encoding,decryptionServer) then PARSERRESULT(filename,SOME(Parser.parse(filename, encoding, decryptionServer)));
case (filename,_,_) then PARSERRESULT(filename,NONE());
String filename,encoding,libraryPath;
Option<Integer> lveInstance;
case (filename,encoding,libraryPath,lveInstance) then PARSERRESULT(filename,SOME(Parser.parse(filename, encoding, libraryPath, lveInstance)));
case (filename,_,_,_) then PARSERRESULT(filename,NONE());
end matchcontinue;
if ErrorExt.getNumMessages() > 0 then
ErrorExt.moveMessagesToParentThread();
Expand Down
20 changes: 14 additions & 6 deletions Compiler/FrontEnd/ParserExt.mo
Expand Up @@ -49,10 +49,11 @@ public function parse "Parse a mo-file"
input String encoding;
input Integer languageStandardInt;
input Boolean runningTestsuite;
input Option<Integer> serverContext;
input String libraryPath;
input Option<Integer> lveInstance;
output Absyn.Program outProgram;

external "C" outProgram=ParserExt_parse(filename, infoFilename, acceptedGram, languageStandardInt, encoding, runningTestsuite, serverContext) annotation(Library = {"omparse","omantlr3","omcruntime"});
external "C" outProgram=ParserExt_parse(filename, infoFilename, acceptedGram, languageStandardInt, encoding, runningTestsuite, libraryPath, lveInstance) annotation(Library = {"omparse","omantlr3","omcruntime"});
end parse;

public function parseexp "Parse a mos-file"
Expand Down Expand Up @@ -106,12 +107,19 @@ public function stringCref
external "C" cref=ParserExt_stringCref(str, infoFilename, acceptedGram, languageStandardInt, runningTestsuite) annotation(Library = {"omparse","omantlr3","omcruntime"});
end stringCref;

public function startDecryptionServer "Starts the decryption server executable"
public function startLibraryVendorExecutable "Starts the library vendor executable"
input String lvePath;
output Boolean success;
output Option<Integer> outDecryptionServer "Stores a pointer. If it is declared as Integer, it is truncated to 32-bit.";
output Option<Integer> lveInstance "Stores a pointer. If it is declared as Integer, it is truncated to 32-bit.";

external "C" success=ParserExt_startDecryptionServer(outDecryptionServer) annotation(Library = {"omparse","omantlr3","omcruntime"});
end startDecryptionServer;
external "C" success=ParserExt_startLibraryVendorExecutable(lvePath, lveInstance) annotation(Library = {"omparse","omantlr3","omcruntime"});
end startLibraryVendorExecutable;

public function stopLibraryVendorExecutable
input Option<Integer> lveInstance "Stores a pointer. If it is declared as Integer, it is truncated to 32-bit.";

external "C" ParserExt_stopLibraryVendorExecutable(lveInstance) annotation(Library = {"omparse","omantlr3","omcruntime"});
end stopLibraryVendorExecutable;

annotation(__OpenModelica_Interface="frontend");
end ParserExt;
2 changes: 1 addition & 1 deletion Compiler/Main/Main.mo
Expand Up @@ -349,7 +349,7 @@ algorithm
// A .mo-file.
case true
equation
pnew = Parser.parse(inLib, "UTF-8", NONE());
pnew = Parser.parse(inLib, "UTF-8");
p = SymbolTable.getAbsyn();
pnew = Interactive.mergeProgram(pnew, p);
SymbolTable.setAbsyn(pnew);
Expand Down
4 changes: 2 additions & 2 deletions Compiler/Script/CevalScript.mo
Expand Up @@ -319,7 +319,7 @@ algorithm
(outProgram,true) := loadModel((Absyn.IDENT(cname),{prio},true)::{}, mp, p, true, true, checkUses, true, filename == "package.moc");
return;
end if;
outProgram := Parser.parse(name,encoding,NONE());
outProgram := Parser.parse(name,encoding);
ClassLoader.checkOnLoadMessage(outProgram);
outProgram := checkUsesAndUpdateProgram(outProgram, p, checkUses, Settings.getModelicaPath(Config.getRunningTestsuite()));
end loadFile;
Expand Down Expand Up @@ -3011,7 +3011,7 @@ protected function reloadClass
protected
Absyn.Program p,newp;
algorithm
newp := Parser.parse(filename,encoding,NONE()); /* Don't use the classloader since that can pull in entire directory structures. We only want to reload one single file. */
newp := Parser.parse(filename,encoding); /* Don't use the classloader since that can pull in entire directory structures. We only want to reload one single file. */
newp := Interactive.updateProgram(newp, SymbolTable.getAbsyn());
SymbolTable.setAbsyn(newp);
end reloadClass;
Expand Down
2 changes: 1 addition & 1 deletion Compiler/Script/Interactive.mo
Expand Up @@ -17247,7 +17247,7 @@ algorithm
topClassNamesQualified := {};
return;
end if;
parsed := Parser.parse(fileName,encoding,NONE());
parsed := Parser.parse(fileName,encoding);
parsed := MetaUtil.createMetaClassesInProgram(parsed);
topClassNamesQualified := getTopQualifiedClassnames(parsed);
if updateProgram then
Expand Down
15 changes: 10 additions & 5 deletions Parser/Parser_omc.c
Expand Up @@ -36,15 +36,15 @@
#include "meta_modelica.h"
#include "parse.c"

void* ParserExt_parse(const char* filename, const char* infoname, int acceptedGrammar, int langStd, const char* encoding, int runningTestsuite, void* serverContext)
void* ParserExt_parse(const char* filename, const char* infoname, int acceptedGrammar, int langStd, const char* encoding, int runningTestsuite, const char* libraryPath, void* lveInstance)
{
int flags = PARSE_MODELICA;
if(acceptedGrammar == 2) flags |= PARSE_META_MODELICA;
else if(acceptedGrammar == 3) flags |= PARSE_PARMODELICA;
else if(acceptedGrammar == 4) flags |= PARSE_OPTIMICA;
else if(acceptedGrammar == 5) flags |= PARSE_PDEMODELICA;

void *res = parseFile(filename, infoname, flags, encoding, langStd, runningTestsuite, serverContext);
void *res = parseFile(filename, infoname, flags, encoding, langStd, runningTestsuite, libraryPath, lveInstance);
if (res == NULL)
MMC_THROW();
// printAny(res);
Expand All @@ -59,7 +59,7 @@ void* ParserExt_parseexp(const char* filename, const char* infoname, int accepte
else if(acceptedGrammar == 4) flags |= PARSE_OPTIMICA;
else if(acceptedGrammar == 5) flags |= PARSE_PDEMODELICA;

void *res = parseFile(filename, infoname, flags, "UTF-8", langStd, runningTestsuite, 0);
void *res = parseFile(filename, infoname, flags, "UTF-8", langStd, runningTestsuite, "", 0);
if (res == NULL)
MMC_THROW();
return res;
Expand Down Expand Up @@ -129,7 +129,12 @@ void* ParserExt_stringCref(const char* data, const char* filename, int acceptedG
}
}

int ParserExt_startDecryptionServer(void** decryptionServer)
int ParserExt_startLibraryVendorExecutable(const char* path, void** lveInstance)
{
return startDecryptionServer(decryptionServer);
return startLibraryVendorExecutable(path, lveInstance);
}

void ParserExt_stopLibraryVendorExecutable(void** lveInstance)
{
stopLibraryVendorExecutable(lveInstance);
}
18 changes: 12 additions & 6 deletions Parser/parse.c
Expand Up @@ -396,7 +396,7 @@ static void* parseString(const char* data, const char* interactiveFilename, int
#include "../../OMEncryption/Parser/parseEncryption.c"
#endif

static void* parseFile(const char* fileName, const char* infoName, int flags, const char *encoding, int langStd, int runningTestsuite, void *decryptionServer)
static void* parseFile(const char* fileName, const char* infoName, int flags, const char *encoding, int langStd, int runningTestsuite, const char* libraryPath, void* lveInstance)
{
bool debug = false; //check_debug_flag("parsedebug");

Expand All @@ -422,7 +422,7 @@ static void* parseFile(const char* fileName, const char* infoName, int flags, co

#ifdef OMENCRYPTION
if (len > 3 && 0==strcmp(fileName+len-4,".moc")) {
return parseEncryptedFile(fileName, members.filename_C, langStd, runningTestsuite, decryptionServer);
return parseEncryptedFile(fileName, members.filename_C, langStd, runningTestsuite, libraryPath, lveInstance);
}
#else
if (len > 3 && 0==strcmp(fileName+len-4,".moc")) {
Expand Down Expand Up @@ -454,12 +454,18 @@ static void* parseFile(const char* fileName, const char* infoName, int flags, co
return parseStream(input, langStd, runningTestsuite);
}

int startDecryptionServer(void** decryptionServer)
int startLibraryVendorExecutable(const char* path, void** lveInstance)
{
*decryptionServer = mmc_mk_some(0);
*lveInstance = mmc_mk_some(0);
#ifdef OMENCRYPTION
return startDecryptionServerImpl(decryptionServer);
#else
return startLibraryVendorExecutableImpl(path, lveInstance);
#endif
return 0;
}

void stopLibraryVendorExecutable(void** lveInstance)
{
#ifdef OMENCRYPTION
stopLibraryVendorExecutableImpl(lveInstance);
#endif
}

0 comments on commit ab5e5ee

Please sign in to comment.