diff --git a/profiler/build/win32/Tracy.vcxproj b/profiler/build/win32/Tracy.vcxproj index e539a607..7bc3ddc6 100644 --- a/profiler/build/win32/Tracy.vcxproj +++ b/profiler/build/win32/Tracy.vcxproj @@ -123,6 +123,7 @@ + NotSet NotSet @@ -185,6 +186,7 @@ + diff --git a/profiler/build/win32/Tracy.vcxproj.filters b/profiler/build/win32/Tracy.vcxproj.filters index d7908bb6..8b89f6f9 100644 --- a/profiler/build/win32/Tracy.vcxproj.filters +++ b/profiler/build/win32/Tracy.vcxproj.filters @@ -99,6 +99,9 @@ server + + src + @@ -269,6 +272,9 @@ server + + src + diff --git a/profiler/src/ResolvService.cpp b/profiler/src/ResolvService.cpp new file mode 100644 index 00000000..845258e3 --- /dev/null +++ b/profiler/src/ResolvService.cpp @@ -0,0 +1,55 @@ +#ifdef _MSC_VER +# include +#else +# include +# include +# include +#endif + +#include "ResolvService.hpp" + +ResolvService::ResolvService() + : m_exit( false ) + , m_thread( [this] { Worker(); } ) +{ +} + +ResolvService::~ResolvService() +{ + m_exit.store( true, std::memory_order_relaxed ); + m_cv.notify_one(); + m_thread.join(); +} + +void ResolvService::Query( uint32_t ip, const std::function& callback ) +{ + std::lock_guard lock( m_lock ); + m_queue.emplace_back( QueueItem { ip, callback } ); + m_cv.notify_one(); +} + +void ResolvService::Worker() +{ + struct sockaddr_in addr = {}; + addr.sin_family = AF_INET; + addr.sin_port = 8086; + + char buf[128]; + + for(;;) + { + std::unique_lock lock( m_lock ); + m_cv.wait( lock, [this] { return !m_queue.empty() || m_exit.load( std::memory_order_relaxed ); } ); + if( m_exit.load( std::memory_order_relaxed ) ) return; + auto query = m_queue.back(); + m_queue.pop_back(); + lock.unlock(); + + addr.sin_addr.s_addr = query.ip; + if( getnameinfo( (const struct sockaddr*)&addr, sizeof( sockaddr_in ), buf, 128, nullptr, 0, NI_NOFQDN ) != 0 ) + { + inet_ntop( AF_INET, &query.ip, buf, 17 ); + } + query.callback( buf ); + } +} diff --git a/profiler/src/ResolvService.hpp b/profiler/src/ResolvService.hpp new file mode 100644 index 00000000..f75c13f4 --- /dev/null +++ b/profiler/src/ResolvService.hpp @@ -0,0 +1,37 @@ +#ifndef __RESOLVSERVICE_HPP__ +#define __RESOLVSERVICE_HPP__ + +#include +#include +#include +#include +#include +#include +#include +#include + +class ResolvService +{ + struct QueueItem + { + uint32_t ip; + std::function callback; + }; + +public: + ResolvService(); + ~ResolvService(); + + void Query( uint32_t ip, const std::function& callback ); + +private: + void Worker(); + + std::atomic m_exit; + std::mutex m_lock; + std::condition_variable m_cv; + std::vector m_queue; + std::thread m_thread; +}; + +#endif