diff --git a/Source/Engine/Platform/Base/NetworkBase.cpp b/Source/Engine/Platform/Base/NetworkBase.cpp
index 6a83cd9f6..06f297cc1 100644
--- a/Source/Engine/Platform/Base/NetworkBase.cpp
+++ b/Source/Engine/Platform/Base/NetworkBase.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
+// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
#include "NetworkBase.h"
@@ -101,4 +101,3 @@ NetworkEndPoint NetworkBase::RemapEndPointToIPv6(NetworkEndPoint& endPoint)
{
return NetworkEndPoint();
}
-
diff --git a/Source/Engine/Platform/Base/NetworkBase.h b/Source/Engine/Platform/Base/NetworkBase.h
index 7e039e2a6..6e6821ab4 100644
--- a/Source/Engine/Platform/Base/NetworkBase.h
+++ b/Source/Engine/Platform/Base/NetworkBase.h
@@ -5,20 +5,27 @@
#include "Engine/Core/Types/BaseTypes.h"
#include "Engine/Core/Types/String.h"
API_INJECT_CPP_CODE("#include \"Engine/Platform/Network.h\"");
+
#define SOCKGROUP_MAXCOUNT 64
#define SOCKGROUP_ITEMSIZE 16
enum class FLAXENGINE_API NetworkProtocolType
{
+ /// Not specified.
Undefined,
+ /// User Datagram Protocol.
Udp,
+ /// Transmission Control Protocol.
Tcp
};
enum class FLAXENGINE_API NetworkIPVersion
{
+ /// Not specified.
Undefined,
+ /// Internet Protocol version 4.
IPv4,
+ /// Internet Protocol version 6.
IPv6
};
@@ -26,7 +33,7 @@ struct FLAXENGINE_API NetworkSocket
{
NetworkProtocolType Protocol = NetworkProtocolType::Undefined;
NetworkIPVersion IPVersion = NetworkIPVersion::Undefined;
- byte Data[8] = {}; // sizeof SOCKET = unsigned __int64
+ byte Data[8] = {};
};
struct FLAXENGINE_API NetworkEndPoint
@@ -34,26 +41,41 @@ struct FLAXENGINE_API NetworkEndPoint
NetworkIPVersion IPVersion = NetworkIPVersion::Undefined;
String Address;
String Port;
- byte Data[28] = {}; // sizeof sockaddr_in6 , biggest sockaddr that we will use
+ byte Data[28] = {};
};
-enum FLAXENGINE_API NetworkSocketOption
+enum class FLAXENGINE_API NetworkSocketOption
{
+ /// Enables debugging info recording.
Debug,
+ /// Allows local address reusing.
ReuseAddr,
+ /// Keeps connections alive.
KeepAlive,
+ /// Indicates that outgoing data should be sent on whatever interface the socket is bound to and not a routed on some other interface.
DontRoute,
+ /// Allows for sending broadcast data.
Broadcast,
+ /// Uses the local loopback address when sending data from this socket.
UseLoopback,
+ /// Lingers on close if data present.
Linger,
+ /// Allows out-of-bound data to be returned in-line with regular data.
OOBInline,
+ /// Socket send data buffer size.
SendBuffer,
+ /// Socket receive data buffer size.
RecvBuffer,
+ /// The timeout in milliseconds for blocking send calls.
SendTimeout,
+ /// The timeout in milliseconds for blocking receive calls.
RecvTimeout,
+ /// The last socket error code.
Error,
+ /// Enables the Nagle algorithm for TCP sockets.
NoDelay,
- IPv6Only
+ /// Enables IPv6 communication only for TCP socket.
+ IPv6Only,
};
struct FLAXENGINE_API NetworkSocketState
@@ -68,12 +90,12 @@ struct FLAXENGINE_API NetworkSocketState
struct FLAXENGINE_API NetworkSocketGroup
{
uint32 Count = 0;
- byte Data[SOCKGROUP_MAXCOUNT * 16] = {};
+ byte Data[SOCKGROUP_MAXCOUNT * SOCKGROUP_ITEMSIZE] = {};
};
class FLAXENGINE_API NetworkBase
{
- public:
+public:
///
/// Creates a new native socket.
///
@@ -241,4 +263,3 @@ class FLAXENGINE_API NetworkBase
/// The ipv6 end point.
static NetworkEndPoint RemapEndPointToIPv6(NetworkEndPoint& endPoint);
};
-
diff --git a/Source/Engine/Platform/UWP/UWPPlatform.cpp b/Source/Engine/Platform/UWP/UWPPlatform.cpp
index 3bd654f10..ed01948aa 100644
--- a/Source/Engine/Platform/UWP/UWPPlatform.cpp
+++ b/Source/Engine/Platform/UWP/UWPPlatform.cpp
@@ -111,6 +111,7 @@ void UWPPlatform::BeforeExit()
void UWPPlatform::Exit()
{
+ Win32Platform::Exit();
}
int32 UWPPlatform::GetDpi()
diff --git a/Source/Engine/Platform/Win32/Win32Network.cpp b/Source/Engine/Platform/Win32/Win32Network.cpp
index edadd2267..2da68957b 100644
--- a/Source/Engine/Platform/Win32/Win32Network.cpp
+++ b/Source/Engine/Platform/Win32/Win32Network.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
+// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
#include "Win32Network.h"
#include "Engine/Core/Log.h"
@@ -12,8 +12,10 @@
static_assert(sizeof NetworkSocket::Data >= sizeof SOCKET, "NetworkSocket::Data is not big enough to contains SOCKET !");
static_assert(sizeof NetworkEndPoint::Data >= sizeof sockaddr_in6, "NetworkEndPoint::Data is not big enough to contains sockaddr_in6 !");
+// @formatter:off
static const IN6_ADDR v4MappedPrefix = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } };
+// @formatter:on
/*
* Known issues :
@@ -24,9 +26,9 @@ static String GetErrorMessage(int error)
{
wchar_t* s = nullptr;
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- nullptr, error,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- reinterpret_cast(&s), 0, nullptr);
+ nullptr, error,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ reinterpret_cast(&s), 0, nullptr);
String str(s);
LocalFree(s);
return str;
@@ -72,11 +74,11 @@ static bool CreateEndPointFromAddr(sockaddr* addr, NetworkEndPoint& endPoint)
LOG(Error, "Unable to create endpoint, sockaddr must be INET or INET6! Family : {0}", addr->sa_family);
return true;
}
-
+
char ip[INET6_ADDRSTRLEN];
if (inet_ntop(addr->sa_family, paddr, ip, INET6_ADDRSTRLEN) == nullptr)
{
- LOG(Error, "Unable to extract address from sockaddr! Error : {0}", GetLastErrorMessage().Get());
+ LOG(Error, "Unable to extract address from sockaddr! Error : {0}", GetLastErrorMessage());
return true;
}
endPoint.Address = String(ip);
@@ -107,7 +109,7 @@ static void PrintAddrFromInfo(addrinfoW& info)
char str[INET6_ADDRSTRLEN];
inet_ntop(curr->ai_family, addr, str, INET6_ADDRSTRLEN);
- LOG(Info, "ADDR INFO family : {0} socktype : {1}, proto : {2} address : {3}", curr->ai_family, curr->ai_socktype, curr->ai_protocol, StringAnsi(str).ToString().Get());
+ LOG(Info, "ADDR INFO family : {0} socktype : {1}, proto : {2} address : {3}", curr->ai_family, curr->ai_socktype, curr->ai_protocol, StringAnsi(str).ToString());
}
}
@@ -115,21 +117,21 @@ static void TranslateSockOptToNative(NetworkSocketOption option, int32* level, i
{
switch (option)
{
- SOCKOPT(NetworkSocketOption::Debug, SOL_SOCKET, SO_DEBUG)
- SOCKOPT(NetworkSocketOption::ReuseAddr, SOL_SOCKET, SO_REUSEADDR)
- SOCKOPT(NetworkSocketOption::KeepAlive, SOL_SOCKET, SO_KEEPALIVE)
- SOCKOPT(NetworkSocketOption::DontRoute, SOL_SOCKET, SO_DONTROUTE)
- SOCKOPT(NetworkSocketOption::Broadcast, SOL_SOCKET, SO_BROADCAST)
- SOCKOPT(NetworkSocketOption::UseLoopback, SOL_SOCKET, SO_USELOOPBACK)
- SOCKOPT(NetworkSocketOption::Linger, SOL_SOCKET, SO_LINGER)
- SOCKOPT(NetworkSocketOption::OOBInline, SOL_SOCKET, SO_OOBINLINE)
- SOCKOPT(NetworkSocketOption::SendBuffer, SOL_SOCKET, SO_SNDBUF)
- SOCKOPT(NetworkSocketOption::RecvBuffer, SOL_SOCKET, SO_RCVBUF)
- SOCKOPT(NetworkSocketOption::SendTimeout, SOL_SOCKET, SO_SNDTIMEO)
- SOCKOPT(NetworkSocketOption::RecvTimeout, SOL_SOCKET, SO_RCVTIMEO)
- SOCKOPT(NetworkSocketOption::Error, SOL_SOCKET, SO_ERROR)
- SOCKOPT(NetworkSocketOption::NoDelay, IPPROTO_TCP, TCP_NODELAY)
- SOCKOPT(NetworkSocketOption::IPv6Only, IPPROTO_IPV6, IPV6_V6ONLY)
+ SOCKOPT(NetworkSocketOption::Debug, SOL_SOCKET, SO_DEBUG)
+ SOCKOPT(NetworkSocketOption::ReuseAddr, SOL_SOCKET, SO_REUSEADDR)
+ SOCKOPT(NetworkSocketOption::KeepAlive, SOL_SOCKET, SO_KEEPALIVE)
+ SOCKOPT(NetworkSocketOption::DontRoute, SOL_SOCKET, SO_DONTROUTE)
+ SOCKOPT(NetworkSocketOption::Broadcast, SOL_SOCKET, SO_BROADCAST)
+ SOCKOPT(NetworkSocketOption::UseLoopback, SOL_SOCKET, SO_USELOOPBACK)
+ SOCKOPT(NetworkSocketOption::Linger, SOL_SOCKET, SO_LINGER)
+ SOCKOPT(NetworkSocketOption::OOBInline, SOL_SOCKET, SO_OOBINLINE)
+ SOCKOPT(NetworkSocketOption::SendBuffer, SOL_SOCKET, SO_SNDBUF)
+ SOCKOPT(NetworkSocketOption::RecvBuffer, SOL_SOCKET, SO_RCVBUF)
+ SOCKOPT(NetworkSocketOption::SendTimeout, SOL_SOCKET, SO_SNDTIMEO)
+ SOCKOPT(NetworkSocketOption::RecvTimeout, SOL_SOCKET, SO_RCVTIMEO)
+ SOCKOPT(NetworkSocketOption::Error, SOL_SOCKET, SO_ERROR)
+ SOCKOPT(NetworkSocketOption::NoDelay, IPPROTO_TCP, TCP_NODELAY)
+ SOCKOPT(NetworkSocketOption::IPv6Only, IPPROTO_IPV6, IPV6_V6ONLY)
}
}
@@ -144,14 +146,14 @@ bool Win32Network::CreateSocket(NetworkSocket& socket, NetworkProtocolType proto
if ((sock = ::socket(family, stype, prot)) == INVALID_SOCKET)
{
- LOG(Error, "Can't create native socket! Error : {0}", GetLastErrorMessage().Get());
+ LOG(Error, "Can't create native socket! Error : {0}", GetLastErrorMessage());
return true;
}
memcpy(socket.Data, &sock, sizeof sock);
unsigned long value = 1;
if (ioctlsocket(sock, FIONBIO, &value) == SOCKET_ERROR)
{
- LOG(Error, "Can't set socket to NON-BLOCKING type! Error : {0}", GetLastErrorMessage().Get());
+ LOG(Error, "Can't set socket to NON-BLOCKING type! Error : {0}", GetLastErrorMessage());
return true; // Support using blocking socket , need to test it
}
return false;
@@ -181,10 +183,10 @@ bool Win32Network::SetSocketOption(NetworkSocket& socket, NetworkSocketOption op
int32 optnme = 0;
TranslateSockOptToNative(option, &optlvl, &optnme);
-
+
if (setsockopt(*(SOCKET*)socket.Data, optlvl, optnme, (char*)&value, sizeof value) == SOCKET_ERROR)
{
- LOG(Warning, "Unable to set socket option ! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetLastErrorMessage().Get());
+ LOG(Warning, "Unable to set socket option ! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetLastErrorMessage());
return true;
}
return false;
@@ -202,13 +204,13 @@ bool Win32Network::GetSocketOption(NetworkSocket& socket, NetworkSocketOption op
{
int32 optlvl = 0;
int32 optnme = 0;
-
+
TranslateSockOptToNative(option, &optlvl, &optnme);
-
+
int32 size;
if (getsockopt(*(SOCKET*)socket.Data, optlvl, optnme, (char*)value, &size) == SOCKET_ERROR)
{
- LOG(Warning, "Unable to get socket option ! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetLastErrorMessage().Get());
+ LOG(Warning, "Unable to get socket option ! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetLastErrorMessage());
return true;
}
return false;
@@ -222,7 +224,7 @@ bool Win32Network::ConnectSocket(NetworkSocket& socket, NetworkEndPoint& endPoin
int error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
return false;
- LOG(Error, "Unable to connect socket to address! Socket : {0} Address : {1} Port : {2} Error : {3}", *(SOCKET*)socket.Data, endPoint.Address.Get(), endPoint.Port.Get(), GetErrorMessage(error).Get());
+ LOG(Error, "Unable to connect socket to address! Socket : {0} Address : {1} Port : {2} Error : {3}", *(SOCKET*)socket.Data, endPoint.Address, endPoint.Port, GetErrorMessage(error));
return true;
}
return false;
@@ -239,7 +241,7 @@ bool Win32Network::BindSocket(NetworkSocket& socket, NetworkEndPoint& endPoint)
const uint16 size = endPoint.IPVersion == NetworkIPVersion::IPv6 ? sizeof sockaddr_in6 : sizeof sockaddr_in;
if (bind(*(SOCKET*)socket.Data, (const sockaddr*)endPoint.Data, size) == SOCKET_ERROR)
{
- LOG(Error, "Unable to bind socket! Socket : {0} Address : {1} Port : {2} Error : {3}", *(SOCKET*)socket.Data, endPoint.Address.Get(), endPoint.Port.Get(), GetLastErrorMessage().Get());
+ LOG(Error, "Unable to bind socket! Socket : {0} Address : {1} Port : {2} Error : {3}", *(SOCKET*)socket.Data, endPoint.Address, endPoint.Port, GetLastErrorMessage());
return true;
}
return false;
@@ -249,7 +251,7 @@ bool Win32Network::Listen(NetworkSocket& socket, uint16 queueSize)
{
if (listen(*(SOCKET*)socket.Data, (int32)queueSize) == SOCKET_ERROR)
{
- LOG(Error, "Unable to listen ! Socket : {0} Error : {1}", GetLastErrorMessage().Get());
+ LOG(Error, "Unable to listen ! Socket : {0} Error : {1}", GetLastErrorMessage());
return true;
}
return false;
@@ -270,7 +272,7 @@ bool Win32Network::Accept(NetworkSocket& serverSock, NetworkSocket& newSock, Net
int32 error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
return false;
- LOG(Warning, "Unable to accept incoming connection! Socket : {0} Error : {1}", *(SOCKET*)serverSock.Data, GetErrorMessage(error).Get());
+ LOG(Warning, "Unable to accept incoming connection! Socket : {0} Error : {1}", *(SOCKET*)serverSock.Data, GetErrorMessage(error));
return true;
}
memcpy(newSock.Data, &sock, sizeof sock);
@@ -292,7 +294,7 @@ bool Win32Network::IsReadable(NetworkSocket& socket)
int32 error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
return false;
- LOG(Error, "Unable to poll socket! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetErrorMessage(error).Get());
+ LOG(Error, "Unable to poll socket! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetErrorMessage(error));
return false;
}
if (entry.revents & POLLRDNORM)
@@ -310,7 +312,7 @@ bool Win32Network::IsWriteable(NetworkSocket& socket)
int32 error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
return false;
- LOG(Error, "Unable to poll socket! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetErrorMessage(error).Get());
+ LOG(Error, "Unable to poll socket! Socket : {0} Error : {1}", *(SOCKET*)socket.Data, GetErrorMessage(error));
return false;
}
if (entry.revents & POLLWRNORM)
@@ -322,7 +324,7 @@ int32 Win32Network::Poll(NetworkSocketGroup& group)
{
int32 pollret = WSAPoll((pollfd*)group.Data, group.Count, 0);
if (pollret == SOCKET_ERROR)
- LOG(Error, "Unable to poll socket group! Error : {0}", GetLastErrorMessage().Get());
+ LOG(Error, "Unable to poll socket group! Error : {0}", GetLastErrorMessage());
return pollret;
}
@@ -354,7 +356,7 @@ int32 Win32Network::AddSocketToGroup(NetworkSocketGroup& group, NetworkSocket& s
pollinfo.events = POLLRDNORM | POLLWRNORM;
*(pollfd*)&group.Data[group.Count * SOCKGROUP_ITEMSIZE] = pollinfo;
group.Count++;
- return group.Count-1;
+ return group.Count - 1;
}
void Win32Network::ClearGroup(NetworkSocketGroup& group)
@@ -374,7 +376,7 @@ int32 Win32Network::WriteSocket(NetworkSocket socket, byte* data, uint32 length,
{
if ((size = send(*(SOCKET*)socket.Data, (const char*)data, length, 0)) == SOCKET_ERROR)
{
- LOG(Error, "Unable to send data! Socket : {0} Data Length : {1} Error : {2}", *(SOCKET*)socket.Data, length, GetLastErrorMessage().Get());
+ LOG(Error, "Unable to send data! Socket : {0} Data Length : {1} Error : {2}", *(SOCKET*)socket.Data, length, GetLastErrorMessage());
return -1;
}
}
@@ -382,13 +384,13 @@ int32 Win32Network::WriteSocket(NetworkSocket socket, byte* data, uint32 length,
{
if ((size = sendto(*(SOCKET*)socket.Data, (const char*)data, length, 0, (const sockaddr*)endPoint->Data, GetAddrSizeFromEP(*endPoint))) == SOCKET_ERROR)
{
- LOG(Error, "Unable to send data! Socket : {0} Address : {1} Port : {2} Data Length : {3} Error : {4}", *(SOCKET*)socket.Data, endPoint->Address, endPoint->Port, length, GetLastErrorMessage().Get());
+ LOG(Error, "Unable to send data! Socket : {0} Address : {1} Port : {2} Data Length : {3} Error : {4}", *(SOCKET*)socket.Data, endPoint->Address, endPoint->Port, length, GetLastErrorMessage());
return -1;
}
}
else
{
- //TODO: better explanation
+ // TODO: better explanation
LOG(Error, "Unable to send data! Socket : {0} Data Length : {1}", *(SOCKET*)socket.Data, length);
return -1;
}
@@ -405,7 +407,7 @@ int32 Win32Network::ReadSocket(NetworkSocket socket, byte* buffer, uint32 buffer
const int32 error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
return 0;
- LOG(Error, "Unable to read data! Socket : {0} Buffer Size : {1} Error : {2}", *(SOCKET*)socket.Data, bufferSize, GetErrorMessage(error).Get());
+ LOG(Error, "Unable to read data! Socket : {0} Buffer Size : {1} Error : {2}", *(SOCKET*)socket.Data, bufferSize, GetErrorMessage(error));
return -1;
}
}
@@ -415,7 +417,7 @@ int32 Win32Network::ReadSocket(NetworkSocket socket, byte* buffer, uint32 buffer
sockaddr_in6 addr;
if ((size = recvfrom(*(SOCKET*)socket.Data, (char*)buffer, bufferSize, 0, (sockaddr*)&addr, &addrsize)) == SOCKET_ERROR)
{
- LOG(Error, "Unable to read data! Socket : {0} Buffer Size : {1} Error : {2}", *(SOCKET*)socket.Data, bufferSize, GetLastErrorMessage().Get());
+ LOG(Error, "Unable to read data! Socket : {0} Buffer Size : {1} Error : {2}", *(SOCKET*)socket.Data, bufferSize, GetLastErrorMessage());
return -1;
}
if (CreateEndPointFromAddr((sockaddr*)&addr, *endPoint))
@@ -439,13 +441,13 @@ bool Win32Network::CreateEndPoint(String* address, String* port, NetworkIPVersio
// consider using NUMERICHOST/NUMERICSERV if address is a valid Ipv4 or IPv6 so we can skip some look up ( potentially slow when resolving host names )
if ((status = GetAddrInfoW(address == nullptr ? nullptr : address->Get(), port->Get(), &hints, &info)) != 0)
{
- LOG(Error, "Unable to query info for address : {0} Error : {1}", address != nullptr ? address->Get() : String("ANY").Get(), gai_strerror(status));
+ LOG(Error, "Unable to query info for address : {0} Error : {1}", address ? address->Get() : String("ANY"), gai_strerror(status));
return true;
}
if (info == nullptr)
{
- LOG(Error, "Unable to resolve address! Address : {0}", address != nullptr ? address->Get() : String("ANY").Get());
+ LOG(Error, "Unable to resolve address! Address : {0}", address ? address->Get() : String("ANY"));
return true;
}
diff --git a/Source/Engine/Platform/Win32/Win32Platform.cpp b/Source/Engine/Platform/Win32/Win32Platform.cpp
index f74485748..b01b96feb 100644
--- a/Source/Engine/Platform/Win32/Win32Platform.cpp
+++ b/Source/Engine/Platform/Win32/Win32Platform.cpp
@@ -9,10 +9,9 @@
#include "Engine/Core/Types/Guid.h"
#include "Engine/Core/Types/String.h"
#include "Engine/Core/Math/Math.h"
-#include "IncludeWindowsHeaders.h"
#include "Engine/Core/Collections/HashFunctions.h"
-#include "Engine/Platform/Network.h"
#include "Engine/Core/Log.h"
+#include "IncludeWindowsHeaders.h"
#include
#include
@@ -27,10 +26,9 @@ namespace
CPUInfo CpuInfo;
uint64 ClockFrequency;
double CyclesToSeconds;
+ WSAData WsaData;
}
-static WSAData _wsaData;
-
// Helper function to count set bits in the processor mask
DWORD CountSetBits(ULONG_PTR bitMask)
{
@@ -52,9 +50,9 @@ static String GetLastErrorMessage()
{
wchar_t* s = nullptr;
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- nullptr, WSAGetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- reinterpret_cast(&s), 0, nullptr);
+ nullptr, WSAGetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ reinterpret_cast(&s), 0, nullptr);
String str(s);
LocalFree(s);
return str;
@@ -72,6 +70,7 @@ bool Win32Platform::Init()
ClockFrequency = frequency.QuadPart;
CyclesToSeconds = 1.0 / static_cast(frequency.QuadPart);
+ // Count CPUs
BOOL done = FALSE;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = nullptr;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr;
@@ -84,12 +83,10 @@ bool Win32Platform::Init()
DWORD processorPackageCount = 0;
DWORD byteOffset = 0;
PCACHE_DESCRIPTOR cache;
-
while (!done)
{
DWORD rc = GetLogicalProcessorInformation(buffer, &returnLength);
-
- if (FALSE == rc)
+ if (rc == FALSE)
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
@@ -97,9 +94,7 @@ bool Win32Platform::Init()
{
free(buffer);
}
-
buffer = static_cast(malloc(returnLength));
-
if (buffer == nullptr)
{
return true;
@@ -115,23 +110,16 @@ bool Win32Platform::Init()
done = TRUE;
}
}
-
ptr = buffer;
-
while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength)
{
switch (ptr->Relationship)
{
case RelationProcessorCore:
-
processorCoreCount++;
-
- // A hyper threaded core supplies more than one logical processor
logicalProcessorCount += CountSetBits(ptr->ProcessorMask);
break;
-
case RelationCache:
- // Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache.
cache = &ptr->Cache;
if (cache->Level == 1)
{
@@ -146,9 +134,7 @@ bool Win32Platform::Init()
processorL3CacheSize += cache->Size;
}
break;
-
case RelationProcessorPackage:
- // Logical processors share a physical package
processorPackageCount++;
break;
}
@@ -228,8 +214,10 @@ bool Win32Platform::Init()
DeviceId.D = (uint32)cpuInfo.ClockSpeed * cpuInfo.LogicalProcessorCount * cpuInfo.ProcessorCoreCount * cpuInfo.CacheLineSize;
}
- if (WSAStartup(MAKEWORD(2, 0), &_wsaData) != 0)
- LOG(Error, "Unable to initializes native network! Error : {0}", GetLastErrorMessage().Get());
+ // Init networking
+ if (WSAStartup(MAKEWORD(2, 0), &WsaData) != 0)
+ LOG(Error, "Unable to initializes native network! Error : {0}", GetLastErrorMessage());
+
return false;
}
@@ -240,19 +228,8 @@ void Win32Platform::Exit()
void Win32Platform::MemoryBarrier()
{
- // NOTE: _ReadWriteBarrier and friends only prevent the
- // compiler from reordering loads and stores. To prevent
- // the CPU from doing the same, we have to use the
- // MemoryBarrier macro which expands to e.g. a serializing
- // XCHG instruction on x86. Also note that the MemoryBarrier
- // macro does *not* imply _ReadWriteBarrier, so that call
- // cannot be eliminated.
-
_ReadWriteBarrier();
-
- // MemoryBarrier macro (we use undef to hide some symbols from Windows headers)
#if PLATFORM_64BITS
-
#ifdef _AMD64_
__faststorefence();
#elif defined(_IA64_)
@@ -260,7 +237,6 @@ void Win32Platform::MemoryBarrier()
#else
#error "Invalid platform."
#endif
-
#else
LONG barrier;
__asm {