Bläddra i källkod

Added custom UUID generation in order to replace boost

Marko Pintera 11 år sedan
förälder
incheckning
d57adc4344

+ 2 - 3
BoostPort.txt

@@ -7,8 +7,6 @@ Replace boost::any from Any in POCO
 Replace boost::uid from UUID in POCO
 Temporarily make filesystem use VS filesystem header
 
-
-
 --------------
 Once ported to VS:
  - Remove boost preprocessor macros and use variadic templates
@@ -17,4 +15,5 @@ Once ported to VS:
 
 --------------
 Other:
- - std::function allocates memory yet I'm not using a custom allocator for it.
+ - std::function allocates memory yet I'm not using a custom allocator for it. Replace std::function with custom Function method.
+ - Ability to construct Module without having to do allocation outside of it

+ 9 - 6
CamelotCore/CamelotCore.vcxproj

@@ -150,7 +150,7 @@
     <Link>
       <SubSystem>NotSet</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>CamelotUtility.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>CamelotUtility.lib;IPHLPAPI.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../lib/x86/$(Configuration);../Dependencies/lib/x86/Debug</AdditionalLibraryDirectories>
       <ImportLibrary>..\lib\x86\$(Configuration)\$(TargetName).lib</ImportLibrary>
     </Link>
@@ -168,7 +168,7 @@
     <Link>
       <SubSystem>NotSet</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>CamelotUtility.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>CamelotUtility.lib;IPHLPAPI.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../lib/$(Platform)/$(Configuration);../Dependencies/lib/x64/Debug</AdditionalLibraryDirectories>
       <ImportLibrary>..\lib\$(Platform)\$(Configuration)\$(TargetName).lib</ImportLibrary>
     </Link>
@@ -192,7 +192,7 @@
       <GenerateDebugInformation>false</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>CamelotUtility.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>CamelotUtility.lib;IPHLPAPI.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../lib/x86/$(Configuration);../Dependencies/lib/x86/Release</AdditionalLibraryDirectories>
       <ImportLibrary>..\lib\x86\$(Configuration)\$(TargetName).lib</ImportLibrary>
     </Link>
@@ -217,7 +217,7 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>CamelotUtility.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>CamelotUtility.lib;IPHLPAPI.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../lib/x86/$(Configuration);../Dependencies/lib/x86/DebugRelease</AdditionalLibraryDirectories>
       <ImportLibrary>..\lib\x86\$(Configuration)\$(TargetName).lib</ImportLibrary>
     </Link>
@@ -241,7 +241,7 @@
       <GenerateDebugInformation>false</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>CamelotUtility.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>CamelotUtility.lib;IPHLPAPI.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../lib/$(Platform)/$(Configuration);../Dependencies/lib/x64/Release</AdditionalLibraryDirectories>
       <ImportLibrary>..\lib\$(Platform)\$(Configuration)\$(TargetName).lib</ImportLibrary>
     </Link>
@@ -266,12 +266,13 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>CamelotUtility.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>CamelotUtility.lib;IPHLPAPI.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../lib/$(Platform)/$(Configuration);../Dependencies/lib/x64/DebugRelease</AdditionalLibraryDirectories>
       <ImportLibrary>..\lib\$(Platform)\$(Configuration)\$(TargetName).lib</ImportLibrary>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="Include\BsCommonStructs.h" />
     <ClInclude Include="Include\BsThreadPolicy.h" />
     <ClInclude Include="Include\CmBindableGpuParamBlock.h" />
     <ClInclude Include="Include\CmBindableGpuParams.h" />
@@ -355,6 +356,7 @@
     <ClInclude Include="Include\CmTextData.h" />
     <ClInclude Include="Include\CmTimerQuery.h" />
     <ClInclude Include="Include\CmTransientMesh.h" />
+    <ClInclude Include="Include\CmUUID.h" />
     <ClInclude Include="Include\CmVertexBuffer.h" />
     <ClInclude Include="Include\CmHighLevelGpuProgram.h" />
     <ClInclude Include="Include\CmHighLevelGpuProgramManager.h" />
