diff --git a/SimulationRuntime/c/util/omc_error.c b/SimulationRuntime/c/util/omc_error.c index 3815521921..9424d368e1 100644 --- a/SimulationRuntime/c/util/omc_error.c +++ b/SimulationRuntime/c/util/omc_error.c @@ -404,6 +404,10 @@ void debugStreamPrintWithEquationIndexes(int stream, int indentNext, const int * static inline jmp_buf* getBestJumpBuffer(threadData_t *threadData) { + if (!threadData) { + fprintf(stderr, "OpenModelica threadData is NULL; this should not be possible"); + abort(); + } switch (threadData->currentErrorStage) { case ERROR_EVENTSEARCH: case ERROR_SIMULATION: diff --git a/SimulationRuntime/fmi/export/fmi2/fmu2_model_interface.c b/SimulationRuntime/fmi/export/fmi2/fmu2_model_interface.c index 3906bf3a9c..073a781627 100644 --- a/SimulationRuntime/fmi/export/fmi2/fmu2_model_interface.c +++ b/SimulationRuntime/fmi/export/fmi2/fmu2_model_interface.c @@ -317,6 +317,8 @@ fmi2Component fmi2Instantiate(fmi2String instanceName, fmi2Type fmuType, fmi2Str fmi2Boolean visible, fmi2Boolean loggingOn) { // ignoring arguments: fmuResourceLocation, visible ModelInstance *comp; + int fmi2callbacksOK = 0; + threadData_t *threadData = NULL; if (!functions->logger) { return NULL; } @@ -336,9 +338,8 @@ fmi2Component fmi2Instantiate(fmi2String instanceName, fmi2Type fmuType, fmi2Str comp = (ModelInstance *)functions->allocateMemory(1, sizeof(ModelInstance)); if (comp) { DATA* fmudata = NULL; - MODEL_DATA* modelData = NULL; - SIMULATION_INFO* simInfo = NULL; - threadData_t *threadData = NULL; + MODEL_DATA* modelData = NULL; + SIMULATION_INFO* simInfo = NULL; int i; comp->instanceName = (fmi2String)functions->allocateMemory(1 + strlen(instanceName), sizeof(char)); @@ -393,6 +394,9 @@ fmi2Component fmi2Instantiate(fmi2String instanceName, fmi2Type fmuType, fmi2Str #endif /* read input vars */ /* input_function(comp->fmuData); */ + MMC_INIT(X); + pthread_setspecific(mmc_thread_data_key, threadData); + MMC_TRY_INTERNAL(mmc_jumper) #if !defined(OMC_NUM_NONLINEAR_SYSTEMS) || OMC_NUM_NONLINEAR_SYSTEMS>0 /* allocate memory for non-linear system solvers */ initializeNonlinearSystems(comp->fmuData, comp->threadData); @@ -409,6 +413,11 @@ fmi2Component fmi2Instantiate(fmi2String instanceName, fmi2Type fmuType, fmi2Str /* allocate memory for state selection */ initializeStateSetJacobians(comp->fmuData, comp->threadData); #endif + fmi2callbacksOK = 1; + MMC_CATCH_INTERNAL(mmc_jumper) + if (!fmi2callbacksOK) { + return NULL; + } #ifdef FMU_EXPERIMENTAL /* allocate memory for Jacobian */ comp->_has_jacobian = !comp->fmuData->callback->initialAnalyticJacobianA(comp->fmuData, comp->threadData);