diff --git a/tools/profiler/platform-linux.cc b/tools/profiler/platform-linux.cc index 2ea2534bdeea..96bd6e8b0511 100644 --- a/tools/profiler/platform-linux.cc +++ b/tools/profiler/platform-linux.cc @@ -68,6 +68,7 @@ #include "mozilla/Mutex.h" #include "mozilla/Atomics.h" #include "mozilla/LinuxSignal.h" +#include "mozilla/TimeStamp.h" #include "ProfileEntry.h" #include "nsThreadUtils.h" #include "TableTicker.h" @@ -101,6 +102,8 @@ pid_t gettid() } #endif +using namespace mozilla; + /* static */ Thread::tid_t Thread::GetCurrentId() { @@ -292,7 +295,10 @@ static void* SignalSender(void* arg) { int vm_tgid_ = getpid(); + TimeDuration lastSleepOverhead = 0; + TimeStamp sampleStart = TimeStamp::Now(); while (SamplerRegistry::sampler->IsActive()) { + SamplerRegistry::sampler->HandleSaveRequest(); SamplerRegistry::sampler->DeleteExpiredMarkers(); @@ -345,14 +351,13 @@ static void* SignalSender(void* arg) { } } - // Convert ms to us and subtract 100 us to compensate delays - // occuring during signal delivery. - // TODO measure and confirm this. - int interval = floor(SamplerRegistry::sampler->interval() * 1000 + 0.5) - 100; - if (interval <= 0) { - interval = 1; - } - OS::SleepMicro(interval); + TimeStamp targetSleepEndTime = sampleStart + TimeDuration::FromMicroseconds(SamplerRegistry::sampler->interval() * 1000); + TimeStamp beforeSleep = TimeStamp::Now(); + TimeDuration targetSleepDuration = targetSleepEndTime - beforeSleep; + double sleepTime = std::max(0.0, (targetSleepDuration - lastSleepOverhead).ToMicroseconds()); + OS::SleepMicro(sleepTime); + sampleStart = TimeStamp::Now(); + lastSleepOverhead = sampleStart - (beforeSleep + TimeDuration::FromMicroseconds(sleepTime)); } return 0; } diff --git a/tools/profiler/platform-macos.cc b/tools/profiler/platform-macos.cc index bcd91f76130e..ee5cf6010c7a 100644 --- a/tools/profiler/platform-macos.cc +++ b/tools/profiler/platform-macos.cc @@ -35,6 +35,7 @@ #include "platform.h" #include "TableTicker.h" #include "UnwinderThread2.h" /* uwt__register_thread_for_profiling */ +#include "mozilla/TimeStamp.h" // Memory profile #include "nsMemoryReporterManager.h" @@ -202,6 +203,8 @@ class SamplerThread : public Thread { // Implement Thread::Run(). virtual void Run() { + TimeDuration lastSleepOverhead = 0; + TimeStamp sampleStart = TimeStamp::Now(); while (SamplerRegistry::sampler->IsActive()) { SamplerRegistry::sampler->DeleteExpiredMarkers(); if (!SamplerRegistry::sampler->IsPaused()) { @@ -231,7 +234,14 @@ class SamplerThread : public Thread { isFirstProfiledThread = false; } } - OS::SleepMicro(intervalMicro_); + + TimeStamp targetSleepEndTime = sampleStart + TimeDuration::FromMicroseconds(intervalMicro_); + TimeStamp beforeSleep = TimeStamp::Now(); + TimeDuration targetSleepDuration = targetSleepEndTime - beforeSleep; + double sleepTime = std::max(0.0, (targetSleepDuration - lastSleepOverhead).ToMicroseconds()); + OS::SleepMicro(sleepTime); + sampleStart = TimeStamp::Now(); + lastSleepOverhead = sampleStart - (beforeSleep + TimeDuration::FromMicroseconds(sleepTime)); } }