Bug 962044 - Forward event loop lag messages via an observer. r=ted

This commit is contained in:
Vivien Nicolas 2014-02-05 19:53:53 +01:00
parent 2d9332319c
commit cd0cf4ebe2

View File

@ -64,6 +64,12 @@
#include <prthread.h>
#include <prtime.h>
#ifdef MOZ_WIDGET_GONK
#include "nsThreadUtils.h"
#include "nsIObserverService.h"
#include "mozilla/Services.h"
#endif
using mozilla::TimeDuration;
using mozilla::TimeStamp;
using mozilla::FireAndWaitForTracerEvent;
@ -77,6 +83,31 @@ struct TracerStartClosure {
bool mLogTracing;
};
#ifdef MOZ_WIDGET_GONK
class EventLoopLagDispatcher : public nsRunnable
{
public:
explicit EventLoopLagDispatcher(int aLag)
: mLag(aLag) {}
NS_IMETHODIMP Run()
{
nsCOMPtr<nsIObserverService> obsService =
mozilla::services::GetObserverService();
if (!obsService) {
return NS_ERROR_FAILURE;
}
nsAutoString value;
value.AppendInt(mLag);
return obsService->NotifyObservers(nullptr, "event-loop-lag", value.get());
}
private:
int mLag;
};
#endif
/*
* The tracer thread fires events at the native event loop roughly
* every kMeasureInterval. It will sleep to attempt not to send them
@ -146,6 +177,10 @@ void TracerThread(void *arg)
fprintf(log, "MOZ_EVENT_TRACE sample %llu %lf\n",
now,
duration.ToMilliseconds());
#ifdef MOZ_WIDGET_GONK
NS_DispatchToMainThread(
new EventLoopLagDispatcher(int(duration.ToSecondsSigDigits() * 1000)));
#endif
}
if (next_sleep > duration.ToMilliseconds()) {