From 9480dcab4b9f20dd1c6f35e684fef98db09486c8 Mon Sep 17 00:00:00 2001 From: Mark Winter <mwinter@drexel.edu> Date: Sun, 1 Mar 2020 16:29:28 +0100 Subject: [PATCH] Static global script-configuration class for loading settings from environment variable --- src/c/CudaMex.vcxproj | 1 + src/c/CudaMex.vcxproj.filters | 3 ++ src/c/CudaPy3DLL.vcxproj | 1 + src/c/CudaPy3DLL.vcxproj.filters | 3 ++ src/c/Mex/CudaMex.cpp | 4 +- src/c/Mex/MexCommandModule.cpp | 1 + src/c/Python/PyCommandModule.cpp | 2 +- src/c/Python/hip_module.cpp | 2 + src/c/ScriptCmds/HydraConfig.h | 65 +++++++++++++++++++++++++++++++ src/c/ScriptCmds/ScriptIncludes.h | 2 + 10 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/c/ScriptCmds/HydraConfig.h diff --git a/src/c/CudaMex.vcxproj b/src/c/CudaMex.vcxproj index 3860364c..d70e3a1c 100644 --- a/src/c/CudaMex.vcxproj +++ b/src/c/CudaMex.vcxproj @@ -127,6 +127,7 @@ copy $(OutDir)CudaMex.dll "$(ProjectDir)Mex.mexw64"</Command> <ClInclude Include="ScriptCmds\Commands\ScrCmdVarFilter.h" /> <ClInclude Include="ScriptCmds\Commands\ScrCmdWienerFilter.h" /> <ClInclude Include="ScriptCmds\GenCommands.h" /> + <ClInclude Include="ScriptCmds\HydraConfig.h" /> <ClInclude Include="ScriptCmds\ScopedProcessMutex.h" /> <ClInclude Include="ScriptCmds\ScriptCommand.h" /> <ClInclude Include="ScriptCmds\ScriptCommandDefines.h" /> diff --git a/src/c/CudaMex.vcxproj.filters b/src/c/CudaMex.vcxproj.filters index c2c47e84..e7285431 100644 --- a/src/c/CudaMex.vcxproj.filters +++ b/src/c/CudaMex.vcxproj.filters @@ -156,6 +156,9 @@ <ClInclude Include="ScriptCmds\ScopedProcessMutex.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="ScriptCmds\HydraConfig.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="Mex\CudaMex.cpp"> diff --git a/src/c/CudaPy3DLL.vcxproj b/src/c/CudaPy3DLL.vcxproj index d1fb77e7..6801ec44 100644 --- a/src/c/CudaPy3DLL.vcxproj +++ b/src/c/CudaPy3DLL.vcxproj @@ -57,6 +57,7 @@ <ClInclude Include="ScriptCmds\Commands\ScrCmdVarFilter.h" /> <ClInclude Include="ScriptCmds\Commands\ScrCmdWienerFilter.h" /> <ClInclude Include="ScriptCmds\GenCommands.h" /> + <ClInclude Include="ScriptCmds\HydraConfig.h" /> <ClInclude Include="ScriptCmds\ScopedProcessMutex.h" /> <ClInclude Include="ScriptCmds\ScriptCommand.h" /> <ClInclude Include="ScriptCmds\ScriptCommandDefines.h" /> diff --git a/src/c/CudaPy3DLL.vcxproj.filters b/src/c/CudaPy3DLL.vcxproj.filters index c691ca69..f8a085fc 100644 --- a/src/c/CudaPy3DLL.vcxproj.filters +++ b/src/c/CudaPy3DLL.vcxproj.filters @@ -167,5 +167,8 @@ <ClInclude Include="ScriptCmds\ScopedProcessMutex.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="ScriptCmds\HydraConfig.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> </Project> diff --git a/src/c/Mex/CudaMex.cpp b/src/c/Mex/CudaMex.cpp index b331b7b8..062a57ae 100644 --- a/src/c/Mex/CudaMex.cpp +++ b/src/c/Mex/CudaMex.cpp @@ -5,7 +5,9 @@ #define DLL_EXPORT_SYM __attribute__((visibility("default"))) #endif -#include "MexIncludes.h" +#include "ScriptCmds/ScriptIncludes.h" + +HYDRA_CONFIG_MODULE(); void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { diff --git a/src/c/Mex/MexCommandModule.cpp b/src/c/Mex/MexCommandModule.cpp index 5a1d3150..09bc45e5 100644 --- a/src/c/Mex/MexCommandModule.cpp +++ b/src/c/Mex/MexCommandModule.cpp @@ -1 +1,2 @@ +#include "ScriptCmds/HydraConfig.h" #include "ScriptCmds/ScriptCommandModule.h" diff --git a/src/c/Python/PyCommandModule.cpp b/src/c/Python/PyCommandModule.cpp index 7f94d610..09bc45e5 100644 --- a/src/c/Python/PyCommandModule.cpp +++ b/src/c/Python/PyCommandModule.cpp @@ -1,2 +1,2 @@ - +#include "ScriptCmds/HydraConfig.h" #include "ScriptCmds/ScriptCommandModule.h" diff --git a/src/c/Python/hip_module.cpp b/src/c/Python/hip_module.cpp index eef11b2b..598e9396 100644 --- a/src/c/Python/hip_module.cpp +++ b/src/c/Python/hip_module.cpp @@ -4,6 +4,8 @@ #define NUMPY_IMPORT_MODULE #include "ScriptCmds/ScriptIncludes.h" +HYDRA_CONFIG_MODULE(); + // Make this a unique pointer just in case init can be run more than once static std::unique_ptr<PyMethodDef[]> hip_methods = nullptr; static std::unique_ptr<std::string[]> hip_docstrs = nullptr; diff --git a/src/c/ScriptCmds/HydraConfig.h b/src/c/ScriptCmds/HydraConfig.h new file mode 100644 index 00000000..1f1784ed --- /dev/null +++ b/src/c/ScriptCmds/HydraConfig.h @@ -0,0 +1,65 @@ +#pragma once +// HydraConfig - Provides a simple environment-variable based config loader to allow some +// configuration of the Hyrda library (e.g. enabling process-level mutex) + +#include <cstdlib> +#include <cstring> +#include <string> +#include <algorithm> + +class HydraConfig +{ +public: + static bool validConfig() + { + return m_staticInst; + } + + static bool useProcessMutex() + { + if (!m_staticInst) + return false; + + return m_staticInst->bUseProcessMutex; + } + +private: + HydraConfig() + { + defaultConfig(this); + } + + static void defaultConfig(HydraConfig* pInst) + { + pInst->bUseProcessMutex = false; + } + + // TODO: Use env-variable to find a config file instead of env-variables for direct configuration + static void loadConfig(HydraConfig* pInst) + { + char* envUPM = std::getenv("HYDRA_ENABLE_MUTEX"); + if ( envUPM ) + { + std::string envStr(envUPM); + std::transform(envStr.begin(), envStr.end(), envStr.begin(), ::toupper); + + if ( envStr == "TRUE" || envStr == "1" ) + pInst->bUseProcessMutex = true; + } + } + + static HydraConfig* initConfig() + { + HydraConfig* pInst = new HydraConfig(); + + HydraConfig::loadConfig(pInst); + return pInst; + } + +private: + bool bUseProcessMutex; + + static HydraConfig* m_staticInst; +}; + +#define HYDRA_CONFIG_MODULE() HydraConfig* HydraConfig::m_staticInst = HydraConfig::initConfig() diff --git a/src/c/ScriptCmds/ScriptIncludes.h b/src/c/ScriptCmds/ScriptIncludes.h index 724bcacc..c4f9f6c8 100644 --- a/src/c/ScriptCmds/ScriptIncludes.h +++ b/src/c/ScriptCmds/ScriptIncludes.h @@ -11,5 +11,7 @@ #undef max #undef min +#include "ScriptCmds/HydraConfig.h" + #include "ScriptCmds/ScriptHelpers.h" #include "ScriptCmds/ScriptCommand.h" -- GitLab