From 1e4082c02f1bd252b4fdd50b8d2b07cb8101a052 Mon Sep 17 00:00:00 2001 From: J Reece Wilson Date: Fri, 16 Dec 2022 17:18:12 +0000 Subject: [PATCH] [+] Linux datagrams [+] NetSocketBind::uDefaultInputStreamSize [+] NetDatagramBind::uDefaultInputStreamSize --- Include/Aurora/IO/Net/INetSrvDatagram.hpp | 1 + Include/Aurora/IO/Net/INetSrvSockets.hpp | 5 +- Source/IO/Net/AuNetDatagramServer.NT.cpp | 17 ++-- Source/IO/Net/AuNetDatagramServer.Unix.cpp | 78 ++++++++++++++++--- Source/IO/Net/AuNetDatagramServer.Unix.hpp | 5 +- Source/IO/Net/AuNetDatagramServer.cpp | 14 ++-- Source/IO/Net/AuNetDatagramServer.hpp | 5 +- Source/IO/Net/AuNetEndpoint.cpp | 5 ++ Source/IO/Net/AuNetEndpoint.hpp | 2 + Source/IO/Net/AuNetSocket.cpp | 8 +- Source/IO/Net/AuNetSocket.hpp | 2 +- Source/IO/Net/AuNetSocketServer.NT.cpp | 3 +- Source/IO/Net/AuNetSocketServer.NT.hpp | 3 +- Source/IO/Net/AuNetSocketServer.Unix.cpp | 6 +- Source/IO/Net/AuNetSocketServer.Unix.hpp | 3 +- Source/IO/Net/AuNetSocketServer.cpp | 6 +- Source/IO/Net/AuNetSocketServer.hpp | 4 +- .../IO/Net/AuNetSocketServerOnRead.Unix.cpp | 56 +++++++++++++ .../IO/Net/AuNetSocketServerOnRead.Unix.hpp | 32 ++++++++ Source/IO/Net/AuNetSrvDatagram.cpp | 3 +- Source/IO/Net/AuNetSrvSockets.cpp | 1 + Source/IO/Net/AuNetStream.Linux.cpp | 14 +++- Source/IO/Net/AuNetStream.NT.cpp | 2 +- .../AuNetDatagramSocketServer.cpp | 1 + Source/RNG/AuRNGEntropy.cpp | 2 +- 25 files changed, 236 insertions(+), 42 deletions(-) create mode 100755 Source/IO/Net/AuNetSocketServerOnRead.Unix.cpp create mode 100755 Source/IO/Net/AuNetSocketServerOnRead.Unix.hpp diff --git a/Include/Aurora/IO/Net/INetSrvDatagram.hpp b/Include/Aurora/IO/Net/INetSrvDatagram.hpp index 50628075..bc647787 100644 --- a/Include/Aurora/IO/Net/INetSrvDatagram.hpp +++ b/Include/Aurora/IO/Net/INetSrvDatagram.hpp @@ -16,6 +16,7 @@ namespace Aurora::IO::Net { IPAddress ip; AuUInt16 uPort; + AuUInt32 uDefaultInputStreamSize; AuSPtr pDriver; }; diff --git a/Include/Aurora/IO/Net/INetSrvSockets.hpp b/Include/Aurora/IO/Net/INetSrvSockets.hpp index 36a7d0d8..beb0beb3 100644 --- a/Include/Aurora/IO/Net/INetSrvSockets.hpp +++ b/Include/Aurora/IO/Net/INetSrvSockets.hpp @@ -34,8 +34,9 @@ namespace Aurora::IO::Net AuUInt16 uPort {}; AuSPtr pFactory; AuSPtr pDriver; - AuUInt uMaxConnections {}; - AuUInt uMaxAcceptBacklog {}; + AuUInt32 uMaxConnections {}; + AuUInt32 uMaxAcceptBacklog {}; + AuUInt32 uDefaultInputStreamSize /* also: abs max datagram size of datagrams over sockets. note that each sessions buffer could be raised if tick/fragement future-buffering rejection. */ {}; bool bMultiThreaded {}; }; diff --git a/Source/IO/Net/AuNetDatagramServer.NT.cpp b/Source/IO/Net/AuNetDatagramServer.NT.cpp index 896d81f5..ea6b905a 100644 --- a/Source/IO/Net/AuNetDatagramServer.NT.cpp +++ b/Source/IO/Net/AuNetDatagramServer.NT.cpp @@ -13,15 +13,18 @@ namespace Aurora::IO::Net { DatagramServerImpl::DatagramServerImpl(NetInterface *pInterface, NetWorker *pWorker, - const AuSPtr &pDriver) : + const AuSPtr &pDriver, + AuUInt32 uDefaultPacketSize) : DatagramServer(pInterface, pWorker, - pDriver), - SocketServerImpl(pInterface, - pWorker, - {}, - {}, - 4096, + pDriver, + uDefaultPacketSize), + SocketServerImpl(pInterface, // struct NetInterface *pInterface + pWorker, // struct NetWorker *pWorker + {}, // const AuSPtr &pDriver + {}, // const AuSPtr &pFactory + 4096, // uMaxConnections + uDefaultPacketSize, // uDefaultInputStreamSize true), Socket(pInterface, pWorker, {}, -1) { diff --git a/Source/IO/Net/AuNetDatagramServer.Unix.cpp b/Source/IO/Net/AuNetDatagramServer.Unix.cpp index f3bca641..b24a3d0b 100644 --- a/Source/IO/Net/AuNetDatagramServer.Unix.cpp +++ b/Source/IO/Net/AuNetDatagramServer.Unix.cpp @@ -13,22 +13,82 @@ namespace Aurora::IO::Net { DatagramServerImpl::DatagramServerImpl(NetInterface *pInterface, NetWorker *pWorker, - const AuSPtr &pDriver) : + const AuSPtr &pDriver, + AuUInt32 uDefaultPacketSize) : DatagramServer(pInterface, pWorker, - pDriver), - SocketServerImpl(pInterface, - pWorker, - {}, - {}, - 4096, - true), + pDriver, + uDefaultPacketSize), + SocketServerImpl(pInterface, // struct NetInterface *pInterface + pWorker, // struct NetWorker *pWorker + {}, // const AuSPtr &pDriver + {}, // const AuSPtr &pFactory + 4096, // uMaxConnections + uDefaultPacketSize, // uDefaultInputStreamSize + true), // bMultiThreaded Socket(pInterface, pWorker, {}, -1) { } void DatagramServerImpl::DoPosixTick() { - // We dont use this tick under NT + do + { + auto uLength = this->uDefaultInputStreamSize ? this->uDefaultInputStreamSize : kDefaultStreamSize; + auto pBuffer = AuMakeShared(uLength); + if (!pBuffer) + { + SysPushErrorMemory(); + return; + } + + if (!pBuffer->IsValid()) + { + SysPushErrorMemory(); + return; + } + + NetEndpoint endpoint; + + socklen_t addressLength { sizeof(sockaddr_storage) }; + auto sRet = ::recvfrom(this->ToPlatformHandle(), pBuffer->writePtr, uLength, MSG_DONTWAIT, (struct sockaddr *)endpoint.hint, &addressLength); + if (sRet <= 0) + { + if (errno == EAGAIN || errno == EWOULDBLOCK) + { + break; + } + + SysPushErrorNet("recvfrom: {}", sRet); + // TODO: report and teardown if critical + break; + } + else + { + pBuffer->writePtr += sRet; + + DeoptimizeEndpoint(endpoint); + endpoint.transportProtocol = ETransportProtocol::eProtocolUDP; + + if (this->pDriver_) + { + try + { + this->pDriver_->OnPacket(endpoint, pBuffer); + } + catch (...) + { + SysPushErrorCatch(); + + if (this->pDriver_) + { + this->pDriver_->OnError(AuNet::NetError(ENetworkError::eCatchException)); + } + } + } + } + + } + while (true); } } \ No newline at end of file diff --git a/Source/IO/Net/AuNetDatagramServer.Unix.hpp b/Source/IO/Net/AuNetDatagramServer.Unix.hpp index 370e5b49..6d3d283e 100644 --- a/Source/IO/Net/AuNetDatagramServer.Unix.hpp +++ b/Source/IO/Net/AuNetDatagramServer.Unix.hpp @@ -9,11 +9,12 @@ namespace Aurora::IO::Net { - struct DatagramServerImpl : virtual DatagramServer + struct DatagramServerImpl : DatagramServer { DatagramServerImpl(struct NetInterface *pInterface, struct NetWorker *pWorker, - const AuSPtr &pDriver); + const AuSPtr &pDriver, + AuUInt32 uDefaultPacketSize); void DoPosixTick() override; }; diff --git a/Source/IO/Net/AuNetDatagramServer.cpp b/Source/IO/Net/AuNetDatagramServer.cpp index 967865ba..071268a2 100644 --- a/Source/IO/Net/AuNetDatagramServer.cpp +++ b/Source/IO/Net/AuNetDatagramServer.cpp @@ -20,12 +20,14 @@ namespace Aurora::IO::Net { DatagramServer::DatagramServer(NetInterface *pInterface, NetWorker *pWorker, - const AuSPtr &pDriver) : - SocketServerImpl(pInterface, - pWorker, - {}, - {}, - 4096, + const AuSPtr &pDriver, + AuUInt32 uDefaultPacketSize) : + SocketServerImpl(pInterface, // struct NetInterface *pInterface + pWorker, // struct NetWorker *pWorker + {}, // const AuSPtr &pDriver + {}, // const AuSPtr &pFactory + 4096, // uMaxConnections + uDefaultPacketSize, // uDefaultInputStreamSize true), pDriver_(pDriver) { diff --git a/Source/IO/Net/AuNetDatagramServer.hpp b/Source/IO/Net/AuNetDatagramServer.hpp index 3bcf0ddf..ad058641 100644 --- a/Source/IO/Net/AuNetDatagramServer.hpp +++ b/Source/IO/Net/AuNetDatagramServer.hpp @@ -19,7 +19,8 @@ namespace Aurora::IO::Net DatagramServer(struct NetInterface *pInterface, struct NetWorker *pWorker, - const AuSPtr &pDriver); + const AuSPtr &pDriver, + AuUInt32 uDefaultPacketSize); void BeginUDPLoop(); @@ -35,7 +36,7 @@ namespace Aurora::IO::Net virtual void DoPosixTick() = 0; - private: + protected: AuSPtr pDriver_; }; } diff --git a/Source/IO/Net/AuNetEndpoint.cpp b/Source/IO/Net/AuNetEndpoint.cpp index ba79d1a0..6efc7342 100644 --- a/Source/IO/Net/AuNetEndpoint.cpp +++ b/Source/IO/Net/AuNetEndpoint.cpp @@ -54,6 +54,11 @@ namespace Aurora::IO::Net }; } + return EndpointToLength(ep); + } + + AuUInt8 EndpointToLength(const NetEndpoint &ep) + { switch (ep.ip.ip) { case EIPProtocol::eIPProtocolV6: diff --git a/Source/IO/Net/AuNetEndpoint.hpp b/Source/IO/Net/AuNetEndpoint.hpp index 5d3da315..3328af33 100644 --- a/Source/IO/Net/AuNetEndpoint.hpp +++ b/Source/IO/Net/AuNetEndpoint.hpp @@ -17,4 +17,6 @@ namespace Aurora::IO::Net AuUInt TransportToPlatformType(ETransportProtocol protocol); AuUInt IPToDomain(const NetEndpoint &ep); + + AuUInt8 EndpointToLength(const NetEndpoint &ep); } \ No newline at end of file diff --git a/Source/IO/Net/AuNetSocket.cpp b/Source/IO/Net/AuNetSocket.cpp index bdbf314c..ceecdf11 100644 --- a/Source/IO/Net/AuNetSocket.cpp +++ b/Source/IO/Net/AuNetSocket.cpp @@ -11,6 +11,7 @@ #include "AuNetWorker.hpp" #include "AuIPAddress.hpp" #include "AuNetError.hpp" +#include "AuNetSocketServer.hpp" #if defined(AURORA_IS_MODERNNT_DERIVED) #include "AuNetStream.NT.hpp" @@ -341,8 +342,13 @@ namespace Aurora::IO::Net return this->pWorker_; } - bool SocketBase::SendPreestablish() + bool SocketBase::SendPreestablish(SocketServer *pServer) { + if (pServer && pServer->uDefaultInputStreamSize) + { + this->socketChannel_.uBytesInputBuffer = pServer->uDefaultInputStreamSize; + } + this->socketChannel_.inputChannel.WarmOnEstablish(); // Allocate stream resources, in case we need to start working with the source buffer // think: setting up protocol stacks, accessing the base bytebuffer, without the pipe being // allocated already diff --git a/Source/IO/Net/AuNetSocket.hpp b/Source/IO/Net/AuNetSocket.hpp index 9d16bb32..2f810650 100644 --- a/Source/IO/Net/AuNetSocket.hpp +++ b/Source/IO/Net/AuNetSocket.hpp @@ -76,7 +76,7 @@ namespace Aurora::IO::Net INetWorker *ToWorker(); NetWorker *ToWorkerEx(); - bool SendPreestablish(); + bool SendPreestablish(struct SocketServer *pServer = nullptr); void SendEnd(); void SendFinalize(); diff --git a/Source/IO/Net/AuNetSocketServer.NT.cpp b/Source/IO/Net/AuNetSocketServer.NT.cpp index f1c84090..9f9d5a68 100644 --- a/Source/IO/Net/AuNetSocketServer.NT.cpp +++ b/Source/IO/Net/AuNetSocketServer.NT.cpp @@ -22,7 +22,8 @@ namespace Aurora::IO::Net pWorker, pDriver, pSocketDriverFactory, - maxConnections, + uMaxConnections, + uDefaultInputStreamSize, bMultiThreaded), Socket(pInterface, pWorker, diff --git a/Source/IO/Net/AuNetSocketServer.NT.hpp b/Source/IO/Net/AuNetSocketServer.NT.hpp index 3979be3a..c74456fa 100644 --- a/Source/IO/Net/AuNetSocketServer.NT.hpp +++ b/Source/IO/Net/AuNetSocketServer.NT.hpp @@ -17,7 +17,8 @@ namespace Aurora::IO::Net struct NetWorker *pWorker, const AuSPtr &pDriver, const AuSPtr &pSocketDriverFactory, - AuUInt32 maxConnections, + AuUInt32 uMaxConnections, + AuUInt32 uDefaultInputStreamSize, bool bMultiThreaded); diff --git a/Source/IO/Net/AuNetSocketServer.Unix.cpp b/Source/IO/Net/AuNetSocketServer.Unix.cpp index 28489b07..fe8b9e9e 100644 --- a/Source/IO/Net/AuNetSocketServer.Unix.cpp +++ b/Source/IO/Net/AuNetSocketServer.Unix.cpp @@ -16,13 +16,15 @@ namespace Aurora::IO::Net NetWorker *pWorker, const AuSPtr &pDriver, const AuSPtr &pSocketDriverFactory, - AuUInt32 maxConnections, + AuUInt32 uMaxConnections, + AuUInt32 uDefaultInputStreamSize, bool bMultiThreaded) : SocketServer(pInterface, pWorker, pDriver, pSocketDriverFactory, - maxConnections, + uMaxConnections, + uDefaultInputStreamSize, bMultiThreaded), Socket(pInterface, pWorker, diff --git a/Source/IO/Net/AuNetSocketServer.Unix.hpp b/Source/IO/Net/AuNetSocketServer.Unix.hpp index 7844a5af..67038510 100644 --- a/Source/IO/Net/AuNetSocketServer.Unix.hpp +++ b/Source/IO/Net/AuNetSocketServer.Unix.hpp @@ -17,7 +17,8 @@ namespace Aurora::IO::Net struct NetWorker *pWorker, const AuSPtr &pDriver, const AuSPtr &pSocketDriverFactory, - AuUInt32 maxConnections, + AuUInt32 uMaxConnections, + AuUInt32 uDefaultInputStreamSize, bool bMultiThreaded); diff --git a/Source/IO/Net/AuNetSocketServer.cpp b/Source/IO/Net/AuNetSocketServer.cpp index 4074606b..fe0b99f5 100644 --- a/Source/IO/Net/AuNetSocketServer.cpp +++ b/Source/IO/Net/AuNetSocketServer.cpp @@ -17,7 +17,8 @@ namespace Aurora::IO::Net NetWorker *pWorker, const AuSPtr &pDriver, const AuSPtr &pFactory, - AuUInt32 maxConnections, + AuUInt32 uMaxConnections, + AuUInt32 uDefaultInputStreamSize, bool bMultiThreaded) : Socket(pInterface, pWorker, @@ -25,7 +26,8 @@ namespace Aurora::IO::Net -1), pDriver_(pDriver), pFactory_(pFactory), - uMaxConnections_(maxConnections), + uMaxConnections_(uMaxConnections), + uDefaultInputStreamSize(uDefaultInputStreamSize), bMultiThreaded(bMultiThreaded) { diff --git a/Source/IO/Net/AuNetSocketServer.hpp b/Source/IO/Net/AuNetSocketServer.hpp index 8d35295e..bb050ab0 100644 --- a/Source/IO/Net/AuNetSocketServer.hpp +++ b/Source/IO/Net/AuNetSocketServer.hpp @@ -23,7 +23,8 @@ namespace Aurora::IO::Net struct NetWorker *pWorker, const AuSPtr &pDriver, const AuSPtr &pFactory, - AuUInt32 maxConnections, + AuUInt32 uMaxConnections, + AuUInt32 uDefaultInputStreamSize, bool bMultiThreaded); void Init(const NetEndpoint &localAddress); @@ -49,6 +50,7 @@ namespace Aurora::IO::Net virtual void DetroyServer() = 0; const bool bMultiThreaded; + const AuUInt32 uDefaultInputStreamSize; protected: // INTERFACE: base os socket diff --git a/Source/IO/Net/AuNetSocketServerOnRead.Unix.cpp b/Source/IO/Net/AuNetSocketServerOnRead.Unix.cpp new file mode 100755 index 00000000..e8547776 --- /dev/null +++ b/Source/IO/Net/AuNetSocketServerOnRead.Unix.cpp @@ -0,0 +1,56 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuNetSocketServerOnRead.Unix.cpp + Date: 2022-12-16 + Author: Reece +***/ +#if 0 +#include "Networking.hpp" +#include "AuNetSocketServer.hpp" +#include "AuNetSocket.hpp" +#include "AuNetEndpoint.hpp" +#include "AuNetInterface.hpp" +#include "AuNetWorker.hpp" +#include "AuNetEndpoint.hpp" +#include "AuNetSocketServerOnRead.Unix.hpp" + +namespace Aurora::IO::Net +{ + NetSocketServerOnRead::NetSocketServerOnRead(NetInterface *pInterface, + Socket *pParent) : + pInterface_(pInterface), + SocketServerAcceptReadOperationBase(pParent) + + { + } + + void NetSocketServerOnRead::Destroy() + { + if (this->pWatch_) + { + this->pWatch_->StopWatch(); + } + } + + bool NetSocketServerOnRead::DoTick() + { + // this->pParent_->DoPosixTick(); + return true; + } + + bool NetSocketServerOnRead::InitOnce() + { + auto pWaitHandle = AuMakeShared(this->pParent_->ToPlatformHandle(), -1); + if (!pWaitHandle) + { + return false; + } + + this->pWatch_ = this->pParent_->ToWorker()->ToProcessor()->StartSimpleLSWatchEx(pWaitHandle, + AuSPtr(this->pParent_->SharedFromThis(), this), + false); + return bool(this->pWatch_); + } +} +#endif \ No newline at end of file diff --git a/Source/IO/Net/AuNetSocketServerOnRead.Unix.hpp b/Source/IO/Net/AuNetSocketServerOnRead.Unix.hpp new file mode 100755 index 00000000..e14c6707 --- /dev/null +++ b/Source/IO/Net/AuNetSocketServerOnRead.Unix.hpp @@ -0,0 +1,32 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuNetSocketServerOnRead.Unix.hpp + Date: 2022-12-16 + Author: Reece +***/ +#pragma once + +#include "AuNetSocketServerAcceptReadOperation.hpp" + +namespace Aurora::IO::Net +{ + struct NetInterface; + struct Socket; + + struct NetSocketServerOnRead : + virtual SocketServerAcceptReadOperationBase + { + NetSocketServerOnRead(NetInterface *pInterface, + Socket *pParent); + + bool DoTick(); + bool InitOnce(); + void Destroy(); + + protected: + NetInterface *pInterface_; + Socket *pParent_; + AuSPtr pWatch_; + }; +} \ No newline at end of file diff --git a/Source/IO/Net/AuNetSrvDatagram.cpp b/Source/IO/Net/AuNetSrvDatagram.cpp index 44a4d685..484b9c00 100644 --- a/Source/IO/Net/AuNetSrvDatagram.cpp +++ b/Source/IO/Net/AuNetSrvDatagram.cpp @@ -42,7 +42,8 @@ namespace Aurora::IO::Net auto pServer = AuMakeShared(this->pParent_, pWorker.get(), - bind.pDriver); + bind.pDriver, + bind.uDefaultInputStreamSize); if (!pServer) { SysPushErrorNet("No Memory"); diff --git a/Source/IO/Net/AuNetSrvSockets.cpp b/Source/IO/Net/AuNetSrvSockets.cpp index aa0f6e16..fed44b6b 100644 --- a/Source/IO/Net/AuNetSrvSockets.cpp +++ b/Source/IO/Net/AuNetSrvSockets.cpp @@ -178,6 +178,7 @@ namespace Aurora::IO::Net netBind.pDriver, netBind.pFactory, uMaxSockets, + netBind.uDefaultInputStreamSize, netBind.bMultiThreaded); if (!pSocket) { diff --git a/Source/IO/Net/AuNetStream.Linux.cpp b/Source/IO/Net/AuNetStream.Linux.cpp index f5d89290..01344626 100644 --- a/Source/IO/Net/AuNetStream.Linux.cpp +++ b/Source/IO/Net/AuNetStream.Linux.cpp @@ -9,6 +9,7 @@ #include "AuNetStream.Linux.hpp" #include "AuNetSocket.hpp" #include "AuNetWorker.hpp" +#include "AuNetEndpoint.hpp" #include namespace Aurora::IO::Net @@ -159,12 +160,23 @@ namespace Aurora::IO::Net } else { + this->iSocketLength = this->pSocket->endpointSize_; + + #if 0 + AuLogDbg("{} -> {} {}, {}, {} {}", this->GetSocket(), + memoryView->ptr, + memoryView->length, + 0, + (void *)netEndpoint.hint, + this->iSocketLength); + #endif + if (::sendto(this->GetSocket(), memoryView->ptr, memoryView->length, 0, (struct sockaddr *)netEndpoint.hint, - this->iSocketLength) != memoryView->length) + EndpointToLength(netEndpoint)) != memoryView->length) { LIOS_SendProcess(0, false, errno); return true; diff --git a/Source/IO/Net/AuNetStream.NT.cpp b/Source/IO/Net/AuNetStream.NT.cpp index 535dbbe3..cab9f404 100644 --- a/Source/IO/Net/AuNetStream.NT.cpp +++ b/Source/IO/Net/AuNetStream.NT.cpp @@ -229,7 +229,7 @@ namespace Aurora::IO::Net NULL, this->dwRecvFlags, (sockaddr *)netEndpoint.hint, - this->iSocketLength, + EndpointToLength(netEndpoint), &this->overlap, WsaOverlappedCompletionRoutine); } diff --git a/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.cpp b/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.cpp index 1f7180ad..9a552a01 100644 --- a/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.cpp +++ b/Source/IO/Net/SocketOverDatagram/AuNetDatagramSocketServer.cpp @@ -56,6 +56,7 @@ namespace Aurora::IO::Net AuNet::NetDatagramBind nsDatagramBind; nsDatagramBind.ip = this->localEndpoint.ip; nsDatagramBind.uPort = this->localEndpoint.uPort; + nsDatagramBind.uDefaultInputStreamSize = this->uDefaultPacketSize; nsDatagramBind.pDriver = this->ToDriver(); this->pDatagramServer_ = this->pInterface_->GetDatagramService()->NewDatagramServer(nsDatagramBind); diff --git a/Source/RNG/AuRNGEntropy.cpp b/Source/RNG/AuRNGEntropy.cpp index 505e0a46..8dd369ce 100644 --- a/Source/RNG/AuRNGEntropy.cpp +++ b/Source/RNG/AuRNGEntropy.cpp @@ -187,7 +187,7 @@ namespace Aurora::RNG void EntropyDeinit() { #if defined(AURORA_IS_POSIX_DERIVED) - if (gDevURand <= 0) + if (gDevURand > 0) { ::close(gDevURand); }