[Opalvoip-svn] SF.net SVN: opalvoip:[33293] ptlib/trunk
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2015-01-27 05:41:56
|
Revision: 33293 http://sourceforge.net/p/opalvoip/code/33293 Author: rjongbloed Date: 2015-01-27 05:41:48 +0000 (Tue, 27 Jan 2015) Log Message: ----------- Expose (mostly) portable profiling CPU cycles functions. Modified Paths: -------------- ptlib/trunk/include/ptlib/object.h ptlib/trunk/src/ptlib/common/object.cxx Modified: ptlib/trunk/include/ptlib/object.h =================================================================== --- ptlib/trunk/include/ptlib/object.h 2015-01-27 00:40:02 UTC (rev 33292) +++ ptlib/trunk/include/ptlib/object.h 2015-01-27 05:41:48 UTC (rev 33293) @@ -1053,6 +1053,20 @@ namespace PProfiling { + #if defined(__i386__) || defined(__x86_64__) + #define PProfilingGetCycles(when) { uint32_t l,h; __asm__ __volatile__ ("rdtsc" : "=a"(l), "=d"(h)); when = ((uint64_t)h<<32)|l; } + #elif defined(_M_IX86) || defined(_M_X64) + #define PProfilingGetCycles(when) when = __rdtsc() + #elif defined(_WIN32) + #define PProfilingGetCycles(when) { LARGE_INTEGER li; QueryPerformanceCounter(&li); when = li.QuadPart; } + #elif defined(CLOCK_MONOTONIC) + #define PProfilingGetCycles(when) { timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); when = ts.ts_sec*1000000000ULL+ts.ts_nsec; } + #else + #define PProfilingGetCycles(when) { timeval tv; gettimeofday(&tv, NULL); when = tv.tv_sec*1000000ULL+tv.tv_usec; } + #endif + + PPROFILE_EXCLUDE(void GetFrequency(uint64_t & freq)); + struct Function { unsigned m_count; Modified: ptlib/trunk/src/ptlib/common/object.cxx =================================================================== --- ptlib/trunk/src/ptlib/common/object.cxx 2015-01-27 00:40:02 UTC (rev 33292) +++ ptlib/trunk/src/ptlib/common/object.cxx 2015-01-27 05:41:48 UTC (rev 33293) @@ -1318,37 +1318,48 @@ #if P_PROFILING // Currently only supported in GNU && *nix -#include <fstream> - namespace PProfiling { -#if defined(__i386__) || defined(__x86_64__) -#define GetTimestamp(when) { uint32_t l,h; __asm__ __volatile__ ("rdtsc" : "=a"(l), "=d"(h)); when = ((uint64_t)h<<32)|l; } -PPROFILE_EXCLUDE(static void GetFrequency(uint64_t & freq)); -static void GetFrequency(uint64_t & freq) -{ - freq = 2000000000; // 2GHz - ifstream cpuinfo("/proc/cpuinfo", ios::in); - while (cpuinfo.good()) { - char line[100]; - cpuinfo.getline(line, sizeof(line)); - if (strncmp(line, "cpu MHz", 7) == 0) { - freq = (uint64_t)(atof(strchr(line, ':')+1)*1000000); - break; + #if defined(__i386__) || defined(__x86_64__) + void GetFrequency(uint64_t & freq) + { + freq = 2000000000; // 2GHz + ifstream cpuinfo("/proc/cpuinfo", ios::in); + while (cpuinfo.good()) { + char line[100]; + cpuinfo.getline(line, sizeof(line)); + if (strncmp(line, "cpu MHz", 7) == 0) { + freq = (uint64_t)(atof(strchr(line, ':')+1)*1000000); + break; + } + } } - } -} -#elif defined(_M_IX86) || defined(_M_X64) -#define GetTimestamp(when) when = __rdtsc() -#define GetFrequency(freq) { LARGE_INTEGER li; QueryPerformanceFrequency(&li); freq = li.QuadPart*1000; } -#elif defined(_WIN32) -#define GetTimestamp(when) { LARGE_INTEGER li; QueryPerformanceCounter(&li); when = li.QuadPart; } -#define GetFrequency(freq) { LARGE_INTEGER li; QueryPerformanceFrequency(&li); freq = li.QuadPart; } -#else -#define GetTimestamp(when) { timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); when = t.tv_sec*1000000000ULL+t.tv_nsec; } -#define GetFrequency(freq) freq = 1000000000ULL -#endif + #elif defined(_M_IX86) || defined(_M_X64) + void GetFrequency(uint64_t & freq) + { + LARGE_INTEGER li; + QueryPerformanceFrequency(&li); + freq = li.QuadPart*1000; + } + #elif defined(_WIN32) + void GetFrequency(uint64_t & freq) + { + LARGE_INTEGER li; + QueryPerformanceFrequency(&li); + freq = li.QuadPart; + } + #elif defined(CLOCK_MONOTONIC) + void GetFrequency(uint64_t & freq) + { + freq = 1000000000ULL; + } + #else + void GetFrequency(uint64_t & freq) + { + freq = 1000000ULL; + } + #endif enum FunctionType @@ -1445,7 +1456,7 @@ m_function.m_pointer = function; m_function.m_caller = caller; - GetTimestamp(m_when); + PProfilingGetCycles(m_when); m_link = s_database.m_functions.exchange(this); } @@ -1459,7 +1470,7 @@ m_function.m_file = file; m_function.m_line = line; - GetTimestamp(m_when); + PProfilingGetCycles(m_when); m_link = s_database.m_functions.exchange(this); } @@ -1563,7 +1574,7 @@ , m_functions(NULL) , m_threads(NULL) { - GetTimestamp(m_start); + PProfilingGetCycles(m_start); } @@ -1604,7 +1615,7 @@ void Reset() { - GetTimestamp(s_database.m_start); + PProfilingGetCycles(s_database.m_start); ThreadRawData * thrd = s_database.m_threads.exchange(NULL); FunctionRawData * func = s_database.m_functions.exchange(NULL); @@ -1885,7 +1896,7 @@ void Analyse(Analysis & analysis) { - GetTimestamp(analysis.m_durationCycles); + PProfilingGetCycles(analysis.m_durationCycles); analysis.m_durationCycles -= s_database.m_start; GetFrequency(analysis.m_frequency); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |