X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fprofiler.h;h=e8eac86b13e5b8c0ddf130b11fb3d99233331f2e;hb=984e063374c032ed17764931fd00c19afb92ebb9;hp=e746c489c525355a92d188aeb864676fa505f468;hpb=6833e04bc55156025267c39a58a29007318129fa;p=oweals%2Fminetest.git diff --git a/src/profiler.h b/src/profiler.h index e746c489c..e8eac86b1 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -22,12 +22,19 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" #include -#include "jthread/jmutex.h" -#include "jthread/jmutexautolock.h" #include + +#include "threading/mutex.h" +#include "threading/mutex_auto_lock.h" #include "util/timetaker.h" -#include "util/numeric.h" // paging() -#include "debug.h" // assert() +#include "util/numeric.h" // paging() +#include "debug.h" // assert() + +#define MAX_PROFILER_TEXT_ROWS 20 + +// Global profiler +class Profiler; +extern Profiler *g_profiler; /* Time profiler @@ -42,7 +49,7 @@ public: void add(const std::string &name, float value) { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); { /* No average shall have been used; mark add used as -2 */ std::map::iterator n = m_avgcounts.find(name); @@ -65,29 +72,17 @@ public: void avg(const std::string &name, float value) { - JMutexAutoLock lock(m_mutex); - { - std::map::iterator n = m_avgcounts.find(name); - if(n == m_avgcounts.end()) - m_avgcounts[name] = 1; - else{ - /* No add shall have been used */ - assert(n->second != -2); - n->second = (std::max)(n->second, 0) + 1; - } - } - { - std::map::iterator n = m_data.find(name); - if(n == m_data.end()) - m_data[name] = value; - else - n->second += value; - } + MutexAutoLock lock(m_mutex); + int &count = m_avgcounts[name]; + + assert(count != -2); + count = MYMAX(count, 0) + 1; + m_data[name] += value; } void clear() { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); for(std::map::iterator i = m_data.begin(); i != m_data.end(); ++i) @@ -102,9 +97,24 @@ public: printPage(o, 1, 1); } + float getValue(const std::string &name) const + { + std::map::const_iterator numerator = m_data.find(name); + if (numerator == m_data.end()) + return 0.f; + + std::map::const_iterator denominator = m_avgcounts.find(name); + if (denominator != m_avgcounts.end()){ + if (denominator->second >= 1) + return numerator->second / denominator->second; + } + + return numerator->second; + } + void printPage(std::ostream &o, u32 page, u32 pagecount) { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); u32 minindex, maxindex; paging(m_data.size(), page, pagecount, minindex, maxindex); @@ -149,7 +159,7 @@ public: void graphAdd(const std::string &id, float value) { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); std::map::iterator i = m_graphvalues.find(id); if(i == m_graphvalues.end()) @@ -159,20 +169,20 @@ public: } void graphGet(GraphValues &result) { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); result = m_graphvalues; m_graphvalues.clear(); } void remove(const std::string& name) { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); m_avgcounts.erase(name); m_data.erase(name); } private: - JMutex m_mutex; + Mutex m_mutex; std::map m_data; std::map m_avgcounts; std::map m_graphvalues;