Skip to content

Commit

Permalink
Updates to source-code FMUs
Browse files Browse the repository at this point in the history
- Do not compile nonlinear/linear/mixed solvers unless the model uses
  the solvers.
- Add support to compile a-files instead of so-files (--disable-shared
  --enable-static).
- Added some preprocessor flags to disable more features in the run-time
  (this should be improved; all logging functionality is included even
  though the FMI runtime cannot access them, etc).
- Use global variables if pthreads is unavailable.
- Succesfully compiles to AVR CPUs now, but uses way too much SRAM to be
  useful.
  • Loading branch information
sjoelund authored and OpenModelica-Hudson committed Nov 8, 2016
1 parent efd9b1f commit a50dbe1
Show file tree
Hide file tree
Showing 26 changed files with 400 additions and 69 deletions.
48 changes: 32 additions & 16 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -104,7 +104,7 @@ end translateModel;
::=
let modelNamePrefixStr = modelNamePrefix(simCode)
match simCode
case simCode as SIMCODE(modelInfo=MODELINFO(functions=functions)) then
case simCode as SIMCODE(modelInfo=MODELINFO(functions=functions, varInfo=varInfo as VARINFO(__))) then
<<
/* Simulation code for <%dotPath(modelInfo.name)%> generated by the OpenModelica Compiler <%getVersionNr()%>. */
#if !defined(<%modelNamePrefixStr%>__MODEL_H)
Expand All @@ -129,10 +129,18 @@ end translateModel;