@@ -481,6 +483,7 @@
     <ClCompile Include="Source\CmTextData.cpp" />
     <ClCompile Include="Source\CmTimerQuery.cpp" />
     <ClCompile Include="Source\CmTransientMesh.cpp" />
+    <ClCompile Include="Source\CmUUID.cpp" />
     <ClCompile Include="Source\CmVertexBuffer.cpp" />
     <ClCompile Include="Source\CmHighLevelGpuProgram.cpp" />
     <ClCompile Include="Source\CmHighLevelGpuProgramManager.cpp" />

+ 9 - 0
CamelotCore/CamelotCore.vcxproj.filters

@@ -531,6 +531,12 @@
     <ClInclude Include="Include\BsThreadPolicy.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsCommonStructs.h">
+      <Filter>Header Files\Utility</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\CmUUID.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\CmApplication.cpp">
@@ -836,5 +842,8 @@
     <ClCompile Include="Source\BsThreadPolicy.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="Source\CmUUID.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 12 - 0
CamelotCore/Include/BsCommonStructs.h

@@ -0,0 +1,12 @@
+#pragma once
+
+namespace BansheeEngine
+{
+	/**
+	* @brief Represents a MAC (ethernet) address.
+	*/
+	struct MACAddress
+	{
+		UINT8 value[6];
+	};
+}

+ 3 - 1
CamelotCore/Include/CmPrerequisites.h

@@ -331,4 +331,6 @@ namespace BansheeEngine
 	 * @param	callback	The callback.
 	 */
 	void CM_EXPORT deferredCall(std::function<void()> callback);
-}
+}
+
+#include "BsCommonStructs.h"

+ 34 - 0
CamelotCore/Include/CmUUID.h

@@ -0,0 +1,34 @@
+#pragma once
+
+#include "CmPrerequisites.h"
+#include "CmModule.h"
+#include <random>
+
+namespace BansheeEngine
+{
+	/**
+	 * @brief	Utility class for generating universally unique identifiers.
+	 *
+	 * @note	Thread safe.
+	 */
+	class CM_EXPORT UUIDGenerator : public Module<UUIDGenerator>
+	{
+		enum UUIDVersion
+		{
+			UUIDV_TimeBased = 0x01
+		};
+
+	public:
+		UUIDGenerator();
+
+		/**
+		 * @brief	Generate a new random universally unique identifier.
+		 */
+		String generateRandom();
+
+	private:
+		std::mt19937 mRandomGenerator;
+		MACAddress mMACAddress;
+		bool mHaveMacAddress;
+	};
+}

+ 6 - 0
CamelotCore/Include/Win32/CmPlatformImpl.h

@@ -191,6 +191,12 @@ namespace BansheeEngine
 		 */
 		static WString copyFromClipboard();
 
