Bug 1330184 - Register/unregister the IOInterposeObserver on the main thread, regardless of what thread the profiler is started / stopped on. r=njn

MozReview-Commit-ID: 8Y0rspxBJw3

--HG--
extra : rebase_source : a3fff1f5d94f7071200b7adc7010c11a1198661f
extra : source : fd537bffda4b653dc7191434c42d068b1b9c65b8
This commit is contained in:
Markus Stange 2017-05-16 17:35:05 -04:00
Родитель fe9d6d3008
Коммит 1c59e2f54d
2 изменённых файлов: 27 добавлений и 5 удалений

Просмотреть файл

@ -298,16 +298,32 @@ private:
} }
if (mInterposeObserver) { if (mInterposeObserver) {
mozilla::IOInterposer::Register(mozilla::IOInterposeObserver::OpAll, // We need to register the observer on the main thread, because we want
mInterposeObserver.get()); // to observe IO that happens on the main thread.
if (NS_IsMainThread()) {
IOInterposer::Register(IOInterposeObserver::OpAll, mInterposeObserver);
} else {
RefPtr<ProfilerIOInterposeObserver> observer = mInterposeObserver;
NS_DispatchToMainThread(NS_NewRunnableFunction([=]() {
IOInterposer::Register(IOInterposeObserver::OpAll, observer);
}));
}
} }
} }
~ActivePS() ~ActivePS()
{ {
if (mInterposeObserver) { if (mInterposeObserver) {
mozilla::IOInterposer::Unregister(mozilla::IOInterposeObserver::OpAll, // We need to unregister the observer on the main thread, because that's
mInterposeObserver.get()); // where we've registered it.
if (NS_IsMainThread()) {
IOInterposer::Unregister(IOInterposeObserver::OpAll, mInterposeObserver);
} else {
RefPtr<ProfilerIOInterposeObserver> observer = mInterposeObserver;
NS_DispatchToMainThread(NS_NewRunnableFunction([=]() {
IOInterposer::Unregister(IOInterposeObserver::OpAll, observer);
}));
}
} }
} }
@ -450,7 +466,7 @@ private:
SamplerThread* const mSamplerThread; SamplerThread* const mSamplerThread;
// The interposer that records main thread I/O. // The interposer that records main thread I/O.
const UniquePtr<mozilla::ProfilerIOInterposeObserver> mInterposeObserver; const RefPtr<mozilla::ProfilerIOInterposeObserver> mInterposeObserver;
// Is the profiler paused? // Is the profiler paused?
bool mIsPaused; bool mIsPaused;

Просмотреть файл

@ -8,6 +8,7 @@
#ifdef MOZ_GECKO_PROFILER #ifdef MOZ_GECKO_PROFILER
#include "mozilla/IOInterposer.h" #include "mozilla/IOInterposer.h"
#include "nsISupportsImpl.h"
namespace mozilla { namespace mozilla {
@ -17,8 +18,13 @@ namespace mozilla {
*/ */
class ProfilerIOInterposeObserver final : public IOInterposeObserver class ProfilerIOInterposeObserver final : public IOInterposeObserver
{ {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ProfilerIOInterposeObserver)
public: public:
virtual void Observe(Observation& aObservation); virtual void Observe(Observation& aObservation);
protected:
virtual ~ProfilerIOInterposeObserver() {}
}; };
} // namespace mozilla } // namespace mozilla