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