mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 11:25:00 +00:00
Bug 781124 - Report CPU usage for hung flash processes. r=bsmedberg
This commit is contained in:
parent
19a75c84b2
commit
d1e89b6b8a
@ -110,7 +110,7 @@ PluginModuleParent::PluginModuleParent(const char* aFilePath)
|
||||
, mPlugin(NULL)
|
||||
, mTaskFactory(this)
|
||||
#ifdef XP_WIN
|
||||
, mPluginCpuUsageOnHang(-1)
|
||||
, mPluginCpuUsageOnHang()
|
||||
#endif
|
||||
#ifdef MOZ_CRASHREPORTER_INJECTOR
|
||||
, mFlashProcess1(0)
|
||||
@ -178,13 +178,21 @@ PluginModuleParent::WriteExtraDataForMinidump(AnnotationTable& notes)
|
||||
if (!hangID.IsEmpty()) {
|
||||
notes.Put(CS("HangID"), NS_ConvertUTF16toUTF8(hangID));
|
||||
#ifdef XP_WIN
|
||||
if (mPluginCpuUsageOnHang >= 0) {
|
||||
nsCString cpuUsageStr;
|
||||
cpuUsageStr.AppendFloat(std::ceil(mPluginCpuUsageOnHang * 100) / 100);
|
||||
notes.Put(CS("PluginCpuUsage"), cpuUsageStr);
|
||||
|
||||
if (mPluginCpuUsageOnHang.Length() > 0) {
|
||||
notes.Put(CS("NumberOfProcessors"),
|
||||
nsPrintfCString("%d", PR_GetNumberOfProcessors()));
|
||||
|
||||
nsCString cpuUsageStr;
|
||||
cpuUsageStr.AppendFloat(std::ceil(mPluginCpuUsageOnHang[0] * 100) / 100);
|
||||
notes.Put(CS("PluginCpuUsage"), cpuUsageStr);
|
||||
|
||||
#ifdef MOZ_CRASHREPORTER_INJECTOR
|
||||
for (PRUint32 i=1; i<mPluginCpuUsageOnHang.Length(); ++i) {
|
||||
nsCString tempStr;
|
||||
tempStr.AppendFloat(std::ceil(mPluginCpuUsageOnHang[i] * 100) / 100);
|
||||
notes.Put(nsPrintfCString("CpuUsageFlashProcess%d", i), tempStr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -229,42 +237,55 @@ FileTimeToUTC(const FILETIME& ftime)
|
||||
return li.QuadPart;
|
||||
}
|
||||
|
||||
bool
|
||||
GetProcessCpuUsage(const base::ProcessHandle& processHandle, float& cpuUsage)
|
||||
struct CpuUsageSamples
|
||||
{
|
||||
PRUint64 sampleTimes[2];
|
||||
PRUint64 cpuTimes[2];
|
||||
};
|
||||
|
||||
bool
|
||||
GetProcessCpuUsage(const InfallibleTArray<base::ProcessHandle>& processHandles, InfallibleTArray<float>& cpuUsage)
|
||||
{
|
||||
InfallibleTArray<CpuUsageSamples> samples(processHandles.Length());
|
||||
FILETIME creationTime, exitTime, kernelTime, userTime, currentTime;
|
||||
BOOL res;
|
||||
|
||||
::GetSystemTimeAsFileTime(¤tTime);
|
||||
res = ::GetProcessTimes(processHandle, &creationTime, &exitTime, &kernelTime, &userTime);
|
||||
if (!res) {
|
||||
NS_WARNING("failed to get process times");
|
||||
return false;
|
||||
}
|
||||
|
||||
PRUint64 sampleTimes[2];
|
||||
PRUint64 cpuTimes[2];
|
||||
for (PRUint32 i = 0; i < processHandles.Length(); ++i) {
|
||||
::GetSystemTimeAsFileTime(¤tTime);
|
||||
res = ::GetProcessTimes(processHandles[i], &creationTime, &exitTime, &kernelTime, &userTime);
|
||||
if (!res) {
|
||||
NS_WARNING("failed to get process times");
|
||||
return false;
|
||||
}
|
||||
|
||||
sampleTimes[0] = FileTimeToUTC(currentTime);
|
||||
cpuTimes[0] = FileTimeToUTC(kernelTime) + FileTimeToUTC(userTime);
|
||||
CpuUsageSamples s;
|
||||
s.sampleTimes[0] = FileTimeToUTC(currentTime);
|
||||
s.cpuTimes[0] = FileTimeToUTC(kernelTime) + FileTimeToUTC(userTime);
|
||||
samples.AppendElement(s);
|
||||
}
|
||||
|
||||
// we already hung for a while, a little bit longer won't matter
|
||||
::Sleep(50);
|
||||
|
||||
::GetSystemTimeAsFileTime(¤tTime);
|
||||
res = ::GetProcessTimes(processHandle, &creationTime, &exitTime, &kernelTime, &userTime);
|
||||
if (!res) {
|
||||
NS_WARNING("failed to get process times");
|
||||
return false;
|
||||
const PRInt32 numberOfProcessors = PR_GetNumberOfProcessors();
|
||||
|
||||
for (PRUint32 i = 0; i < processHandles.Length(); ++i) {
|
||||
::GetSystemTimeAsFileTime(¤tTime);
|
||||
res = ::GetProcessTimes(processHandles[i], &creationTime, &exitTime, &kernelTime, &userTime);
|
||||
if (!res) {
|
||||
NS_WARNING("failed to get process times");
|
||||
return false;
|
||||
}
|
||||
|
||||
samples[i].sampleTimes[1] = FileTimeToUTC(currentTime);
|
||||
samples[i].cpuTimes[1] = FileTimeToUTC(kernelTime) + FileTimeToUTC(userTime);
|
||||
|
||||
const PRUint64 deltaSampleTime = samples[i].sampleTimes[1] - samples[i].sampleTimes[0];
|
||||
const PRUint64 deltaCpuTime = samples[i].cpuTimes[1] - samples[i].cpuTimes[0];
|
||||
const float usage = 100.f * (float(deltaCpuTime) / deltaSampleTime) / numberOfProcessors;
|
||||
cpuUsage.AppendElement(usage);
|
||||
}
|
||||
|
||||
sampleTimes[1] = FileTimeToUTC(currentTime);
|
||||
cpuTimes[1] = FileTimeToUTC(kernelTime) + FileTimeToUTC(userTime);
|
||||
|
||||
const PRUint64 deltaSampleTime = sampleTimes[1] - sampleTimes[0];
|
||||
const PRUint64 deltaCpuTime = cpuTimes[1] - cpuTimes[0];
|
||||
cpuUsage = 100.f * (float(deltaCpuTime) / deltaSampleTime) / PR_GetNumberOfProcessors();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -290,9 +311,23 @@ PluginModuleParent::ShouldContinueFromReplyTimeout()
|
||||
#endif
|
||||
|
||||
#ifdef XP_WIN
|
||||
float cpuUsage;
|
||||
if (GetProcessCpuUsage(OtherProcess(), cpuUsage)) {
|
||||
mPluginCpuUsageOnHang = cpuUsage;
|
||||
// collect cpu usage for plugin processes
|
||||
|
||||
InfallibleTArray<base::ProcessHandle> processHandles;
|
||||
base::ProcessHandle handle;
|
||||
|
||||
processHandles.AppendElement(OtherProcess());
|
||||
#ifdef MOZ_CRASHREPORTER_INJECTOR
|
||||
if (mFlashProcess1 && base::OpenProcessHandle(mFlashProcess1, &handle)) {
|
||||
processHandles.AppendElement(handle);
|
||||
}
|
||||
if (mFlashProcess2 && base::OpenProcessHandle(mFlashProcess2, &handle)) {
|
||||
processHandles.AppendElement(handle);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!GetProcessCpuUsage(processHandles, mPluginCpuUsageOnHang)) {
|
||||
mPluginCpuUsageOnHang.Clear();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -302,7 +302,7 @@ private:
|
||||
nsString mBrowserDumpID;
|
||||
nsString mHangID;
|
||||
#ifdef XP_WIN
|
||||
float mPluginCpuUsageOnHang;
|
||||
InfallibleTArray<float> mPluginCpuUsageOnHang;
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_X11
|
||||
|
Loading…
Reference in New Issue
Block a user