Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions mcx/mcx.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,14 +316,20 @@ McxStatus RunMCX(int argc, char *argv[]) {
goto cleanup;
}

mcx_signal_handler_set_function("ConfigSetupFromCmdLine");
retVal = config->SetupFromCmdLine(config, argc, argv);
mcx_signal_handler_unset_function();
if (retVal == RETURN_ERROR) {
goto cleanup;
}

mcx_signal_handler_set_function("SetupLogFiles");
SetupLogFiles(config->logFile, config->writeAllLogFile);
mcx_signal_handler_unset_function();
logInitialized = 1;
mcx_signal_handler_set_function("ConfigSetupFromEnvironment");
retVal = config->SetupFromEnvironment(config);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
mcx_log(LOG_INFO, "Setting up configuration from environment failed");
retVal = RETURN_ERROR;
Expand All @@ -337,22 +343,28 @@ McxStatus RunMCX(int argc, char *argv[]) {
goto cleanup;
}

mcx_signal_handler_set_function("ReaderSetup");
retVal = reader->Setup(reader, config->modelFile, config);
mcx_signal_handler_unset_function();
if (retVal == RETURN_ERROR) {
mcx_log(LOG_ERROR, "Input reader setup failed");
retVal = RETURN_ERROR;
goto cleanup;
}

mcx_signal_handler_set_function("ReaderRead");
mcxInput = reader->Read(reader, config->modelFile);
mcx_signal_handler_unset_function();
if (!mcxInput) {
mcx_log(LOG_ERROR, "Parsing of input file failed");
retVal = RETURN_ERROR;
goto cleanup;
}
element = (InputElement *) mcxInput;

mcx_signal_handler_set_function("ConfigSetupFromInput");
retVal = config->SetupFromInput(config, mcxInput->config);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
mcx_log(LOG_ERROR, "Setting up configuration from input file failed");
retVal = RETURN_ERROR;
Expand Down Expand Up @@ -387,20 +399,26 @@ McxStatus RunMCX(int argc, char *argv[]) {
mcx_cpu_time_get(&clock_read_begin);
mcx_time_get(&time_read_begin);

mcx_signal_handler_set_function("TaskRead");
retVal = task->Read(task, mcxInput->task);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
retVal = RETURN_ERROR;
goto cleanup;
}

mcx_signal_handler_set_function("ModelRead");
retVal = model->Read(model, mcxInput->model);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
retVal = RETURN_ERROR;
goto cleanup;
}

object_destroy(mcxInput);
mcx_signal_handler_set_function("ReaderCleanup");
reader->Cleanup(reader);
mcx_signal_handler_unset_function();
object_destroy(reader);

mcx_cpu_time_get(&clock_read_end);
Expand All @@ -421,19 +439,25 @@ McxStatus RunMCX(int argc, char *argv[]) {
mcx_cpu_time_get(&clock_setup_begin);
mcx_time_get(&time_setup_begin);

mcx_signal_handler_set_function("TaskSetup");
retVal = task->Setup(task, model);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
retVal = RETURN_ERROR;
goto cleanup;
}

mcx_signal_handler_set_function("ModelSetup");
retVal = model->Setup(model);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
retVal = RETURN_ERROR;
goto cleanup;
}

