#include "NetworkManager.h" #include "logging/Logger.h" #include #include namespace Feather::Log::Channels { Log::ChannelID LibEvent = Log::Logger::Instance().RegisterChannel("libevent"); } namespace Feather::Network { namespace { void LogCallback(int severity, const char* msg) { Log::Msg(Log::Channels::LibEvent, Log::Level::Info, msg); } } NetworkManager::NetworkManager() { #ifdef _WIN32 WSADATA wsa_data = {}; WSAStartup(MAKEWORD(2, 2), &wsa_data); #endif event_set_log_callback(LogCallback); #if defined(EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED) evthread_use_windows_threads(); #elif defined(EVTHREAD_USE_PTHREADS_IMPLEMENTED) evthread_use_pthreads(); #else # error No threading implemented for EVTHREAD #endif m_eventBase = event_base_new(); m_eventThread = std::thread([]() { NetworkManager::Instance().EventLoop(); }); } NetworkManager::~NetworkManager() { event_base_loopbreak(m_eventBase); m_eventThread.join(); event_base_free(m_eventBase); libevent_global_shutdown(); #ifdef _WIN32 WSACleanup(); #endif } static NetworkManager s_networkManager; NetworkManager& NetworkManager::Instance() { return s_networkManager; } void NetworkManager::EventLoop() { event_base_loop(m_eventBase, EVLOOP_NO_EXIT_ON_EMPTY); } }