* @throws FMILException
*/
private int fmuN = 0;
- private boolean fmuLoaded = false;
+ private boolean instantiated = false;
public void loadFMUFile(String path) throws FMILException {
if (!Files.exists(Paths.get(path)))
for(int i=0;i<variableNames.length;i++) {
variableMap.put(variableNames[i], variableReferences[i]);
}
-
- fmuLoaded = true;
+
+ instantiated = false;
} catch (UnsatisfiedLinkError err) {
throw new FMILException(UNSATISFIED_LINK, err);
} catch (Exception e) {
try {
int ret = instantiateSimulation_(getModelIDNew());
- if(ret != OK)
+ if(ret != OK) {
LOGGER.warn("Function return value != OK, an exception should have been thrown from native code!");
-
+ } else {
+ instantiated = true;
+ }
} catch (FMILException e) {
throw e;
} catch (UnsatisfiedLinkError err) {
try {
unlockFMUDirectory();
- if(fmuLoaded) {
+
+ // Many FMUs will not correctly clean-up during unload if the simulation isn't instantiated
+ // Essentially we'd likely be passing an invalid pointer to the FMU to cleanup, causing native c-level crashes.
+
+ if(instantiated) {
int ret = unloadFMU_(getModelIDNew());
if(ret != OK)
LOGGER.warn("Function return value != OK, an exception should have been thrown from native code!");
- fmuLoaded = false;
+ instantiated = false;
}
removeFMUDirectoryContents();