[*] Resolve one stated Windows 7 defect
This commit is contained in:
parent
5dddc9d0d8
commit
c084f18c62
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
2 - soft defect; emuation performance) The time to wake metric across AuThreading::[Wake/Wait]OnAddress starts off at 1.5 - 2.2x modern Windows with RtlWaitOnAddress; although, the best case of basic primitives will still be faster than SRW Locks of Windows 7 through 11. Era correct internal NT apis are used across XP - Windows 11 targets. Note, WaitOnAddress emulation is not required for basic thread primitives; such scheduler indirection would only hurt performance. Performance should otherwise be exactly what you would expect once you remove Microsofts regressing CRT and lackluster stock thread primitives from the equation.
|
2 - soft defect; emuation performance) The time to wake metric across AuThreading::[Wake/Wait]OnAddress starts off at 1.5 - 2.2x modern Windows with RtlWaitOnAddress; although, the best case of basic primitives will still be faster than SRW Locks of Windows 7 through 11. Era correct internal NT apis are used across XP - Windows 11 targets. Note, WaitOnAddress emulation is not required for basic thread primitives; such scheduler indirection would only hurt performance. Performance should otherwise be exactly what you would expect once you remove Microsofts regressing CRT and lackluster stock thread primitives from the equation.
|
||||||
|
|
||||||
3) DNS look ups, when using the systems interface, will block the users thread as opposed to being an overlapped operation. Most application vendors would want to run their IO, especially network io, on a seperate thread from UI. This shouldn't be much of an issue for Windows 7 clients, I suppose.
|
3 - soft defect; workaround available) Stock Windows 7 console host is infamously bad. ConsoleTTY can in theory continue to work down to targets as old as Windows XP without the use of third party software; however, it should be noted TrueType fonts tend to cause hideous positioning faults when used with Aurora::Console::ConsoleTTY::GetTTYConsole()->Start(). Raster fonts tend to have better compatibility on older Windows operating systems. Aurora::Console::ConsoleTTY::* and Aurora::Console::ConsoleSTD::* (noncanonical apis) remain available and fully functional under Windows 7.
|
||||||
|
|
||||||
4 - soft defect; workaround available) Stock Windows 7 console host is infamously bad. ConsoleTTY can in theory continue to work down to targets as old as Windows XP without the use of third party software; however, it should be noted TrueType fonts tend to cause hideous positioning faults when used with Aurora::Console::ConsoleTTY::GetTTYConsole()->Start(). Raster fonts tend to have better compatibility on older Windows operating systems. Aurora::Console::ConsoleTTY::* and Aurora::Console::ConsoleSTD::* (noncanonical apis) remain available and fully functional under Windows 7.
|
|
@ -34,6 +34,11 @@ namespace Aurora::IO::Net
|
|||||||
ADDRINFOEXW infoEx {};
|
ADDRINFOEXW infoEx {};
|
||||||
int iInfoEx { 0 };
|
int iInfoEx { 0 };
|
||||||
|
|
||||||
|
if (!this->pEvent)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (this->bA && this->bAAAA)
|
if (this->bA && this->bAAAA)
|
||||||
{
|
{
|
||||||
infoEx.ai_family = AF_UNSPEC;
|
infoEx.ai_family = AF_UNSPEC;
|
||||||
@ -73,59 +78,114 @@ namespace Aurora::IO::Net
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
iRet = pGetAddrInfoExW(AuLocale::ConvertFromUTF8(this->hostname).data(),
|
auto pShared = this->SharedFromThis();
|
||||||
nullptr,
|
|
||||||
NS_DNS,
|
auto pThread = AuThreads::ThreadUnique(AuThreads::ThreadInfo(
|
||||||
nullptr,
|
AuMakeShared<AuThreads::IThreadVectorsFunctional>(AuThreads::IThreadVectorsFunctional::OnEntry_t(std::bind([=]()
|
||||||
&infoEx,
|
{
|
||||||
&this->resultHandle_,
|
int iRet {};
|
||||||
nullptr,
|
if ((iRet = pGetAddrInfoExW(AuLocale::ConvertFromUTF8(pShared->hostname).data(),
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr,
|
NS_DNS,
|
||||||
nullptr);
|
nullptr,
|
||||||
|
&infoEx,
|
||||||
|
&pShared->resultHandle_,
|
||||||
|
nullptr,
|
||||||
|
nullptr,
|
||||||
|
nullptr,
|
||||||
|
nullptr)) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
pShared->bForceError_ = true;
|
||||||
|
pShared->uOsError = iRet;
|
||||||
|
pShared->error_ = pShared->ToError();
|
||||||
|
}
|
||||||
|
|
||||||
|
pShared->pEvent->Set();
|
||||||
|
})),
|
||||||
|
AuThreads::IThreadVectorsFunctional::OnExit_t{}),
|
||||||
|
"Legacy Win32 DNS Request"
|
||||||
|
));
|
||||||
|
|
||||||
|
if (!pThread)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pThread->Run();
|
||||||
|
pThread->Detach();
|
||||||
|
|
||||||
|
iRet = ERROR_IO_PENDING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pgetaddrinfo)
|
else if (pgetaddrinfo)
|
||||||
{
|
{
|
||||||
ADDRINFOA infoA { 0 };
|
auto pShared = this->SharedFromThis();
|
||||||
PADDRINFOA pInfoRet {};
|
|
||||||
infoA.ai_family = infoEx.ai_family;
|
|
||||||
|
|
||||||
iRet = pgetaddrinfo(this->hostname.c_str(),
|
auto pThread = AuThreads::ThreadUnique(AuThreads::ThreadInfo(
|
||||||
nullptr,
|
AuMakeShared<AuThreads::IThreadVectorsFunctional>(AuThreads::IThreadVectorsFunctional::OnEntry_t(std::bind([=]()
|
||||||
&infoA,
|
|
||||||
&pInfoRet);
|
|
||||||
|
|
||||||
if (iRet == 0)
|
|
||||||
{
|
|
||||||
auto pCurrent = pInfoRet;
|
|
||||||
|
|
||||||
while (pCurrent)
|
|
||||||
{
|
{
|
||||||
NetEndpoint endpoint;
|
int iRet {};
|
||||||
AuMemcpy(endpoint.hint, pCurrent->ai_addr, pCurrent->ai_addrlen);
|
ADDRINFOA infoA { 0 };
|
||||||
DeoptimizeEndpoint(endpoint);
|
PADDRINFOA pInfoRet {};
|
||||||
|
infoA.ai_family = infoEx.ai_family;
|
||||||
|
|
||||||
if (!AuTryInsert(this->processedIps_, endpoint.ip))
|
iRet = pgetaddrinfo(pShared->hostname.c_str(),
|
||||||
|
nullptr,
|
||||||
|
&infoA,
|
||||||
|
&pInfoRet);
|
||||||
|
|
||||||
|
if (iRet == 0)
|
||||||
{
|
{
|
||||||
return false;
|
auto pCurrent = pInfoRet;
|
||||||
|
|
||||||
|
while (pCurrent)
|
||||||
|
{
|
||||||
|
NetEndpoint endpoint;
|
||||||
|
AuMemcpy(endpoint.hint, pCurrent->ai_addr, pCurrent->ai_addrlen);
|
||||||
|
DeoptimizeEndpoint(endpoint);
|
||||||
|
|
||||||
|
if (!AuTryInsert(pShared->processedIps_, endpoint.ip))
|
||||||
|
{
|
||||||
|
pShared->bForceError_ = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCurrent = pCurrent->ai_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pShared->bForceError_ = true;
|
||||||
|
pShared->uOsError = iRet;
|
||||||
|
pShared->error_ = pShared->ToError();
|
||||||
}
|
}
|
||||||
|
|
||||||
pCurrent = pCurrent->ai_next;
|
if (pInfoRet && pfreeaddrinfo)
|
||||||
}
|
{
|
||||||
|
pfreeaddrinfo(pInfoRet);
|
||||||
|
}
|
||||||
|
|
||||||
|
pShared->pEvent->Set();
|
||||||
|
})),
|
||||||
|
AuThreads::IThreadVectorsFunctional::OnExit_t{}),
|
||||||
|
"Legacy Win32 DNS Request"
|
||||||
|
));
|
||||||
|
|
||||||
|
if (!pThread)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pInfoRet && pfreeaddrinfo)
|
pThread->Run();
|
||||||
{
|
pThread->Detach();
|
||||||
pfreeaddrinfo(pInfoRet);
|
|
||||||
}
|
iRet = ERROR_IO_PENDING;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
this->hName_ = hHandle;
|
this->hName_ = hHandle;
|
||||||
return this->FinishOperationEx(AuSharedFromThis(),
|
return this->FinishOperationEx(AuSharedFromThis(),
|
||||||
this->pWorker_,
|
this->pWorker_,
|
||||||
@ -165,7 +225,10 @@ namespace Aurora::IO::Net
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this->error_ = ENetworkError::eAsyncError;
|
if (this->error_.netError == ENetworkError::eEnumInvalid)
|
||||||
|
{
|
||||||
|
this->error_ = ENetworkError::eAsyncError;
|
||||||
|
}
|
||||||
this->pCompletion_->OnFailure((void *)&this->error_);
|
this->pCompletion_->OnFailure((void *)&this->error_);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
@ -224,6 +287,11 @@ namespace Aurora::IO::Net
|
|||||||
{
|
{
|
||||||
auto pCurrent = this->resultHandle_;
|
auto pCurrent = this->resultHandle_;
|
||||||
|
|
||||||
|
if (this->bForceError_)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
while (pCurrent)
|
while (pCurrent)
|
||||||
{
|
{
|
||||||
NetEndpoint endpoint;
|
NetEndpoint endpoint;
|
||||||
|
@ -46,6 +46,7 @@ namespace Aurora::IO::Net
|
|||||||
AuList<IPAddress> processedIps_;
|
AuList<IPAddress> processedIps_;
|
||||||
AuSPtr<AuAsync::PromiseCallback<AuList<IPAddress>, NetError>> pCompletion_;
|
AuSPtr<AuAsync::PromiseCallback<AuList<IPAddress>, NetError>> pCompletion_;
|
||||||
bool bHasCompleted_ {};
|
bool bHasCompleted_ {};
|
||||||
|
bool bForceError_ {};
|
||||||
PADDRINFOEXW resultHandle_ {};
|
PADDRINFOEXW resultHandle_ {};
|
||||||
NetError error_;
|
NetError error_;
|
||||||
HANDLE hName_ { NULL };
|
HANDLE hName_ { NULL };
|
||||||
|
Loading…
Reference in New Issue
Block a user