2020-07-25 03:01:16 +01:00
|
|
|
#include "NetworkManager.h"
|
2020-08-07 06:23:12 +01:00
|
|
|
#include "logging/Logger.h"
|
2020-07-25 03:01:16 +01:00
|
|
|
|
|
|
|
#include <event2/event.h>
|
|
|
|
#include <event2/thread.h>
|
|
|
|
|
2020-08-07 06:23:12 +01:00
|
|
|
namespace Feather::Log::Channels
|
|
|
|
{
|
|
|
|
Log::ChannelID LibEvent = Log::Logger::Instance().RegisterChannel("libevent");
|
|
|
|
}
|
|
|
|
|
2020-07-25 03:01:16 +01:00
|
|
|
namespace Feather::Network
|
|
|
|
{
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
void LogCallback(int severity, const char* msg)
|
|
|
|
{
|
2020-08-07 06:23:12 +01:00
|
|
|
Log::Msg(Log::Channels::LibEvent, Log::Level::Info, msg);
|
2020-07-25 03:01:16 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
2020-08-01 00:57:33 +01:00
|
|
|
}
|