+		/**
+		 * @brief	Populates the provided buffer with a MAC address of the first available
+		 *			adapter, if one exists. If no adapters exist, returns false.
+		 */
+		static bool getMACAddress(MACAddress& address);
+
 		/**
 		 * @brief	Queries the internal system performance counter you can use for very precise time
 		 * 			measurements. Value is in milliseconds.

+ 4 - 0
CamelotCore/Source/CmApplication.cpp

@@ -35,6 +35,7 @@
 #include "BsThreadPool.h"
 #include "BsThreadPolicy.h"
 #include "BsTaskScheduler.h"
+#include "CmUUID.h"
 
 #include "CmMaterial.h"
 #include "CmShader.h"
@@ -58,6 +59,7 @@ namespace BansheeEngine
 		Platform::_startUp();
 		MemStack::beginThread();
 
+		UUIDGenerator::startUp(cm_new<UUIDGenerator>());
 		Profiler::startUp(cm_new<Profiler>());
 		ThreadPool::startUp(cm_new<TThreadPool<ThreadBansheePolicy>>(numWorkerThreads));
 		TaskScheduler::startUp(cm_new<TaskScheduler>());
@@ -203,6 +205,8 @@ namespace BansheeEngine
 		TaskScheduler::shutDown();
 		ThreadPool::shutDown();
 		Profiler::shutDown();
+		UUIDGenerator::shutDown();
+
 		MemStack::endThread();
 		Platform::_shutDown();
 	}

+ 2 - 2
CamelotCore/Source/CmResources.cpp

@@ -94,7 +94,7 @@ namespace BansheeEngine
 		}
 
 		if(!foundUUID)
-			uuid = UUIDGenerator::generateRandom();
+			uuid = UUIDGenerator::instance().generateRandom();
 
 		{
 			CM_LOCK_MUTEX(mLoadedResourceMutex);
@@ -252,7 +252,7 @@ namespace BansheeEngine
 
 	HResource Resources::createResourceHandle(const ResourcePtr& obj)
 	{
-		String uuid = UUIDGenerator::generateRandom();
+		String uuid = UUIDGenerator::instance().generateRandom();
 		HResource newHandle(obj, uuid);
 
 		{

+ 76 - 0
CamelotCore/Source/CmUUID.cpp

@@ -0,0 +1,76 @@
+#include "CmUUID.h"
+#include "CmPlatform.h"
+#include <chrono>
+
+using namespace std::chrono;
+
+namespace BansheeEngine
+{
+	UUIDGenerator::UUIDGenerator()
+		:mRandomGenerator((unsigned int)system_clock::now().time_since_epoch().count())
+	{
+		mHaveMacAddress = Platform::getMACAddress(mMACAddress);
+	}
+
+	void appendHex(String& str, UINT8 n)
+	{
+		static const char* digits = "0123456789abcdef";
+		str += digits[(n >> 4) & 0xF];
+		str += digits[n & 0xF];
+	}
+
+
+	void appendHex(String& str, UINT16 n)
+	{
+		appendHex(str, UINT8(n >> 8));
+		appendHex(str, UINT8(n & 0xFF));
+	}
+
+
+	void appendHex(String& str, UINT32 n)
+	{
+		appendHex(str, UINT16(n >> 16));
+		appendHex(str, UINT16(n & 0xFFFF));
+	}
+
+
+	String UUIDGenerator::generateRandom()
+	{
+		ScopedSpinLock lock;
+
+		auto timestamp = system_clock::now().time_since_epoch().count();
+
+		UINT32 timeLow = UINT32(timestamp & 0xFFFFFFFF);
+		UINT16 timeMid = UINT16((timestamp >> 32) & 0xFFFF);
+		UINT16 timeHiAndVersion = UINT16((timestamp >> 48) & 0x0FFF) + (UUIDV_TimeBased << 12);
+		UINT16 clockSeq = (UINT16(mRandomGenerator() >> 4) & 0x3FFF) | 0x8000;
+
+		String result;
+		result.reserve(36);
+
+		appendHex(result, timeLow);
+		result += '-';
+
+		appendHex(result, timeMid);
+		result += '-';
+
+		appendHex(result, timeHiAndVersion);
+		result += '-';
+
+		appendHex(result, clockSeq);
+		result += '-';
+
+		if (mHaveMacAddress)
+		{
+			for (int i = 0; i < sizeof(MACAddress); ++i)
+				appendHex(result, mMACAddress.value[i]);
+		}
+		else
+		{
+			for (int i = 0; i < sizeof(MACAddress); ++i)
+				appendHex(result, (UINT8)(mRandomGenerator() % 255));
+		}
+
+		return result;
+	}
+};

+ 42 - 0
CamelotCore/Source/Win32/CmPlatformImpl.cpp

@@ -5,6 +5,7 @@
 #include "CmWin32Defs.h"
 #include "CmDebug.h"
 #include "Win32/CmWin32DropTarget.h"
+#include <iphlpapi.h>
 
 namespace BansheeEngine
 {
@@ -329,6 +330,47 @@ namespace BansheeEngine
 		return L"";
 	}
 
+	bool Platform::getMACAddress(MACAddress& address)
+	{
+		std::memset(&address, 0, sizeof(address));
+
+		PIP_ADAPTER_INFO adapterInfo = cm_alloc<IP_ADAPTER_INFO>();
+		
+		ULONG len = sizeof(IP_ADAPTER_INFO);
+		DWORD rc = GetAdaptersInfo(adapterInfo, &len);
+
+		if (rc == ERROR_BUFFER_OVERFLOW)
+		{
+			cm_free(adapterInfo);
+			adapterInfo = reinterpret_cast<IP_ADAPTER_INFO*>(cm_alloc(len));
+		}
+		else if (rc != ERROR_SUCCESS)
+		{
+			cm_free(adapterInfo);
+			return false;
+		}
+
+		if (GetAdaptersInfo(adapterInfo, &len) == NO_ERROR)
+		{
+			PIP_ADAPTER_INFO curAdapter = nullptr;
+			curAdapter = adapterInfo;
+
+			while (curAdapter)
+			{
+				if (curAdapter->Type == MIB_IF_TYPE_ETHERNET && curAdapter->AddressLength == sizeof(address))
+				{
+					std::memcpy(&address, curAdapter->Address, curAdapter->AddressLength);
+					return true;
+				}
+
+				curAdapter = curAdapter->Next;
+			}
+		}
+
+		cm_free(adapterInfo);
+		return false;
+	}
+
 	double Platform::queryPerformanceTimerMs()
 	{
 		LARGE_INTEGER counterValue;

+ 0 - 2
CamelotUtility/CamelotUtility.vcxproj

@@ -264,7 +264,6 @@
     <ClCompile Include="Source\CmSphere.cpp" />
     <ClCompile Include="Source\CmStringTable.cpp" />
     <ClCompile Include="Source\CmTexAtlasGenerator.cpp" />
-    <ClCompile Include="Source\CmUUID.cpp" />
     <ClCompile Include="Source\Win32\CmTimer.cpp" />
     <ClInclude Include="Include\BsEvent.h" />
     <ClInclude Include="Include\BsSpinLock.h" />
@@ -322,7 +321,6 @@
     <ClInclude Include="Include\CmSphere.h" />
     <ClInclude Include="Include\CmStdHeaders.h" />
     <ClInclude Include="Include\CmUtil.h" />
-    <ClInclude Include="Include\CmUUID.h" />
     <ClInclude Include="Include\CmVector2.h" />
     <ClInclude Include="Include\CmVector3.h" />
     <ClInclude Include="Include\CmVector4.h" />

+ 0 - 6
CamelotUtility/CamelotUtility.vcxproj.filters

@@ -120,9 +120,6 @@
     <ClInclude Include="Include\CmLog.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="Include\CmUUID.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="Include\CmPath.h">
       <Filter>Header Files</Filter>
     </ClInclude>
@@ -314,9 +311,6 @@
     <ClCompile Include="Source\Win32\CmTimer.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="Source\CmUUID.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="Source\CmManagedDataBlock.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>

+ 0 - 18
CamelotUtility/Include/CmUUID.h

@@ -1,18 +0,0 @@
-#pragma once
-
-#include "CmPrerequisitesUtil.h"
-
-namespace BansheeEngine
-{
-	/**
-	 * @brief	Utility class for generating universally unique identifiers.
-	 */
-	class CM_UTILITY_EXPORT UUIDGenerator
-	{
-	public:
-		/**
-		 * @brief	Generate a new random universally unique identifier.
-		 */
-		static String generateRandom();
-	};
-}

+ 0 - 18
CamelotUtility/Source/CmUUID.cpp

@@ -1,18 +0,0 @@
-#include "CmUUID.h"
-#include <boost/uuid/uuid.hpp>
-#include <boost/uuid/uuid_generators.hpp>
-#include <boost/uuid/uuid_io.hpp>
-
-using namespace boost::uuids;
-
-namespace BansheeEngine
-{
-	String UUIDGenerator::generateRandom()
-	{
-		static random_generator gen;
-
-		uuid newUUID = gen();
-
-		return to_string(newUUID).c_str();
-	}
-};