extern void <%symbolName(modelNamePrefixStr,"callExternalObjectConstructors")%>(DATA *data, threadData_t *threadData);
extern void <%symbolName(modelNamePrefixStr,"callExternalObjectDestructors")%>(DATA *_data, threadData_t *threadData);
extern void <%symbolName(modelNamePrefixStr,"initialNonLinearSystem")%>(int nNonLinearSystems, NONLINEAR_SYSTEM_DATA *data);
extern void <%symbolName(modelNamePrefixStr,"initialLinearSystem")%>(int nLinearSystems, LINEAR_SYSTEM_DATA *data);
extern void <%symbolName(modelNamePrefixStr,"initialMixedSystem")%>(int nMixedSystems, MIXED_SYSTEM_DATA *data);
#if !defined(OMC_NUM_NONLINEAR_SYSTEMS) || OMC_NUM_NONLINEAR_SYSTEMS>0
<% if intGt(varInfo.numNonLinearSystems, 0) then 'extern void <%symbolName(modelNamePrefixStr,"initialNonLinearSystem")%>(int nNonLinearSystems, NONLINEAR_SYSTEM_DATA *data);' %>
#endif
#if !defined(OMC_NUM_LINEAR_SYSTEMS) || OMC_NUM_LINEAR_SYSTEMS>0
<% if intGt(varInfo.numLinearSystems, 0) then 'extern void <%symbolName(modelNamePrefixStr,"initialLinearSystem")%>(int nLinearSystems, LINEAR_SYSTEM_DATA *data);' %>
#endif
#if !defined(OMC_NUM_MIXED_SYSTEMS) || OMC_NUM_MIXED_SYSTEMS>0
<% if intGt(varInfo.numMixedSystems, 0) then 'extern void <%symbolName(modelNamePrefixStr,"initialMixedSystem")%>(int nMixedSystems, MIXED_SYSTEM_DATA *data);' %>
#endif
#if !defined(OMC_NO_STATESELECTION)
extern void <%symbolName(modelNamePrefixStr,"initializeStateSets")%>(int nStateSets, STATE_SET_DATA* statesetData, DATA *data);
#endif
extern int <%symbolName(modelNamePrefixStr,"functionAlgebraics")%>(DATA *data, threadData_t *threadData);
extern int <%symbolName(modelNamePrefixStr,"function_storeDelayed")%>(DATA *data, threadData_t *threadData);
extern int <%symbolName(modelNamePrefixStr,"updateBoundVariableAttributes")%>(DATA *data, threadData_t *threadData);
Expand Down Expand Up @@ -486,7 +494,7 @@ template simulationFile_nls(SimCode simCode)
"Non Linear Systems"
::=
match simCode
case simCode as SIMCODE(__) then
case simCode as SIMCODE(modelInfo=MODELINFO(varInfo=varInfo as VARINFO(__))) then
let modelNamePrefixStr = modelNamePrefix(simCode)
let jacobianbody = (jacobianMatrixes |> ({(jacobianEquations,_,_)}, _, _, _, _, _, _) => functionNonLinearResiduals(jacobianEquations,modelNamePrefixStr);separator="\n\n")
<<
Expand All @@ -502,7 +510,7 @@ template simulationFile_nls(SimCode simCode)
<%functionNonLinearResiduals(allEquations,modelNamePrefixStr)%>
<%jacobianbody%>
<%functionInitialNonLinearSystems(initialEquations, initialEquations_lambda0, parameterEquations, allEquations, jacobianMatrixes, modelNamePrefixStr)%>
<%if intGt(varInfo.numNonLinearSystems, 0) then functionInitialNonLinearSystems(initialEquations, initialEquations_lambda0, parameterEquations, allEquations, jacobianMatrixes, modelNamePrefixStr)%>
#if defined(__cplusplus)
}
Expand All @@ -517,7 +525,7 @@ template simulationFile_lsy(SimCode simCode)
"Linear Systems"
::=
match simCode
case simCode as SIMCODE(__) then
case simCode as SIMCODE(modelInfo=MODELINFO(varInfo=varInfo as VARINFO(__))) then
<<
/* Linear Systems */
<%simulationFileHeader(simCode.fileNamePrefix)%>
Expand All @@ -528,7 +536,7 @@ template simulationFile_lsy(SimCode simCode)
<%functionSetupLinearSystems(initialEquations, initialEquations_lambda0, parameterEquations, allEquations, jacobianMatrixes, modelNamePrefix(simCode))%>
<%functionInitialLinearSystems(initialEquations, initialEquations_lambda0, parameterEquations, allEquations, jacobianMatrixes, modelNamePrefix(simCode))%>
<% if intGt(varInfo.numLinearSystems,0) then functionInitialLinearSystems(initialEquations, initialEquations_lambda0, parameterEquations, allEquations, jacobianMatrixes, modelNamePrefix(simCode))%>
#if defined(__cplusplus)
}
Expand Down Expand Up @@ -596,7 +604,7 @@ template simulationFile_inz(SimCode simCode)
"Initialization"
::=
match simCode
case simCode as SIMCODE(__) then
case simCode as SIMCODE(modelInfo=MODELINFO(varInfo=varInfo as VARINFO(__))) then
<<
/* Initialization */
<%simulationFileHeader(simCode.fileNamePrefix)%>
Expand All @@ -610,7 +618,7 @@ template simulationFile_inz(SimCode simCode)
<%functionInitialEquations_lambda0(initialEquations_lambda0, modelNamePrefix(simCode))%>
<%functionRemovedInitialEquations(removedInitialEquations, modelNamePrefix(simCode))%>
<%functionInitialMixedSystems(initialEquations, initialEquations_lambda0, parameterEquations, allEquations, jacobianMatrixes, modelNamePrefix(simCode))%>
<%if intGt(varInfo.numMixedSystems,0) then functionInitialMixedSystems(initialEquations, initialEquations_lambda0, parameterEquations, allEquations, jacobianMatrixes, modelNamePrefix(simCode))%>
#if defined(__cplusplus)
}
Expand Down Expand Up @@ -931,7 +939,7 @@ template simulationFile(SimCode simCode, String guid, Boolean isModelExchangeFMU
"Generates code for main C file for simulation target."
::=
match simCode
case simCode as SIMCODE(hpcomData=HPCOMDATA(__)) then
case simCode as SIMCODE(modelInfo=MODELINFO(varInfo=varInfo as VARINFO(__)), hpcomData=HPCOMDATA(__)) then
let modelNamePrefixStr = modelNamePrefix(simCode)
let mainInit = if boolOr(isModelExchangeFMU, boolOr(Flags.isSet(Flags.PARMODAUTO), Flags.isSet(HPCOM))) then
<<
Expand Down Expand Up @@ -1032,10 +1040,14 @@ template simulationFile(SimCode simCode, String guid, Boolean isModelExchangeFMU
<% if isModelExchangeFMU then "NULL" else '<%symbolName(modelNamePrefixStr,"updateContinuousSystem")%>'%>,
<%symbolName(modelNamePrefixStr,"callExternalObjectConstructors")%>,
<%symbolName(modelNamePrefixStr,"callExternalObjectDestructors")%>,
<%symbolName(modelNamePrefixStr,"initialNonLinearSystem")%>,
<%symbolName(modelNamePrefixStr,"initialLinearSystem")%>,
<%symbolName(modelNamePrefixStr,"initialMixedSystem")%>,
<%if intEq(varInfo.numNonLinearSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialNonLinearSystem")%>,
<%if intEq(varInfo.numLinearSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialLinearSystem")%>,
<%if intEq(varInfo.numMixedSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialMixedSystem")%>,
#if !defined(OMC_NO_STATESELECTION)
<%symbolName(modelNamePrefixStr,"initializeStateSets")%>,
#else
NULL,
#endif
<%symbolName(modelNamePrefixStr,"initializeDAEmodeData")%>,
<%symbolName(modelNamePrefixStr,"functionODE")%>,
<%symbolName(modelNamePrefixStr,"functionAlgebraics")%>,
Expand Down Expand Up @@ -1163,7 +1175,11 @@ template populateModelInfo(ModelInfo modelInfo, String fileNamePrefix, String gu
<<
data->modelData->initXMLData = NULL;
data->modelData->modelDataXml.infoXMLData =
#if defined(OMC_MINIMAL_METADATA)
NULL;
#else
#include "<%fileNamePrefix%>_info.c"
#endif
;
>>
else
Expand Down Expand Up @@ -5505,7 +5521,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
end match
case "gcc" then
match simCode
case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simulationSettingsOpt = sopt) then
case SIMCODE(modelInfo=MODELINFO(varInfo=varInfo as VARINFO(__)), delayedExps=DELAYED_EXPRESSIONS(maxDelayedIndex=maxDelayedIndex), makefileParams=MAKEFILE_PARAMS(__), simulationSettingsOpt = sopt) then
let dirExtra = if modelInfo.directory then '-L"<%modelInfo.directory%>"' //else ""
let libsStr = (makefileParams.libs |> lib => lib ;separator=" ")
let libsPos1 = if not dirExtra then libsStr //else ""
Expand All @@ -5528,7 +5544,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
DEBUG_FLAGS=<% if boolOr(acceptMetaModelicaGrammar(), Flags.isSet(Flags.GEN_DEBUG_SYMBOLS)) then "-O0 -g"%>
CFLAGS=$(CFLAGS_BASED_ON_INIT_FILE) $(DEBUG_FLAGS) <%makefileParams.cflags%> <%match sopt case SOME(s as SIMULATION_SETTINGS(__)) then '<%s.cflags%> ' /* From the simulate() command */%> <% if Flags.isSet(Flags.FMU_EXPERIMENTAL) then '-DFMU_EXPERIMENTAL' %>
<% if stringEq(Config.simCodeTarget(),"JavaScript") then 'OMC_EMCC_PRE_JS=<%makefileParams.omhome%>/lib/<%getTriple()%>/omc/emcc/pre.js<%\n%>'
%>CPPFLAGS=<%makefileParams.includes ; separator=" "%> -I"<%makefileParams.omhome%>/include/omc/c" -I. -DOPENMODELICA_XML_FROM_FILE_AT_RUNTIME<% if stringEq(Config.simCodeTarget(),"JavaScript") then " -DOMC_EMCC"%><% if Flags.isSet(Flags.OMC_RELOCATABLE_FUNCTIONS) then " -DOMC_GENERATE_RELOCATABLE_CODE"%>
%>CPPFLAGS=<%makefileParams.includes ; separator=" "%> -I"<%makefileParams.omhome%>/include/omc/c" -I. -DOPENMODELICA_XML_FROM_FILE_AT_RUNTIME<% if stringEq(Config.simCodeTarget(),"JavaScript") then " -DOMC_EMCC"%><% if Flags.isSet(Flags.OMC_RELOCATABLE_FUNCTIONS) then " -DOMC_GENERATE_RELOCATABLE_CODE"%> -DOMC_MODEL_PREFIX=<%modelNamePrefix(simCode)%> -DOMC_NUM_MIXED_SYSTEMS=<%varInfo.numMixedSystems%> -DOMC_NUM_LINEAR_SYSTEMS=<%varInfo.numLinearSystems%> -DOMC_NUM_NONLINEAR_SYSTEMS=<%varInfo.numNonLinearSystems%> -DOMC_NDELAY_EXPRESSIONS=<%maxDelayedIndex%> -DOMC_NVAR_STRING=<%varInfo.numStringAlgVars%>
LDFLAGS=<%dirExtra%> <%
if stringEq(Config.simCodeTarget(),"JavaScript") then <<-L'<%makefileParams.omhome%>/lib/<%getTriple()%>/omc/emcc' -lblas -llapack -lexpat -lSimulationRuntimeC -s TOTAL_MEMORY=805306368 -s OUTLINING_LIMIT=20000 --pre-js $(OMC_EMCC_PRE_JS)>>
else <<-L"<%makefileParams.omhome%>/lib/<%getTriple()%>/omc" -L"<%makefileParams.omhome%>/lib" -Wl,<% if boolOr(stringEq(makefileParams.platform, "win32"),stringEq(makefileParams.platform, "win64")) then "--stack,16777216,"%>-rpath,"<%makefileParams.omhome%>/lib/<%getTriple()%>/omc" -Wl,-rpath,"<%makefileParams.omhome%>/lib" <%ParModelicaExpLibs%> <%ParModelicaAutoLibs%> <%makefileParams.ldflags%> <%makefileParams.runtimelibs%> >>
Expand Down
22 changes: 18 additions & 4 deletions Compiler/Template/CodegenFMU.tpl
Expand Up @@ -1066,15 +1066,22 @@ match platform
else
<<
<%fileNamePrefix%>_FMU: $(MAINOBJ) <%fileNamePrefix%>_functions.h <%fileNamePrefix%>_literals.h $(OFILES) $(RUNTIMEFILES)
<%\t%>$(LD) -o <%modelNamePrefix%>$(DLLEXT) $(MAINOBJ) $(OFILES) $(RUNTIMEFILES) <%dirExtra%> <%libsPos1%> <%libsPos2%> $(LDFLAGS)
<%\t%>mkdir -p ../binaries/$(FMIPLATFORM)
ifeq (@LIBTYPE_DYNAMIC@,1)
<%\t%>$(LD) -o <%modelNamePrefix%>$(DLLEXT) $(MAINOBJ) $(OFILES) $(RUNTIMEFILES) <%dirExtra%> <%libsPos1%> <%libsPos2%> $(LDFLAGS)
<%\t%>cp <%fileNamePrefix%>$(DLLEXT) <%fileNamePrefix%>_FMU.libs config.log ../binaries/$(FMIPLATFORM)/
endif
ifeq (@LIBTYPE_STATIC@,1)
<%\t%>rm -f <%modelNamePrefix%>.a
<%\t%>$(AR) -rsu <%modelNamePrefix%>.a $(MAINOBJ) $(OFILES) $(RUNTIMEFILES)
<%\t%>cp <%fileNamePrefix%>.a <%fileNamePrefix%>_FMU.libs config.log ../binaries/$(FMIPLATFORM)/
endif
<%\t%>$(MAKE) distclean
<%\t%>cd .. && rm -f ../<%fileNamePrefix%>.fmu && zip -r ../<%fileNamePrefix%>.fmu *
distclean: clean
<%\t%>rm -f Makefile config.status config.log
clean:
<%\t%>rm -f <%fileNamePrefix%>.def <%fileNamePrefix%>.o <%fileNamePrefix%>$(DLLEXT) $(MAINOBJ) $(OFILES) $(RUNTIMEFILES)
<%\t%>rm -f <%fileNamePrefix%>.def <%fileNamePrefix%>.o <%fileNamePrefix%>.a <%fileNamePrefix%>$(DLLEXT) $(MAINOBJ) $(OFILES) $(RUNTIMEFILES)
>>
end getPlatformString2;

Expand Down Expand Up @@ -1184,7 +1191,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
end match
case "gcc" then
match simCode
case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simulationSettingsOpt = sopt) then
case SIMCODE(modelInfo=MODELINFO(varInfo=varInfo as VARINFO(__)), delayedExps=DELAYED_EXPRESSIONS(maxDelayedIndex=maxDelayedIndex), makefileParams=MAKEFILE_PARAMS(__), simulationSettingsOpt = sopt) then
let dirExtra = if modelInfo.directory then '-L"<%modelInfo.directory%>"' //else ""
let libsStr = (makefileParams.libs |> lib => lib ;separator=" ")
let libsPos1 = if not dirExtra then libsStr //else ""
Expand All @@ -1198,6 +1205,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
<<
# Makefile generated by OpenModelica
CC=@CC@
AR=@AR@
CFLAGS=@CFLAGS@
LD=$(CC) -shared
LDFLAGS=@LDFLAGS@ @LIBS@
Expand All @@ -1207,7 +1215,13 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
FMIPLATFORM=@FMIPLATFORM@
# Note: Simulation of the fmu with dymola does not work with -finline-small-functions (enabled by most optimization levels)
CPPFLAGS=@CPPFLAGS@
override CPPFLAGS += -Iinclude/ -Iinclude/fmi<%if isFMIVersion20(FMUVersion) then "2" else "1"%> -I. <%makefileParams.includes ; separator=" "%> <% if Flags.isSet(Flags.FMU_EXPERIMENTAL) then '-DFMU_EXPERIMENTAL'%>
OMC_NUM_LINEAR_SYSTEMS=<%varInfo.numLinearSystems%>
OMC_NUM_NONLINEAR_SYSTEMS=<%varInfo.numNonLinearSystems%>
OMC_NUM_MIXED_SYSTEMS=<%varInfo.numMixedSystems%>
OMC_NDELAY_EXPRESSIONS=<%maxDelayedIndex%>
OMC_NVAR_STRING=<%varInfo.numStringAlgVars%>

override CPPFLAGS += -Iinclude/ -Iinclude/fmi<%if isFMIVersion20(FMUVersion) then "2" else "1"%> -I. <%makefileParams.includes ; separator=" "%> <% if Flags.isSet(Flags.FMU_EXPERIMENTAL) then '-DFMU_EXPERIMENTAL'%> -DOMC_MODEL_PREFIX=<%modelNamePrefix(simCode)%> -DOMC_NUM_MIXED_SYSTEMS=<%varInfo.numMixedSystems%> -DOMC_NUM_LINEAR_SYSTEMS=<%varInfo.numLinearSystems%> -DOMC_NUM_NONLINEAR_SYSTEMS=<%varInfo.numNonLinearSystems%> -DOMC_NDELAY_EXPRESSIONS=<%maxDelayedIndex%> -DOMC_NVAR_STRING=<%varInfo.numStringAlgVars%>

<%common%>

Expand Down
27 changes: 26 additions & 1 deletion SimulationRuntime/c/Makefile.objs
Expand Up @@ -41,7 +41,25 @@ UTIL_HFILES=base_array.h boolean_array.h division.h generic_array.h omc_error.h
MATH_OBJS=pivot$(OBJ_EXT)
MATH_HFILES = blaswrap.h

SOLVER_OBJS_FMU=delay$(OBJ_EXT) linearSystem$(OBJ_EXT) linearSolverLapack$(OBJ_EXT) linearSolverTotalPivot$(OBJ_EXT) mixedSystem$(OBJ_EXT) mixedSearchSolver$(OBJ_EXT) nonlinearSystem$(OBJ_EXT) nonlinearValuesList$(OBJ_EXT) nonlinearSolverHybrd$(OBJ_EXT) nonlinearSolverHomotopy$(OBJ_EXT) omc_math$(OBJ_EXT) model_help$(OBJ_EXT) stateset$(OBJ_EXT) synchronous$(OBJ_EXT)
ifeq ($(OMC_NUM_NONLINEAR_SYSTEMS),0)
SOLVER_OBJS_NONLINEAR_SYSTEMS=
else
SOLVER_OBJS_NONLINEAR_SYSTEMS=nonlinearSystem$(OBJ_EXT) nonlinearValuesList$(OBJ_EXT) nonlinearSolverHybrd$(OBJ_EXT) nonlinearSolverHomotopy$(OBJ_EXT)
endif

ifeq ($(OMC_NUM_LINEAR_SYSTEMS),0)
SOLVER_OBJS_LINEAR_SYSTEMS=
else
SOLVER_OBJS_LINEAR_SYSTEMS=linearSystem$(OBJ_EXT) linearSolverLapack$(OBJ_EXT) linearSolverTotalPivot$(OBJ_EXT)
endif

ifeq ($(OMC_NUM_MIXED_SYSTEMS),0)
SOLVER_OBJS_MIXED_SYSTEMS=
else
SOLVER_OBJS_MIXED_SYSTEMS=mixedSystem$(OBJ_EXT) mixedSearchSolver$(OBJ_EXT)
endif

SOLVER_OBJS_FMU=delay$(OBJ_EXT) $(SOLVER_OBJS_LINEAR_SYSTEMS) $(SOLVER_OBJS_MIXED_SYSTEMS) $(SOLVER_OBJS_NONLINEAR_SYSTEMS) omc_math$(OBJ_EXT) model_help$(OBJ_EXT) stateset$(OBJ_EXT) synchronous$(OBJ_EXT)
ifeq ($(OMC_FMI_RUNTIME),)
SOLVER_OBJS_MINIMAL=$(SOLVER_OBJS_FMU) events$(OBJ_EXT) external_input$(OBJ_EXT) solver_main$(OBJ_EXT) real_time_sync$(OBJ_EXT) embedded_server$(OBJ_EXT)

Expand Down Expand Up @@ -135,12 +153,19 @@ FMIOBJSPATH = $(FMI_OBJS:%=$(FMIPATH)%)
ALL_OBJS = $(GCOBJSPATH) $(METAOBJSPATH) $(UTILOBJSPATH) $(MATHOBJSPATH) $(SOLVEROBJSPATH) $(INITIALIZATIONOBJSPATH) $(OPTIMIZATIONOBJSPATH) $(RESULTSOBJSPATH) $(SIMOBJSPATH) $(SIMOBJSPATHC) meta/meta_modelica_catch$(OBJ_EXT)

# External solvers needed by FMI for ME
ifeq ($(OMC_NUM_NONLINEAR_SYSTEMS),0)
CMINPACK_OBJS =
else
CMINPACK_OBJS = enorm_ hybrj_ dpmpar_ qrfac_ qform_ dogleg_ r1updt_ r1mpyq_
endif

ifneq ($(OMC_NUM_LINEAR_SYSTEMS)$(OMC_NUM_NONLINEAR_SYSTEMS),00)
ifneq ($(NEED_DGESV),)
LAPACK_OBJS = dgesv dgetrf dlamch ilaenv xerbla dgetf2 dgetrs dlaswp ieeeck iparmq
BLAS_OBJS = dgemm dger dscal dswap dtrsm idamax lsame
LIBF2C_OBJS = i_nint pow_di s_cmp s_copy
endif
endif

# Only objects needed for FMI for Modelica Exchange
FMI_ME_OBJS = $(GCOBJSPATH_MINIMAL) $(UTILOBJSPATH) $(MATHOBJSPATH) $(SIMOBJSPATHC) $(SOLVEROBJSPATH) $(INITIALIZATIONOBJSPATH) \
Expand Down
8 changes: 8 additions & 0 deletions SimulationRuntime/c/gc/memory_pool.c
Expand Up @@ -34,7 +34,9 @@
#endif
#include "gc/omc_gc.h"
#include <string.h>
#if !defined(OMC_NO_THREADS)
#include <pthread.h>
#endif

#if defined(__cplusplus)
extern "C" {
Expand All @@ -52,7 +54,9 @@ typedef struct list_s {
struct list_s *next;
} list;

#if !defined(OMC_NO_THREADS)
static pthread_mutex_t memory_pool_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif
static list *memory_pools = NULL;

static void pool_init(void)
Expand Down Expand Up @@ -100,11 +104,15 @@ static void* pool_malloc(size_t sz)
{
void *res;
sz = round_up(sz,8);
#if !defined(OMC_NO_THREADS)
pthread_mutex_lock(&memory_pool_mutex);
#endif
pool_expand(sz);
res = (void*)((char*)memory_pools->memory + memory_pools->used);
memory_pools->used += sz;
#if !defined(OMC_NO_THREADS)
pthread_mutex_unlock(&memory_pool_mutex);
#endif
memset(res,0,sz);
return res;
}
Expand Down
4 changes: 4 additions & 0 deletions SimulationRuntime/c/gc/omc_gc.h
Expand Up @@ -44,7 +44,9 @@ extern "C" {
#endif

#include <stdlib.h>
#if !defined(OMC_NO_THREADS)
#include <pthread.h>
#endif
#include <setjmp.h>

#if defined(_MSC_VER)
Expand Down Expand Up @@ -126,7 +128,9 @@ typedef struct threadData_s {
jmp_buf *simulationJumpBuffer;
errorStage currentErrorStage;
struct threadData_s *parent;
#if !defined(OMC_NO_THREADS)
pthread_mutex_t parentMutex; /* Prevent children from all manipulating the parent at the same time */
#endif
void *plotClassPointer;
PlotCallback plotCB;
void *stackBottom; /* Actually offset 64 kB from bottom, just to never reach the bottom */
Expand Down
1 change: 0 additions & 1 deletion SimulationRuntime/c/meta/meta_modelica.h
Expand Up @@ -41,7 +41,6 @@
extern "C" {
#endif

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
Expand Down
1 change: 0 additions & 1 deletion SimulationRuntime/c/meta/meta_modelica_segv.h
Expand Up @@ -33,7 +33,6 @@
#ifndef META_MODELICA_SEGV_H_
#define META_MODELICA_SEGV_H_

#include <pthread.h>
#include <setjmp.h>

#define MMC_TRY_STACK() { jmp_buf *oldMMCJumper = threadData->mmc_jumper; { MMC_TRY_INTERNAL(mmc_stack_overflow_jumper) threadData->mmc_stack_overflow_jumper = &new_mmc_jumper;
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/openmodelica.h
Expand Up @@ -75,7 +75,7 @@ extern "C" {
#endif

/* BEFORE: compat.h */
#if defined(__MINGW32__) || defined(_MSC_VER)
#if defined(__MINGW32__) || defined(_MSC_VER) || defined(__AVR__)
#define EXIT(code) exit(code)
#else
/* We need to patch exit() on Unix systems
Expand Down
7 changes: 6 additions & 1 deletion SimulationRuntime/c/simulation/simulation_info_json.c
Expand Up @@ -367,15 +367,18 @@ static void readInfoJson(const char *str,MODEL_DATA_XML *xml)

void modelInfoInit(MODEL_DATA_XML* xml)
{
#if !defined(OMC_NO_FILESYSTEM)
omc_mmap_read mmap_reader = {0};
#endif
rt_tick(0);
#if !defined(OMC_NO_FILESYSTEM)
if (!xml->infoXMLData) {
mmap_reader = omc_mmap_open_read(xml->fileName);
xml->infoXMLData = mmap_reader.data;
xml->modelInfoXmlLength = mmap_reader.size;
// fprintf(stderr, "Loaded the JSON (%ld kB)...\n", (long) (s.st_size+1023)/1024);
}

#endif
xml->functionNames = (FUNCTION_INFO*) calloc(xml->nFunctions, sizeof(FUNCTION_INFO));
xml->equationInfo = (EQUATION_INFO*) calloc(1+xml->nEquations, sizeof(EQUATION_INFO));
xml->equationInfo[0].id = 0;
Expand All @@ -388,7 +391,9 @@ void modelInfoInit(MODEL_DATA_XML* xml)
// fprintf(stderr, "Parse the JSON %ld...\n", (long) xml->infoXMLData);
readInfoJson(xml->infoXMLData, xml);
// fprintf(stderr, "Parsed the JSON in %fms...\n", rt_tock(0) * 1000.0);
#if !defined(OMC_NO_FILESYSTEM)
omc_mmap_close_read(mmap_reader);
#endif
}

FUNCTION_INFO modelInfoGetFunction(MODEL_DATA_XML* xml, size_t ix)
Expand Down
3 changes: 3 additions & 0 deletions SimulationRuntime/c/simulation/solver/delay.c
Expand Up @@ -28,6 +28,8 @@
*
*/

#if !defined(OMC_NDELAY_EXPRESSIONS) || OMC_NDELAY_EXPRESSIONS>0

/*! \file delay.c
*/

Expand Down Expand Up @@ -207,3 +209,4 @@ double delayImpl(DATA* data, threadData_t *threadData, int exprNumber, double ex

}

#endif

0 comments on commit a50dbe1

Please sign in to comment.