#pragma once #include #include #include #include #include #include #include struct llarp_config; struct llarp_main; namespace llarp { struct Context; } namespace tooling { struct RouterHive { using Context_ptr = std::shared_ptr; private: void StartRouters(std::vector* routers, bool isRelay); void AddRouter( const std::shared_ptr& config, std::vector* routers, bool isRelay); /// safely visit router void VisitRouter(llarp_main* router, std::function visit); /// safely visit relay at index N void VisitRelay(size_t index, std::function visit); /// safely visit client at index N void VisitClient(size_t index, std::function visit); public: RouterHive() = default; void AddRelay(const std::shared_ptr& conf); void AddClient(const std::shared_ptr& conf); void StartRelays(); void StartClients(); void StopRouters(); void NotifyEvent(RouterEventPtr event); RouterEventPtr GetNextEvent(); std::deque GetAllEvents(); void ForEachRelay(std::function visit) { for (size_t idx = 0; idx < relays.size(); ++idx) { VisitRelay(idx, visit); } } void ForEachClient(std::function visit) { for (size_t idx = 0; idx < clients.size(); ++idx) { VisitClient(idx, visit); } } /// safely visit every router context void ForEachRouter(std::function visit) { ForEachRelay(visit); ForEachClient(visit); } std::vector RelayConnectedRelays(); std::vector GetRelayRCs(); std::vector relays; std::vector clients; std::vector routerMainThreads; std::mutex eventQueueMutex; std::deque eventQueue; }; } // namespace tooling