pcsx2: implement thread timing on linux => display cpu usage on title bar

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4880 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
gregory.hainaut 2011-08-28 09:34:43 +00:00
parent e55da1ab04
commit bd1ed676ec
1 changed files with 33 additions and 4 deletions

View File

@ -57,8 +57,18 @@ __forceinline void Threading::DisableHiresScheduler()
u64 Threading::GetThreadTicksPerSecond()
{
// Returning 0 is like saying "I'm not supported yet!"
return 0;
// Note the value is not correct but I'm not sure we can do better because
// most modern system use a tickless system anyway
// Besides x86 architecture always returns 100;
/* A Forum post extract
sysconf(SC_CLK_TCK) does not give the frequency of the timer interrupts in Linux. It gives
the frequency of jiffies which is visible to userspace in things like the counters in various directories in /proc
The actual frequency is hidden from userspace, deliberately. Indeed, some systems
use dynamic ticks or "tickless" systems, so there aren't really any at all.
*/
u32 hertz = sysconf(_SC_CLK_TCK);
return hertz;
}
u64 Threading::GetThreadCpuTime()
@ -67,7 +77,16 @@ u64 Threading::GetThreadCpuTime()
// thread has used on the CPU (scaled by the value returned by GetThreadTicksPerSecond(),
// which typically would be an OS-provided scalar or some sort).
return 0;
clockid_t cid;
int err = pthread_getcpuclockid(pthread_self(), &cid);
if (err) return 0;
struct timespec ts;
clock_gettime(cid, &ts);
unsigned long timeJiff = (ts.tv_sec*1e6 + ts.tv_nsec / 1000)/1e6 * GetThreadTicksPerSecond();
return timeJiff;
}
u64 Threading::pxThread::GetCpuTime() const
@ -77,13 +96,23 @@ u64 Threading::pxThread::GetCpuTime() const
// thread has used on the CPU (scaled by the value returned by GetThreadTicksPerSecond(),
// which typically would be an OS-provided scalar or some sort).
return 0;
clockid_t cid;
int err = pthread_getcpuclockid(m_native_id, &cid);
if (err) return 0;
struct timespec ts;
clock_gettime(cid, &ts);
unsigned long timeJiff = (ts.tv_sec*1e6 + ts.tv_nsec / 1000)/1e6 * GetThreadTicksPerSecond();
return timeJiff;
}
void Threading::pxThread::_platform_specific_OnStartInThread()
{
// Obtain linux-specific thread IDs or Handles here, which can be used to query
// kernel scheduler performance information.
m_native_id = (uptr) pthread_self();
}
void Threading::pxThread::_platform_specific_OnCleanupInThread()