From e0f74d6160221ca86392f944e85f0bf9ec0d34b6 Mon Sep 17 00:00:00 2001 From: Jamie Reece Wilson Date: Fri, 1 Dec 2023 14:49:30 +0000 Subject: [PATCH] [+] ISocketServer::GetServerRecvStats() [+] ISocketServer::GetServerSendStats() --- Include/Aurora/IO/Net/ISocketServer.hpp | 2 + Source/IO/Net/AuNetSocket.cpp | 5 +++ Source/IO/Net/AuNetSocket.hpp | 1 + Source/IO/Net/AuNetSocketChannel.cpp | 39 +++++++++++++++++++ Source/IO/Net/AuNetSocketChannel.hpp | 6 ++- Source/IO/Net/AuNetSocketChannelOutput.cpp | 5 +++ Source/IO/Net/AuNetSocketServer.cpp | 10 +++++ Source/IO/Net/AuNetSocketServer.hpp | 5 +++ .../AuNetDatagramEmulatorISocketServer.cpp | 25 +++++++++++- .../AuNetDatagramEmulatorISocketServer.hpp | 2 + .../AuNetDatagramSocketServer.cpp | 10 +++++ .../AuNetDatagramSocketServer.hpp | 6 +++ .../AuNetDatagramSocketServerChannel.cpp | 18 +++++++++ 13 files changed, 131 insertions(+), 3 deletions(-) diff --git a/Include/Aurora/IO/Net/ISocketServer.hpp b/Include/Aurora/IO/Net/ISocketServer.hpp index 25d127b9..b5df1797 100644 --- a/Include/Aurora/IO/Net/ISocketServer.hpp +++ b/Include/Aurora/IO/Net/ISocketServer.hpp @@ -15,5 +15,7 @@ namespace Aurora::IO::Net virtual AuUInt32 GetSessionCount() = 0; virtual AuSPtr GetLimits() = 0; virtual AuSPtr GetServerDriver() = 0; + virtual AuSPtr GetServerRecvStats() = 0; + virtual AuSPtr GetServerSendStats() = 0; }; } \ No newline at end of file diff --git a/Source/IO/Net/AuNetSocket.cpp b/Source/IO/Net/AuNetSocket.cpp index 698f0e08..25b57128 100644 --- a/Source/IO/Net/AuNetSocket.cpp +++ b/Source/IO/Net/AuNetSocket.cpp @@ -493,6 +493,11 @@ namespace Aurora::IO::Net auto uHeadDelta = pReadableBuffer ? (pReadableBuffer->readPtr - pStartOffset) : 0; this->socketChannel_.GetRecvStatsEx().AddBytes(uHeadDelta); + + if (auto pServerRecvStats = this->socketChannel_.GetRecvStatsEx2()) + { + pServerRecvStats->AddBytes(uHeadDelta); + } } const NetError &SocketBase::GetError() diff --git a/Source/IO/Net/AuNetSocket.hpp b/Source/IO/Net/AuNetSocket.hpp index 0774ffc8..632edf86 100644 --- a/Source/IO/Net/AuNetSocket.hpp +++ b/Source/IO/Net/AuNetSocket.hpp @@ -132,6 +132,7 @@ namespace Aurora::IO::Net friend struct NetWriteQueue; friend struct SocketChannelOutput; + friend struct SocketChannel; NetEndpoint remoteEndpoint_; NetEndpoint localEndpoint_; diff --git a/Source/IO/Net/AuNetSocketChannel.cpp b/Source/IO/Net/AuNetSocketChannel.cpp index bf6a4d9d..901d7b9d 100644 --- a/Source/IO/Net/AuNetSocketChannel.cpp +++ b/Source/IO/Net/AuNetSocketChannel.cpp @@ -17,6 +17,7 @@ #include "AuNetWorker.hpp" #include #include +#include "AuNetSocketServer.hpp" namespace Aurora::IO::Net { @@ -313,6 +314,44 @@ namespace Aurora::IO::Net return this->recvStats_; } + SocketStats *SocketChannel::GetSendStatsEx2() + { + if (auto pTest = this->pParent_->GetSocketServer()) + { + if (auto pWP2 = this->pParent_->wpParent2_) + { + return &pWP2->sendStats_; + } + else + { + return {}; + } + } + else + { + return {}; + } + } + + SocketStats *SocketChannel::GetRecvStatsEx2() + { + if (auto pTest = this->pParent_->GetSocketServer()) + { + if (auto pWP2 = this->pParent_->wpParent2_) + { + return &pWP2->recvStats_; + } + else + { + return {}; + } + } + else + { + return {}; + } + } + void SocketChannel::AddEventListener(const AuSPtr &pListener) { AU_LOCK_GUARD(this->spinLock); diff --git a/Source/IO/Net/AuNetSocketChannel.hpp b/Source/IO/Net/AuNetSocketChannel.hpp index 3b6a4db4..5d134021 100644 --- a/Source/IO/Net/AuNetSocketChannel.hpp +++ b/Source/IO/Net/AuNetSocketChannel.hpp @@ -84,8 +84,10 @@ namespace Aurora::IO::Net AuSPtr GetChannelLimits() override; - SocketStats & GetSendStatsEx(); - SocketStats & GetRecvStatsEx(); + SocketStats &GetSendStatsEx(); + SocketStats &GetRecvStatsEx(); + SocketStats *GetSendStatsEx2(); + SocketStats *GetRecvStatsEx2(); void Establish(); diff --git a/Source/IO/Net/AuNetSocketChannelOutput.cpp b/Source/IO/Net/AuNetSocketChannelOutput.cpp index c855aa9c..508a624f 100644 --- a/Source/IO/Net/AuNetSocketChannelOutput.cpp +++ b/Source/IO/Net/AuNetSocketChannelOutput.cpp @@ -281,6 +281,11 @@ namespace Aurora::IO::Net AuStaticCast(this->pParent_->ToChannel())->GetSendStatsEx().AddBytes(length); + if (auto pServerSendStats = AuStaticCast(this->pParent_->ToChannel())->GetSendStatsEx2()) + { + pServerSendStats->AddBytes(length); + } + if (!length) { this->pParent_->SendErrorBeginShutdown({}); diff --git a/Source/IO/Net/AuNetSocketServer.cpp b/Source/IO/Net/AuNetSocketServer.cpp index dba14126..44c3e586 100644 --- a/Source/IO/Net/AuNetSocketServer.cpp +++ b/Source/IO/Net/AuNetSocketServer.cpp @@ -130,6 +130,16 @@ namespace Aurora::IO::Net return this->pFactory_; } + AuSPtr SocketServer::GetServerRecvStats() + { + return AuSPtr(this->SharedFromThis(), &this->recvStats_); + } + + AuSPtr SocketServer::GetServerSendStats() + { + return AuSPtr(this->SharedFromThis(), &this->sendStats_); + } + AuSPtr SocketServer::GetLimits() { return AuSPtr(this->SharedFromThis(), &this->serverLimits_); diff --git a/Source/IO/Net/AuNetSocketServer.hpp b/Source/IO/Net/AuNetSocketServer.hpp index bee3fe06..ebc0147a 100644 --- a/Source/IO/Net/AuNetSocketServer.hpp +++ b/Source/IO/Net/AuNetSocketServer.hpp @@ -39,6 +39,8 @@ namespace Aurora::IO::Net AuSPtr GetLimits() override; AuList> GetChildren() override; AuUInt32 GetSessionCount() override; + AuSPtr GetServerRecvStats() override; + AuSPtr GetServerSendStats() override; virtual void FinishConstructAsync() override; @@ -92,7 +94,10 @@ namespace Aurora::IO::Net private: friend struct SocketBase; + friend struct SocketChannel; + SocketStats sendStats_; + SocketStats recvStats_; AuSPtr pDriver_; AuUInt32 uMaxConnections_; AuSPtr pFactory_; diff --git a/Source/IO/Net/SocketOverDatagram/AuNetDatagramEmulatorISocketServer.cpp b/Source/IO/Net/SocketOverDatagram/AuNetDatagramEmulatorISocketServer.cpp index a81d6b4d..490de1c9 100644 --- a/Source/IO/Net/SocketOverDatagram/AuNetDatagramEmulatorISocketServer.cpp +++ b/Source/IO/Net/SocketOverDatagram/AuNetDatagramEmulatorISocketServer.cpp @@ -89,7 +89,6 @@ namespace Aurora::IO::Net } } - AuUInt32 NetDatagramEmulatorISocketServer::GetSessionCount() { if (auto pParent = this->pParent) @@ -101,4 +100,28 @@ namespace Aurora::IO::Net return {}; } } + + AuSPtr NetDatagramEmulatorISocketServer::GetServerRecvStats() + { + if (auto pParent = this->pParent) + { + return AuSPtr { pParent->SharedFromThis(), pParent->GetRecvStats() }; + } + else + { + return {}; + } + } + + AuSPtr NetDatagramEmulatorISocketServer::GetServerSendStats() + { + if (auto pParent = this->pParent) + { + return AuSPtr { pParent->SharedFromThis(), pParent->GetSendStats() }; + } + else + { + return {}; + } + } } \ No newline at end of file diff --git a/Source/IO/Net/SocketOverDatagram/AuNetDatagramEmulatorISocketServer.hpp b/Source/IO/Net/SocketOverDatagram/AuNetDatagramEmulatorISocketServer.hpp index 3a19e770..d97bd252 100644 --- a/Source/IO/Net/SocketOverDatagram/AuNetDatagramEmulatorISocketServer.hpp +++ b/Source/IO/Net/SocketOverDatagram/AuNetDatagramEmulatorISocketServer.hpp @@ -32,5 +32,7 @@ namespace Aurora::IO::Net AuList> GetChildren() override; AuSPtr GetLockedWorkerThread() override; AuUInt32 GetSessionCount() override; + AuSPtr GetServerRecvStats() override; + AuSPtr GetServerSendStats() override; }; } \ No newline at end of file diff --git a/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.cpp b/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.cpp index e1c1dc07..e0487505 100644 --- a/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.cpp +++ b/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.cpp @@ -394,4 +394,14 @@ namespace Aurora::IO::Net { return this->pSocketDriverFactory_; } + + SocketStats *NetDatagramSocketServer::GetSendStats() + { + return &this->sendStats_; + } + + SocketStats *NetDatagramSocketServer::GetRecvStats() + { + return &this->recvStats_; + } } \ No newline at end of file diff --git a/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.hpp b/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.hpp index 5c9e9663..825a8fb7 100644 --- a/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.hpp +++ b/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.hpp @@ -10,6 +10,7 @@ #include "AuNetDatagramSocketServerDriver.hpp" #include "AuNetDatagramEmulatorISocketServer.hpp" #include "AuNetDatagramSocketEviction.hpp" +#include "../AuSocketStats.hpp" namespace Aurora::IO::Net { @@ -60,6 +61,9 @@ namespace Aurora::IO::Net AuSPtr GetFactoryDriver(); AuSPtr ToServer(); + SocketStats *GetSendStats(); + SocketStats *GetRecvStats(); + void DispatchNew(AuSPtr pSession); const AuUInt32 uSocketTimeoutAnyMS; @@ -85,5 +89,7 @@ namespace Aurora::IO::Net AuSPtr pSocketDriverFactory_; NetDatagramSocketEviction eviction; AuThreadPrimitives::Mutex mutex_; + SocketStats sendStats_; + SocketStats recvStats_; }; } \ No newline at end of file diff --git a/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServerChannel.cpp b/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServerChannel.cpp index 7fca19f6..91309cb1 100644 --- a/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServerChannel.cpp +++ b/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServerChannel.cpp @@ -15,6 +15,7 @@ #endif #include "../AuNetDatagramServer.hpp" +#include "AuNetDatagramSocketServer.hpp" static const auto kDefaultBufferSize = 64 * 1024; @@ -160,6 +161,15 @@ namespace Aurora::IO::Net pMem->ptr = this->outputBuffer.readPtr; pMem->length = uDelta; + this->sendStats_.AddBytes(uDelta); + if (auto pParent = AuTryLockMemoryType(this->pParent_->pParentServer)) + { + if (auto pSendStats = pParent->GetSendStats()) + { + pSendStats->AddBytes(uDelta); + } + } + this->outputBuffer.readPtr += uDelta; pWriteTransaction->SetCallback(AuMakeSharedThrow([=](AuUInt64 uOffset, AuUInt32 uLength) @@ -450,6 +460,14 @@ namespace Aurora::IO::Net { this->recvStats_.AddBytes(pBuffer->RemainingBytes()); + if (auto pParent = AuTryLockMemoryType(this->pParent_->pParentServer)) + { + if (auto pRecvStats = pParent->GetRecvStats()) + { + pRecvStats->AddBytes(pBuffer->RemainingBytes()); + } + } + if (this->pBuffer) { if (!this->bOwnsBuffer)