AuroraRuntime/Source/IO/Net/AuNetWorker.hpp

143 lines
5.2 KiB
C++
Raw Normal View History

[+] Network + Protocol + TLS - Initial Commit ============================================================================= Network ]==================================================================== ============================================================================= [+] Added (very) early Aurora::IO::Net implementation [+] AuNet::EHostnameType [+] AuNet::EIPProtocol [+] AuNet::ENetworkError [+] AuNet::ETransportProtocol [+] AuNet::INetInterface [+] AuNet::INetSrvDatagram [+] AuNet::INetSrvResolve [+] AuNet::INetSrvSockets [+] AuNet::INetSrvWorkers [+] AuNet::INetWorker [+] AuNet::IPAddress [+] AuNet::IResolver [+] AuNet::ISocket [+] AuNet::IResolver [+] AuNet::ISocketBase [+] AuNet::ISocketChannel [+] AuNet::ISocketDriver [+] AuNet::ISocketDriverFactory [+] AuNet::ISocketServer [+] AuNet::ISocketServerDriver [+] AuNet::NetEndpoint [+] AuNet::NetError [+] AuNet::NetHostname (+implementation) ============================================================================= Protocol ]=================================================================== ============================================================================= [+] IProtocolInterceptor [+] IProtocolInterceptorEx [+] IProtocolStack (+implementation) ============================================================================= TLS ]======================================================================== ============================================================================= [+] ITLSContext [+] TLSProtocolRecv [+] TLSProtocolSend (+implementation) ============================================================================= IO Bug Fixes ]=============================================================== ============================================================================= [*] IOProcessor::SubmitIOWorkItem should signal the CvEvent, forcing at least once future tick (wont optimize with if in tick & not yet dispatched work items) [*] Split IOPipeWork in into IOPipeProcessor header [+] IOPipeWork::GetBuffer (internal reallocation) [*] Harden against IAsyncTransactions without a loop source [*] Missing null `if (processor->listener)` in IOProcessor [*] Solved some soft-lock conditions under Linux's LoopQueue (added deferred commits) [*] Quick hack: IOProcessor::HasItems() should OR the early can-tick check function. ============================================================================= Other ]====================================================================== ============================================================================= [+] Linux: LSSignalCatcher [+] `static void AuResetMember(Aurora::Memory::ByteBuffer &ref)` for AuROXTL [*] Attempt to enforce a normalization and don't overwrite-readptr-under-istreamwriters policy in ByteBuffer_ReadWrite (circular buffers) [*] Bad ECC ctors ============================================================================= Known issues ]=============================================================== ============================================================================= > Linux net is nowhere near done > UDP socket emulation layer isn't implemented > Ciphersuite API is a stub > Private key API is a stub > ...therefore no TLS servers > Missing thread safety precautions under net > Net implementation is still beri early
2022-08-28 19:02:06 +00:00
#pragma once
namespace Aurora::IO::Net
{
struct NetSrvWorkers;
struct NetWorker : INetWorker
{
NetWorker(NetSrvWorkers *pParent,
AuUInt8 workerIndex,
AuSPtr<IIOProcessor> pIOProcessor);
AuSPtr<AuLoop::ILSEvent> ToEvent();
bool IsOnThread();
AuSPtr<IIOProcessor> ToProcessor() override;
AuUInt8 GetWorkerIndex() override;
void Destroy() override;
bool IncrementIOEventTaskCounter();
void DecrementIOEventTaskCounter();
AuSPtr<IIOProcessorItem> pWorkItem_;
void AddSocket(ISocket *pSocket);
void RemoveSocket(ISocket *pSocket);
AuList<ISocket *> childSockets;
[+] Network + Protocol + TLS - Initial Commit ============================================================================= Network ]==================================================================== ============================================================================= [+] Added (very) early Aurora::IO::Net implementation [+] AuNet::EHostnameType [+] AuNet::EIPProtocol [+] AuNet::ENetworkError [+] AuNet::ETransportProtocol [+] AuNet::INetInterface [+] AuNet::INetSrvDatagram [+] AuNet::INetSrvResolve [+] AuNet::INetSrvSockets [+] AuNet::INetSrvWorkers [+] AuNet::INetWorker [+] AuNet::IPAddress [+] AuNet::IResolver [+] AuNet::ISocket [+] AuNet::IResolver [+] AuNet::ISocketBase [+] AuNet::ISocketChannel [+] AuNet::ISocketDriver [+] AuNet::ISocketDriverFactory [+] AuNet::ISocketServer [+] AuNet::ISocketServerDriver [+] AuNet::NetEndpoint [+] AuNet::NetError [+] AuNet::NetHostname (+implementation) ============================================================================= Protocol ]=================================================================== ============================================================================= [+] IProtocolInterceptor [+] IProtocolInterceptorEx [+] IProtocolStack (+implementation) ============================================================================= TLS ]======================================================================== ============================================================================= [+] ITLSContext [+] TLSProtocolRecv [+] TLSProtocolSend (+implementation) ============================================================================= IO Bug Fixes ]=============================================================== ============================================================================= [*] IOProcessor::SubmitIOWorkItem should signal the CvEvent, forcing at least once future tick (wont optimize with if in tick & not yet dispatched work items) [*] Split IOPipeWork in into IOPipeProcessor header [+] IOPipeWork::GetBuffer (internal reallocation) [*] Harden against IAsyncTransactions without a loop source [*] Missing null `if (processor->listener)` in IOProcessor [*] Solved some soft-lock conditions under Linux's LoopQueue (added deferred commits) [*] Quick hack: IOProcessor::HasItems() should OR the early can-tick check function. ============================================================================= Other ]====================================================================== ============================================================================= [+] Linux: LSSignalCatcher [+] `static void AuResetMember(Aurora::Memory::ByteBuffer &ref)` for AuROXTL [*] Attempt to enforce a normalization and don't overwrite-readptr-under-istreamwriters policy in ByteBuffer_ReadWrite (circular buffers) [*] Bad ECC ctors ============================================================================= Known issues ]=============================================================== ============================================================================= > Linux net is nowhere near done > UDP socket emulation layer isn't implemented > Ciphersuite API is a stub > Private key API is a stub > ...therefore no TLS servers > Missing thread safety precautions under net > Net implementation is still beri early
2022-08-28 19:02:06 +00:00
// Yea, so, we have some pretty lax rules about threading...
template <class Status_t, class Error_t = AuNullS, class Callable_t>
bool TryScheduleInternalTemplate(Callable_t &&work,
const AuSPtr<AuAsync::PromiseCallback<Status_t, Error_t>> &callback)
{
struct Waiter : IIOProcessorWorkUnit
{
inline Waiter(const AuConsumer<const AuSPtr<AuAsync::PromiseCallback<Status_t, Error_t>> &> worker,
const AuSPtr<AuAsync::PromiseCallback<Status_t, Error_t>> &callbacks) :
callbacks_(callbacks),
worker_(worker)
{
}
inline Waiter(const AuConsumer<const AuSPtr<AuAsync::PromiseCallback<Status_t, Error_t>> &> worker,
const AuSPtr<AuAsync::PromiseCallback<Status_t, Error_t>> &callbacks,
AuAsync::WorkerPId_t origin) :
callbacks_(callbacks),
worker_(worker),
origin_(origin)
{
SysAssert(MakeProxy());
}
inline virtual void OnRun() override
{
//SysAssert(this->callbacks_);
SysAssert(this->worker_);
this->worker_(this->callbacks_);
}
inline virtual void OnCanceled() override
{
if (!this->callbacks_)
{
return;
}
//SysAssert(this->callbacks_);
this->callbacks_->OnFailure((void *)nullptr);
}
inline bool MakeProxy()
{
auto old = this->callbacks_;
auto temp = AuMakeShared<AuAsync::PromiseCallbackFunctional<Status_t, Error_t>>([=](const AuSPtr<Status_t> &response)
{
auto pWorkItem = this->origin_.pool->NewWorkItem(this->origin_, AuMakeShared<AuAsync::BasicWorkStdFunc>([response, callbacks = old]()
{
callbacks->OnSuccess(response.get());
}, []()
{
SysPanic("Eh");
}));
SysAssert(pWorkItem);
SysAssert(pWorkItem->Dispatch(), "A network task failed to dispatch critically");
},
[=](const AuSPtr<Error_t> &response)
{
auto pWorkItem = this->origin_.pool->NewWorkItem(this->origin_, AuMakeShared<AuAsync::BasicWorkStdFunc>([response, callbacks = old]()
{
callbacks->OnFailure(response.get());
}, []()
{
SysPanic("Eh");
}));
SysAssert(pWorkItem);
SysAssert(pWorkItem->Dispatch(), "A network task failed to dispatch critically");
});
if (!temp)
{
return {};
}
this->callbacks_ = temp;
return true;
}
const AuConsumer<const AuSPtr<AuAsync::PromiseCallback<Status_t, Error_t>> &> worker_;
AuSPtr<AuAsync::PromiseCallback<Status_t, Error_t>> callbacks_;
AuAsync::WorkerPId_t origin_;
};
AuSPtr<Waiter> temp;
auto pid = AuAsync::GetCurrentWorkerPId();
if (pid)
{
temp = AuMakeShared<Waiter>(work, callback, pid);
}
else
{
temp = AuMakeShared<Waiter>(work, callback);
}
if (!temp)
{
SysPushErrorIO("No memory to allocate work unit");
return false;
}
return this->pIOProcessor_->SubmitIOWorkItem(temp);
}
private:
AuThreadPrimitives::SpinLock spinLock_;
AuSPtr<IIOProcessor> pIOProcessor_;
NetSrvWorkers *pParent_;
AuUInt8 workerIndex_;
AuSPtr<AuLoop::ILSEvent> pEvent_;
AuUInt32 dwAtomicEventCounter_ {};
};
}