mirror of
https://github.com/yse/easy_profiler.git
synced 2024-12-28 17:28:14 +08:00
Fixing problems after changing thread_id_t to uint64_t from uint32_t: There is still a big problem with target-thread ids of context-switch events on *nix systems (it has been stored in block_id_t which is uint32_t and now it requires Core API changes to support new thread_id_t). Also there is a problem with statistics displaying (for top-level blocks parent_index had value of thread-id, it requires a work around now).
This commit is contained in:
parent
35b4796a62
commit
65ac892e32
@ -263,7 +263,12 @@ namespace profiler {
|
|||||||
}; // END of class BlocksTreeRoot.
|
}; // END of class BlocksTreeRoot.
|
||||||
|
|
||||||
typedef ::profiler::BlocksTree::blocks_t blocks_t;
|
typedef ::profiler::BlocksTree::blocks_t blocks_t;
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
typedef ::std::unordered_map<::profiler::thread_id_t, ::profiler::BlocksTreeRoot, ::profiler::passthrough_hash> thread_blocks_tree_t;
|
typedef ::std::unordered_map<::profiler::thread_id_t, ::profiler::BlocksTreeRoot, ::profiler::passthrough_hash> thread_blocks_tree_t;
|
||||||
|
#else
|
||||||
|
typedef ::std::unordered_map<::profiler::thread_id_t, ::profiler::BlocksTreeRoot> thread_blocks_tree_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -1041,7 +1041,10 @@ void ProfileManager::beginContextSwitch(profiler::thread_id_t _thread_id, profil
|
|||||||
if (ts != nullptr)
|
if (ts != nullptr)
|
||||||
// Dirty hack: _target_thread_id will be written to the field "block_id_t m_id"
|
// Dirty hack: _target_thread_id will be written to the field "block_id_t m_id"
|
||||||
// and will be available calling method id().
|
// and will be available calling method id().
|
||||||
ts->sync.openedList.emplace_back(_time, _time, _target_thread_id, _target_process);
|
#ifndef _WIN32
|
||||||
|
#pragma message "WARNING: Fix saving thread_id_t as block_id_t for Context-Switch events !!!!"
|
||||||
|
#endif
|
||||||
|
ts->sync.openedList.emplace_back(_time, _time, (profiler::block_id_t)_target_thread_id, _target_process);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@ -1284,7 +1287,7 @@ char ProfileManager::checkThreadExpired(ThreadStorage& _registeredThread)
|
|||||||
// Check thread for Windows
|
// Check thread for Windows
|
||||||
|
|
||||||
DWORD exitCode = 0;
|
DWORD exitCode = 0;
|
||||||
auto hThread = OpenThread(THREAD_QUERY_LIMITED_INFORMATION, FALSE, _registeredThread.id);
|
auto hThread = OpenThread(THREAD_QUERY_LIMITED_INFORMATION, FALSE, (DWORD)_registeredThread.id);
|
||||||
if (hThread == nullptr || GetExitCodeThread(hThread, &exitCode) == FALSE || exitCode != STILL_ACTIVE)
|
if (hThread == nullptr || GetExitCodeThread(hThread, &exitCode) == FALSE || exitCode != STILL_ACTIVE)
|
||||||
{
|
{
|
||||||
// Thread has been expired
|
// Thread has been expired
|
||||||
|
@ -540,7 +540,11 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
typedef ::std::unordered_map<::profiler::thread_id_t, StatsMap, ::profiler::passthrough_hash> PerThreadStats;
|
typedef ::std::unordered_map<::profiler::thread_id_t, StatsMap, ::profiler::passthrough_hash> PerThreadStats;
|
||||||
|
#else
|
||||||
|
typedef ::std::unordered_map<::profiler::thread_id_t, StatsMap> PerThreadStats;
|
||||||
|
#endif
|
||||||
PerThreadStats parent_statistics, frame_statistics;
|
PerThreadStats parent_statistics, frame_statistics;
|
||||||
IdMap identification_table;
|
IdMap identification_table;
|
||||||
|
|
||||||
|
@ -100,42 +100,43 @@ inline qreal microseconds2units(qreal _value)
|
|||||||
|
|
||||||
namespace profiler_gui {
|
namespace profiler_gui {
|
||||||
|
|
||||||
template <const size_t SIZEOF_T>
|
template <class T, const size_t SIZEOF_T>
|
||||||
struct no_hasher {
|
struct no_hasher : public ::std::hash<T> {
|
||||||
template <class T> inline size_t operator () (const T& _data) const {
|
using ::std::hash<T>::operator ();
|
||||||
return (size_t)_data;
|
//inline size_t operator () (const T& _data) const {
|
||||||
}
|
// return ::std::hash<T>::operator () (_data);
|
||||||
|
//}
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
template <> struct no_hasher<8> {
|
template <class T> struct no_hasher<T, 8> {
|
||||||
template <class T> inline size_t operator () (T _data) const {
|
inline size_t operator () (T _data) const {
|
||||||
return (size_t)_data;
|
return (size_t)_data;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <> struct no_hasher<4> {
|
template <class T> struct no_hasher<T, 4> {
|
||||||
template <class T> inline size_t operator () (T _data) const {
|
inline size_t operator () (T _data) const {
|
||||||
return (size_t)_data;
|
return (size_t)_data;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <> struct no_hasher<2> {
|
template <class T> struct no_hasher<T, 2> {
|
||||||
template <class T> inline size_t operator () (T _data) const {
|
inline size_t operator () (T _data) const {
|
||||||
return (size_t)_data;
|
return (size_t)_data;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <> struct no_hasher<1> {
|
template <class T> struct no_hasher<T, 1> {
|
||||||
template <class T> inline size_t operator () (T _data) const {
|
inline size_t operator () (T _data) const {
|
||||||
return (size_t)_data;
|
return (size_t)_data;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
struct do_no_hash {
|
struct do_no_hash {
|
||||||
typedef no_hasher<sizeof(T)> hasher_t;
|
typedef no_hasher<T, sizeof(T)> hasher_t;
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
Loading…
x
Reference in New Issue
Block a user