mirror of
https://github.com/yse/easy_profiler.git
synced 2025-01-14 00:27:55 +08:00
minor refactoring
This commit is contained in:
parent
341a549f61
commit
941c5667bd
@ -1310,7 +1310,7 @@ uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bo
|
|||||||
|
|
||||||
// wait for all threads finish opened frames
|
// wait for all threads finish opened frames
|
||||||
EASY_LOG_ONLY(bool logged = false);
|
EASY_LOG_ONLY(bool logged = false);
|
||||||
for (auto it = m_threads.begin(), end = m_threads.end(); it != end;)
|
for (auto thread_it = m_threads.begin(), end = m_threads.end(); thread_it != end;)
|
||||||
{
|
{
|
||||||
if (_async && m_stopDumping.load(std::memory_order_acquire))
|
if (_async && m_stopDumping.load(std::memory_order_acquire))
|
||||||
{
|
{
|
||||||
@ -1319,9 +1319,9 @@ uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bo
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!it->second.profiledFrameOpened.load(std::memory_order_acquire))
|
if (!thread_it->second.profiledFrameOpened.load(std::memory_order_acquire))
|
||||||
{
|
{
|
||||||
++it;
|
++thread_it;
|
||||||
EASY_LOG_ONLY(logged = false);
|
EASY_LOG_ONLY(logged = false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1330,10 +1330,10 @@ uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bo
|
|||||||
if (!logged)
|
if (!logged)
|
||||||
{
|
{
|
||||||
logged = true;
|
logged = true;
|
||||||
if (it->second.named)
|
if (thread_it->second.named)
|
||||||
EASY_WARNING("Waiting for thread \"" << it->second.name << "\" finish opened frame (which is top EASY_BLOCK for this thread)...\n");
|
EASY_WARNING("Waiting for thread \"" << thread_it->second.name << "\" finish opened frame (which is top EASY_BLOCK for this thread)...\n");
|
||||||
else
|
else
|
||||||
EASY_WARNING("Waiting for thread " << it->first << " finish opened frame (which is top EASY_BLOCK for this thread)...\n");
|
EASY_WARNING("Waiting for thread " << thread_it->first << " finish opened frame (which is top EASY_BLOCK for this thread)...\n");
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1409,7 +1409,7 @@ uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bo
|
|||||||
// Calculate used memory total size and total blocks number
|
// Calculate used memory total size and total blocks number
|
||||||
uint64_t usedMemorySize = 0;
|
uint64_t usedMemorySize = 0;
|
||||||
uint32_t blocks_number = 0;
|
uint32_t blocks_number = 0;
|
||||||
for (auto it = m_threads.begin(), end = m_threads.end(); it != end;)
|
for (auto thread_it = m_threads.begin(), end = m_threads.end(); thread_it != end;)
|
||||||
{
|
{
|
||||||
if (_async && m_stopDumping.load(std::memory_order_acquire))
|
if (_async && m_stopDumping.load(std::memory_order_acquire))
|
||||||
{
|
{
|
||||||
@ -1420,15 +1420,15 @@ uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bo
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& t = it->second;
|
auto& thread = thread_it->second;
|
||||||
uint32_t num = static_cast<uint32_t>(t.blocks.closedList.size()) + static_cast<uint32_t>(t.sync.closedList.size());
|
uint32_t num = static_cast<uint32_t>(thread.blocks.closedList.size()) + static_cast<uint32_t>(thread.sync.closedList.size());
|
||||||
const char expired = ProfileManager::checkThreadExpired(t);
|
const char expired = ProfileManager::checkThreadExpired(thread);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (num == 0 && expired != 0)
|
if (num == 0 && expired != 0)
|
||||||
#elif defined(EASY_CXX11_TLS_AVAILABLE)
|
#elif defined(EASY_CXX11_TLS_AVAILABLE)
|
||||||
// Removing !guarded thread when thread_local feature is supported is safe.
|
// Removing !guarded thread when thread_local feature is supported is safe.
|
||||||
if (num == 0 && (expired != 0 || !t.guarded))
|
if (num == 0 && (expired != 0 || !thread.guarded))
|
||||||
#elif EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS != 0
|
#elif EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS != 0
|
||||||
# pragma message "Warning: Removing !guarded thread without thread_local support may cause an application crash, but fixes potential memory leak when using pthreads."
|
# pragma message "Warning: Removing !guarded thread without thread_local support may cause an application crash, but fixes potential memory leak when using pthreads."
|
||||||
// Removing !guarded thread may cause an application crash if a thread would start to write blocks after ThreadStorage remove.
|
// Removing !guarded thread may cause an application crash if a thread would start to write blocks after ThreadStorage remove.
|
||||||
@ -1440,22 +1440,22 @@ uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bo
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
// Remove thread if it contains no profiled information and has been finished (or is not guarded --deprecated).
|
// Remove thread if it contains no profiled information and has been finished (or is not guarded --deprecated).
|
||||||
profiler::thread_id_t id = it->first;
|
profiler::thread_id_t id = thread_it->first;
|
||||||
if (!mainThreadExpired && m_mainThreadId.compare_exchange_weak(id, 0, std::memory_order_release, std::memory_order_acquire))
|
if (!mainThreadExpired && m_mainThreadId.compare_exchange_weak(id, 0, std::memory_order_release, std::memory_order_acquire))
|
||||||
mainThreadExpired = true;
|
mainThreadExpired = true;
|
||||||
m_threads.erase(it++);
|
m_threads.erase(thread_it++);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (expired == 1)
|
if (expired == 1)
|
||||||
{
|
{
|
||||||
EASY_FORCE_EVENT3(t, endtime, "ThreadExpired", EASY_COLOR_THREAD_END);
|
EASY_FORCE_EVENT3(thread, endtime, "ThreadExpired", EASY_COLOR_THREAD_END);
|
||||||
++num;
|
++num;
|
||||||
}
|
}
|
||||||
|
|
||||||
usedMemorySize += t.blocks.usedMemorySize + t.sync.usedMemorySize;
|
usedMemorySize += thread.blocks.usedMemorySize + thread.sync.usedMemorySize;
|
||||||
blocks_number += num;
|
blocks_number += num;
|
||||||
++it;
|
++thread_it;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write profiler signature and version
|
// Write profiler signature and version
|
||||||
@ -1500,7 +1500,7 @@ uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write blocks and context switch events for each thread
|
// Write blocks and context switch events for each thread
|
||||||
for (auto it = m_threads.begin(), end = m_threads.end(); it != end;)
|
for (auto thread_it = m_threads.begin(), end = m_threads.end(); thread_it != end;)
|
||||||
{
|
{
|
||||||
if (_async && m_stopDumping.load(std::memory_order_acquire))
|
if (_async && m_stopDumping.load(std::memory_order_acquire))
|
||||||
{
|
{
|
||||||
@ -1511,37 +1511,37 @@ uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bo
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& t = it->second;
|
auto& thread = thread_it->second;
|
||||||
|
|
||||||
_outputStream.write(it->first);
|
_outputStream.write(thread_it->first);
|
||||||
|
|
||||||
const auto name_size = static_cast<uint16_t>(t.name.size() + 1);
|
const auto name_size = static_cast<uint16_t>(thread.name.size() + 1);
|
||||||
_outputStream.write(name_size);
|
_outputStream.write(name_size);
|
||||||
_outputStream.write(name_size > 1 ? t.name.c_str() : "", name_size);
|
_outputStream.write(name_size > 1 ? thread.name.c_str() : "", name_size);
|
||||||
|
|
||||||
_outputStream.write(t.sync.closedList.size());
|
_outputStream.write(thread.sync.closedList.size());
|
||||||
if (!t.sync.closedList.empty())
|
if (!thread.sync.closedList.empty())
|
||||||
t.sync.closedList.serialize(_outputStream);
|
thread.sync.closedList.serialize(_outputStream);
|
||||||
|
|
||||||
_outputStream.write(t.blocks.closedList.size());
|
_outputStream.write(thread.blocks.closedList.size());
|
||||||
if (!t.blocks.closedList.empty())
|
if (!thread.blocks.closedList.empty())
|
||||||
t.blocks.closedList.serialize(_outputStream);
|
thread.blocks.closedList.serialize(_outputStream);
|
||||||
|
|
||||||
t.clearClosed();
|
thread.clearClosed();
|
||||||
//t.blocks.openedList.clear();
|
//t.blocks.openedList.clear();
|
||||||
t.sync.openedList.clear();
|
thread.sync.openedList.clear();
|
||||||
|
|
||||||
if (t.expired.load(std::memory_order_acquire) != 0)
|
if (thread.expired.load(std::memory_order_acquire) != 0)
|
||||||
{
|
{
|
||||||
// Remove expired thread after writing all profiled information
|
// Remove expired thread after writing all profiled information
|
||||||
profiler::thread_id_t id = it->first;
|
profiler::thread_id_t id = thread_it->first;
|
||||||
if (!mainThreadExpired && m_mainThreadId.compare_exchange_weak(id, 0, std::memory_order_release, std::memory_order_acquire))
|
if (!mainThreadExpired && m_mainThreadId.compare_exchange_weak(id, 0, std::memory_order_release, std::memory_order_acquire))
|
||||||
mainThreadExpired = true;
|
mainThreadExpired = true;
|
||||||
m_threads.erase(it++);
|
m_threads.erase(thread_it++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
++it;
|
++thread_it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user