mcx_signal_handler_set_function("TaskPrepareRun");
retVal = task->PrepareRun(task, model);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
retVal = RETURN_ERROR;
goto cleanup;
Expand All @@ -457,7 +481,9 @@ McxStatus RunMCX(int argc, char *argv[]) {
mcx_cpu_time_get(&clock_init_begin);
mcx_time_get(&time_init_begin);

mcx_signal_handler_set_function("TaskInitialize");
retVal = task->Initialize(task, model);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
retVal = RETURN_ERROR;
goto cleanup;
Expand All @@ -481,7 +507,9 @@ McxStatus RunMCX(int argc, char *argv[]) {
mcx_log(LOG_INFO, " ");
mcx_cpu_time_get(&clock_sim_begin);
mcx_time_get(&time_sim_begin);
mcx_signal_handler_set_function("TaskRun");
retVal = task->Run(task, model);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
retVal = RETURN_ERROR;
goto cleanup;
Expand Down Expand Up @@ -512,6 +540,7 @@ McxStatus RunMCX(int argc, char *argv[]) {
mcx_cpu_time_get(&clock_cleanup_begin);
mcx_time_get(&time_cleanup_begin);

mcx_signal_handler_set_function("RunMCX:Cleanup");
object_destroy(task);
object_destroy(model);
object_destroy(config);
Expand Down Expand Up @@ -554,6 +583,7 @@ McxStatus RunMCX(int argc, char *argv[]) {
mcx_log(LOG_INFO, "**********************************************************************");
}

mcx_signal_handler_unset_function(); // RunMCX:Cleanup

return retVal;
}
Expand Down
23 changes: 23 additions & 0 deletions src/components/comp_fmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "objects/Map.h"
#include "reader/model/components/specific_data/FmuInput.h"
#include "util/string.h"
#include "util/signals.h"

#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -229,10 +230,12 @@ static McxStatus Fmu1Initialize(Component * comp, size_t group, double startTime

// Initialization Mode
ComponentLog(comp, LOG_DEBUG, "fmiInitializeSlave");
mcx_signal_handler_set_function("fmi1_import_initialize_slave");
status = fmi1_import_initialize_slave(fmu1->fmiImport,
startTime,
fmi1_false,
0.0);
mcx_signal_handler_unset_function();
if (fmi1_status_ok != status) {
ComponentLog(comp, LOG_ERROR, "fmiInitializeSlave failed");
return RETURN_ERROR;
Expand Down Expand Up @@ -288,7 +291,9 @@ static McxStatus Fmu1DoStep(Component * comp, size_t group, double time, double
}

// Do calculations
mcx_signal_handler_set_function("fmi1_import_do_step");
status = fmi1_import_do_step(fmu1->fmiImport, compFmu->lastCommunicationTimePoint, deltaTime, fmi1_true);
mcx_signal_handler_unset_function();
if (fmi1_status_ok == status) {
// fine
} else if (fmi1_status_discard == status) {
Expand Down Expand Up @@ -905,20 +910,24 @@ static McxStatus Fmu2Initialize(Component * comp, size_t group, double startTime
defaultTolerance = fmi2_import_get_default_experiment_tolerance(fmu2->fmiImport);

compFmu->lastCommunicationTimePoint = startTime;
mcx_signal_handler_set_function("fmi2_import_setup_experiment");
status = fmi2_import_setup_experiment(fmu2->fmiImport,
fmi2_false, /* toleranceDefine */
defaultTolerance,
startTime, /* startTime */
fmi2_false, /* stopTimeDefined */
0.0 /* stopTime */);
mcx_signal_handler_unset_function();

if (fmi2_status_ok != status) {
ComponentLog(comp, LOG_ERROR, "SetupExperiment failed");
return RETURN_ERROR;
}

// Initialization Mode
mcx_signal_handler_set_function("fmi2_import_enter_initialization_mode");
status = fmi2_import_enter_initialization_mode(fmu2->fmiImport);
mcx_signal_handler_unset_function();
if (fmi2_status_ok != status) {
ComponentLog(comp, LOG_ERROR, "Could not enter Initialization Mode");
return RETURN_ERROR;
Expand Down Expand Up @@ -961,7 +970,9 @@ static McxStatus Fmu2Initialize(Component * comp, size_t group, double startTime
static McxStatus Fmu2ExitInitializationMode(Component *comp) {
CompFMU *compFmu = (CompFMU*)comp;

mcx_signal_handler_set_function("fmi2_import_exit_initialization_mode");
fmi2_status_t status = fmi2_import_exit_initialization_mode(compFmu->fmu2.fmiImport);
mcx_signal_handler_unset_function();
if (fmi2_status_ok != status) {
ComponentLog(comp, LOG_ERROR, "Could not exit Initialization Mode");
return RETURN_ERROR;
Expand All @@ -987,14 +998,18 @@ static McxStatus Fmu2DoStep(Component * comp, size_t group, double time, double
TimeSnapshotEnd(&comp->data->rtData.funcTimings.rtInput);

// Do calculations
mcx_signal_handler_set_function("fmi2_import_do_step");
status = fmi2_import_do_step(fmu2->fmiImport, compFmu->lastCommunicationTimePoint, deltaTime, fmi2_true);
mcx_signal_handler_unset_function();
if (fmi2_status_ok == status) {
// fine
} else if (fmi2_status_discard == status) {
fmi2_status_t fmi2status;
fmi2_boolean_t isTerminated = fmi2_false;

mcx_signal_handler_set_function("fmi2_import_get_boolean_status");
fmi2status = fmi2_import_get_boolean_status(fmu2->fmiImport, fmi2_terminated, &isTerminated);
mcx_signal_handler_unset_function();
if (fmi2_status_ok == fmi2status) {
if (fmi2_true == isTerminated) {
comp->SetIsFinished(comp);
Expand Down Expand Up @@ -1330,21 +1345,29 @@ static void CompFMUDestructor(CompFMU * compFmu) {
// TOOD: Move this to the common struct destructors
if (fmu1->fmiImport) {
if (fmi1_true == fmu1->runOk) {
mcx_signal_handler_set_function("fmi1_import_terminate_slave");
fmi1_import_terminate_slave(fmu1->fmiImport);
mcx_signal_handler_unset_function();
}

if (fmi1_true == fmu1->instantiateOk) {
mcx_signal_handler_set_function("fmi1_import_free_slave_instance");
fmi1_import_free_slave_instance(fmu1->fmiImport);
mcx_signal_handler_unset_function();
}
}

if (fmu2->fmiImport) {
if (fmi2_true == fmu2->runOk) {
mcx_signal_handler_set_function("fmi2_import_terminate");
fmi2_import_terminate(fmu2->fmiImport);
mcx_signal_handler_unset_function();
}

if (fmi2_true == fmu2->instantiateOk) {
mcx_signal_handler_set_function("fmi2_import_free_instance");
fmi2_import_free_instance(fmu2->fmiImport);
mcx_signal_handler_unset_function();
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/core/Component.c
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,9 @@ McxStatus ComponentDoStep(Component * comp, size_t group, double time, double de

if (comp->DoStep) {
mcx_signal_handler_set_name(comp->GetName(comp));
mcx_signal_handler_set_this_function();
retVal = comp->DoStep(comp, group, time, deltaTime, endTime, isNewStep);
mcx_signal_handler_unset_function();
mcx_signal_handler_unset_name();
if (RETURN_OK != retVal) {
ComponentLog(comp, LOG_DEBUG, "Component specific DoStep failed");
Expand Down
8 changes: 8 additions & 0 deletions src/core/Task.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,25 @@ static McxStatus TaskPrepareRun(Task * task, Model * model) {
McxStatus retVal = RETURN_OK;

#if defined (ENABLE_STORAGE)
mcx_signal_handler_set_function("ResultsStorageSetup");
retVal = task->storage->Setup(task->storage, task->timeStart);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
mcx_log(LOG_ERROR, "Could not setup storage");
return RETURN_ERROR;
}

mcx_signal_handler_set_function("ResultsStorageAddModelComponents");
retVal = task->storage->AddModelComponents(task->storage, model->subModel);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
mcx_log(LOG_ERROR, "Could not setup component storage");
return RETURN_ERROR;
}

mcx_signal_handler_set_function("ResultsStorageSetupBackends");
retVal = task->storage->SetupBackends(task->storage);
mcx_signal_handler_unset_function();
if (RETURN_OK != retVal) {
mcx_log(LOG_ERROR, "Could not setup storage backends");
return RETURN_ERROR;
Expand Down Expand Up @@ -154,7 +160,9 @@ static McxStatus TaskRun(Task * task, Model * model) {
stepParams->timeEndStep += task->params->timeStepSize;
}

mcx_signal_handler_set_function("StepTypeDoStep");
status = task->stepType->DoStep(task->stepType, stepParams, subModel);
mcx_signal_handler_unset_function();
if (status != RETURN_OK) {
break;
}
Expand Down
11 changes: 11 additions & 0 deletions src/fmu/common_fmu1.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "reader/model/parameters/ParameterInput.h"

#include "util/string.h"
#include "util/signals.h"

#include "fmilib.h"

Expand Down Expand Up @@ -601,14 +602,19 @@ McxStatus Fmu1SetVariableArray(Fmu1CommonStruct * fmu, ObjectContainer * vals) {
size_t i = 0;
size_t numVars = vals->Size(vals);

mcx_signal_handler_set_this_function();

for (i = 0; i < numVars; i++) {
Fmu1Value * fmuVal = (Fmu1Value *) vals->At(vals, i);

if (RETURN_ERROR == Fmu1SetVariable(fmu, fmuVal)) {
mcx_signal_handler_unset_function();
return RETURN_ERROR;
}
}

mcx_signal_handler_unset_function();

return RETURN_OK;
}

Expand Down Expand Up @@ -672,15 +678,20 @@ McxStatus Fmu1GetVariableArray(Fmu1CommonStruct * fmu, ObjectContainer * vals) {
size_t i = 0;
size_t numVars = vals->Size(vals);

mcx_signal_handler_set_this_function();

for (i = 0; i < numVars; i++) {
McxStatus retVal = RETURN_OK;
Fmu1Value * fmuVal = (Fmu1Value *) vals->At(vals, i);
retVal = Fmu1GetVariable(fmu, fmuVal);
if (RETURN_ERROR == retVal) {
mcx_signal_handler_unset_function();
return RETURN_ERROR;
}
}

mcx_signal_handler_unset_function();

return RETURN_OK;
}

Expand Down
Loading
Loading