FeatherMC/src/network/NetworkManager.cpp

66 lines
1.4 KiB
C++

#include "NetworkManager.h"
#include "logging/Logger.h"
#include <event2/event.h>
#include <event2/thread.h>
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);
}
}