/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuNetInterface.cpp Date: 2022-8-16 Author: Reece ***/ #include "Networking.hpp" #include "AuNetInterface.hpp" #include "AuNetWorker.hpp" namespace Aurora::IO::Net { NetInterface::NetInterface() : netServiceResolve_(this), netServiceSockets_(this), netServiceDatagram_(this) { } AuSPtr NetInterface::GetWorkersService() { return AuSPtr(AuSharedFromThis(), &this->netServiceWorkers_); } AuSPtr NetInterface::GetResolveService() { return AuSPtr(AuSharedFromThis(), &this->netServiceResolve_); } AuSPtr NetInterface::GetSocketService() { return AuSPtr(AuSharedFromThis(), &this->netServiceSockets_); } AuSPtr NetInterface::GetDatagramService() { return AuSPtr(AuSharedFromThis(), &this->netServiceDatagram_); } AuSPtr NetInterface::GetInterfacesService() { if (!this->netServiceInterfaces_.IsSupportedOnOS()) { return {}; } return AuSPtr(AuSharedFromThis(), &this->netServiceInterfaces_); } bool NetInterface::TrySchedule(const AuSPtr &pWorkUnit) { auto workerId = AuAtomicAdd(&this->atomicCounter_, 1u) - 1u; auto worker = this->netServiceWorkers_.GetWorkerByIndex(workerId); if (!worker) { SysPushErrorIO("No Worker"); return {}; } return worker->ToProcessor()->SubmitIOWorkItem(pWorkUnit); } AuSPtr NetInterface::TryScheduleEx() { AuSPtr worker; do { worker = this->netServiceWorkers_.GetWorkerByIndex(AuAtomicAdd(&this->atomicCounter_, 1u) - 1u); } while (!worker); return worker; } void NetInterface::Shutdown() { } void NetInterface::Destroy() { } AUKN_SYM AuSPtr NewNetworkInterface() { if (!IsNetReady()) { SysPushErrorNet("Platform network service isn't available"); return {}; } auto iface = AuMakeShared(); if (!iface) { return iface; } // TODO: ... return iface; } }