diff --git a/Compiler/Template/CodegenC.tpl b/Compiler/Template/CodegenC.tpl index 0776e0e45d9..787a0646895 100644 --- a/Compiler/Template/CodegenC.tpl +++ b/Compiler/Template/CodegenC.tpl @@ -5156,7 +5156,7 @@ template functionHeaderImpl(String fname, list fargs, list o let inFnStr = if boolAnd(boxed,inFunc) then << DLLExport - int in_<%fname%>(type_description * inArgs, type_description * outVar); + int in_<%fname%>(threadData_t *threadData, type_description * inArgs, type_description * outVar); >> match visibility case PROTECTED(__) then @@ -5663,13 +5663,13 @@ template generateInFunc(Text fname, list functionArguments, list(type_description * inArgs, type_description * outVar) + int in_<%fname%>(threadData_t *threadData, type_description * inArgs, type_description * outVar) { - if (!mmc_GC_state) mmc_GC_init(); + //if (!mmc_GC_state) mmc_GC_init(); <%functionArguments |> var => '<%funArgDefinition(var)%>;' ;separator="\n"%> <%outVars |> var => '<%funArgDefinition(var)%>;' ;separator="\n"%> <%functionArguments |> arg => readInVar(arg) ;separator="\n"%> - MMC_TRY_TOP() + MMC_TRY_TOP_INTERNAL() <%match outVars case v::_ then '<%funArgName(v)%> = ' %>omc_<%fname%>(threadData<%functionArguments |> var => (", " + funArgName(var) )%><%List.restOrEmpty(outVars) |> var => (", &" + funArgName(var) )%>); diff --git a/Compiler/Util/DynLoad.mo b/Compiler/Util/DynLoad.mo index de29a94ca15..7ef2f8e23ed 100644 --- a/Compiler/Util/DynLoad.mo +++ b/Compiler/Util/DynLoad.mo @@ -47,7 +47,7 @@ of values." input Boolean inPrintDebug; output Values.Value outVal; - external "C" outVal=DynLoad_executeFunction(inFuncHandle,inValLst,inPrintDebug) annotation(Library = "omcruntime"); + external "C" outVal=DynLoad_executeFunction(OpenModelica.threadData(),inFuncHandle,inValLst,inPrintDebug) annotation(Library = "omcruntime"); end executeFunction; annotation(__OpenModelica_Interface="frontend"); diff --git a/Compiler/runtime/Dynload.cpp b/Compiler/runtime/Dynload.cpp index e7642041159..8819e00509d 100644 --- a/Compiler/runtime/Dynload.cpp +++ b/Compiler/runtime/Dynload.cpp @@ -43,8 +43,9 @@ extern "C" { static void *type_desc_to_value(type_description *desc); static int value_to_type_desc(void *value, type_description *desc); -static int execute_function(void *in_arg, void **out_arg, - int (* func)(type_description *, +static int execute_function(threadData_t* threadData, void *in_arg, void **out_arg, + int (* func)(threadData_t*, + type_description *, type_description *), int printDebug); static int parse_array(type_description *desc, void *arrdata, void *dimLst); static void *value_to_mmc(void* value); @@ -158,8 +159,10 @@ static int value_to_type_desc(void *value, type_description *desc) return 0; } -static int execute_function(void *in_arg, void **out_arg, - int (* func)(type_description *, +static int execute_function(threadData_t* threadData, + void *in_arg, void **out_arg, + int (* func)(threadData_t*, + type_description *, type_description *), int printDebug) { type_description arglst[MMC_NUM_ARGS + 1], crashbuf[50], *arg = NULL; @@ -199,7 +202,7 @@ static int execute_function(void *in_arg, void **out_arg, fflush(stdout); /* call our function pointer! */ try { /* Don't let external C functions throwing C++ exceptions kill OMC! */ - retval = func(arglst, &retarg); + retval = func(threadData, arglst, &retarg); } catch (...) { retval = 1; } diff --git a/Compiler/runtime/Dynload_omc.cpp b/Compiler/runtime/Dynload_omc.cpp index 114c2be3bd4..062812286a3 100644 --- a/Compiler/runtime/Dynload_omc.cpp +++ b/Compiler/runtime/Dynload_omc.cpp @@ -43,7 +43,7 @@ extern "C" { #include "Dynload.cpp" #include "ModelicaUtilities.h" -extern void* DynLoad_executeFunction(int _inFuncHandle, void* _inValLst, int _inPrintDebug) +extern void* DynLoad_executeFunction(threadData_t* threadData, int _inFuncHandle, void* _inValLst, int _inPrintDebug) { modelica_ptr_t func = NULL; int retval = -1; @@ -51,12 +51,13 @@ extern void* DynLoad_executeFunction(int _inFuncHandle, void* _inValLst, int _in func = lookup_ptr(_inFuncHandle); if (func == NULL) MMC_THROW(); - retval = execute_function(_inValLst, &retarg, func->data.func.handle, _inPrintDebug); + retval = execute_function(threadData, _inValLst, &retarg, func->data.func.handle, _inPrintDebug); if (retval) MMC_THROW(); return retarg; } extern void* omc_Absyn_pathString2(threadData_t*,void*,void*); + static const char* path_to_name(void* path, char del) { threadData_t *threadData = (threadData_t *) pthread_getspecific(mmc_thread_data_key); diff --git a/Compiler/runtime/printimpl.c b/Compiler/runtime/printimpl.c index 2ab7b63741d..6acfae6ba42 100644 --- a/Compiler/runtime/printimpl.c +++ b/Compiler/runtime/printimpl.c @@ -346,7 +346,7 @@ static int PrintImpl__writeBuf(threadData_t *threadData,const char* filename) if (buf == NULL || buf[0]=='\0') { /* nothing to write to file, just close it and return ! */ fclose(file); - return 1; + return 0; } /* write 1 element of size nfilled to file and check for errors */ diff --git a/Compiler/runtime/systemimpl.h b/Compiler/runtime/systemimpl.h index 3b9dfbfba1c..3a13d14d8b7 100644 --- a/Compiler/runtime/systemimpl.h +++ b/Compiler/runtime/systemimpl.h @@ -36,7 +36,7 @@ char* _replace(const char* source_str, const char* search_str, const char* replace_str); -typedef int (*function_t)(type_description*, type_description*); +typedef int (*function_t)(threadData_t*, type_description*, type_description*); #if defined(_MSC_VER) /* no gettext for VS! */ #define gettext(str) str