0
0
mirror of https://github.com/yse/easy_profiler.git synced 2024-12-27 00:31:02 +08:00

[core] fix old msvc 2013 build

This commit is contained in:
Victor Zarubkin 2019-10-23 02:26:00 +03:00
parent a3af57d26e
commit b4494bcef9

View File

@ -123,6 +123,16 @@ static bool isCompatibleVersion(uint32_t _version)
namespace { namespace {
#if defined(_MSC_VER) && _MSC_VER <= 1800
struct async_result_t {};
#define EASY_FINISH_ASYNC async_result_t dummy_async_result; return dummy_async_result
#else
using async_result_t = void;
#define EASY_FINISH_ASYNC
#endif
using async_future = std::future<async_result_t>;
template <class T> template <class T>
struct Counter struct Counter
{ {
@ -153,7 +163,7 @@ struct Stats
class ReaderThreadPool class ReaderThreadPool
{ {
std::vector<std::thread> m_threads; std::vector<std::thread> m_threads;
std::deque<std::packaged_task<void()> > m_tasks; std::deque<std::packaged_task<async_result_t()> > m_tasks;
std::mutex m_mutex; std::mutex m_mutex;
std::condition_variable m_cv; std::condition_variable m_cv;
std::atomic_bool m_stopFlag; std::atomic_bool m_stopFlag;
@ -179,7 +189,7 @@ public:
} }
} }
std::future<void> async(std::function<void()> func) async_future async(std::function<async_result_t()> func)
{ {
std::unique_lock<std::mutex> lock(m_mutex); std::unique_lock<std::mutex> lock(m_mutex);
m_tasks.emplace_back(std::move(func)); m_tasks.emplace_back(std::move(func));
@ -584,12 +594,12 @@ static void calculate_medians_async(ReaderThreadPool& pool, TStatsMap& stats_map
const auto threads_count = std::min(static_cast<size_t>(std::thread::hardware_concurrency()), stats_map.size()); const auto threads_count = std::min(static_cast<size_t>(std::thread::hardware_concurrency()), stats_map.size());
const auto count_per_thread = stats_map.size() / threads_count; const auto count_per_thread = stats_map.size() / threads_count;
std::vector<std::future<void>> results; std::vector<async_future> results;
results.reserve(threads_count); results.reserve(threads_count);
for (size_t i = 1; i <= threads_count; ++i) for (size_t i = 1; i <= threads_count; ++i)
{ {
results.emplace_back(pool.async([i, threads_count, count_per_thread, &stats_map] results.emplace_back(pool.async([i, threads_count, count_per_thread, &stats_map] () -> async_result_t
{ {
auto begin = stats_map.begin(); auto begin = stats_map.begin();
const auto advance_count = (i - 1) * count_per_thread; const auto advance_count = (i - 1) * count_per_thread;
@ -606,6 +616,8 @@ static void calculate_medians_async(ReaderThreadPool& pool, TStatsMap& stats_map
} }
calculate_medians(begin, end); calculate_medians(begin, end);
EASY_FINISH_ASYNC; // MSVC 2013 hack
})); }));
} }
@ -1335,7 +1347,7 @@ extern "C" PROFILER_API profiler::block_index_t fillTreesFromStream(std::atomic<
EASY_BLOCK("Gather statistics for roots", profiler::colors::Purple); EASY_BLOCK("Gather statistics for roots", profiler::colors::Purple);
if (gather_statistics) if (gather_statistics)
{ {
std::vector<std::future<void>> results; std::vector<async_future> results;
results.reserve(threaded_trees.size()); results.reserve(threaded_trees.size());
for (auto& it : threaded_trees) for (auto& it : threaded_trees)
@ -1348,7 +1360,7 @@ extern "C" PROFILER_API profiler::block_index_t fillTreesFromStream(std::atomic<
auto& per_parent_statistics = parent_statistics[it.first]; auto& per_parent_statistics = parent_statistics[it.first];
per_parent_statistics.clear(); per_parent_statistics.clear();
results.emplace_back(pool.async([&] results.emplace_back(pool.async([&] () -> async_result_t
{ {
//std::sort(root.sync.begin(), root.sync.end(), [&blocks](profiler::block_index_t left, profiler::block_index_t right) //std::sort(root.sync.begin(), root.sync.end(), [&blocks](profiler::block_index_t left, profiler::block_index_t right)
//{ //{
@ -1396,6 +1408,8 @@ extern "C" PROFILER_API profiler::block_index_t fillTreesFromStream(std::atomic<
} }
++root.depth; ++root.depth;
EASY_FINISH_ASYNC; // MSVC 2013 hack
})); }));
} }
@ -1533,6 +1547,7 @@ extern "C" PROFILER_API bool readDescriptionsFromStream(std::atomic<int>& progre
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
#undef EASY_CONVERT_TO_NANO #undef EASY_CONVERT_TO_NANO
#undef EASY_FINISH_ASYNC
#ifdef EASY_USE_FLOATING_POINT_CONVERSION #ifdef EASY_USE_FLOATING_POINT_CONVERSION
# ifdef _MSC_VER # ifdef _MSC_VER