Bug 1079322 - Extract properties using libc functions. r=gwagner
[gecko.git] / tools / profiler / ThreadResponsiveness.cpp
blob8b8b018f4abc558013dfa2c0490f13267404f205
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "ThreadResponsiveness.h"
7 #include "platform.h"
8 #include "nsComponentManagerUtils.h"
9 #include "nsThreadUtils.h"
10 #include "nsITimer.h"
11 #include "mozilla/Monitor.h"
12 #include "ProfileEntry.h"
14 using mozilla::Monitor;
15 using mozilla::MonitorAutoLock;
16 using mozilla::TimeStamp;
18 class CheckResponsivenessTask : public nsRunnable,
19 public nsITimerCallback {
20 public:
21 CheckResponsivenessTask()
22 : mLastTracerTime(TimeStamp::Now())
23 , mMonitor("CheckResponsivenessTask")
24 , mTimer(nullptr)
25 , mStop(false)
27 MOZ_COUNT_CTOR(CheckResponsivenessTask);
30 protected:
31 ~CheckResponsivenessTask()
33 MOZ_COUNT_DTOR(CheckResponsivenessTask);
36 public:
37 NS_IMETHOD Run()
39 MonitorAutoLock mon(mMonitor);
40 if (mStop)
41 return NS_OK;
43 // This is raced on because we might pause the thread here
44 // for profiling so if we tried to use a monitor to protect
45 // mLastTracerTime we could deadlock. We're risking seeing
46 // a partial write which will show up as an outlier in our
47 // performance data.
48 mLastTracerTime = TimeStamp::Now();
49 if (!mTimer) {
50 mTimer = do_CreateInstance("@mozilla.org/timer;1");
52 mTimer->InitWithCallback(this, 16, nsITimer::TYPE_ONE_SHOT);
54 return NS_OK;
57 NS_IMETHODIMP Notify(nsITimer* aTimer) MOZ_FINAL
59 NS_DispatchToMainThread(this);
60 return NS_OK;
63 void Terminate() {
64 MonitorAutoLock mon(mMonitor);
65 mStop = true;
68 const TimeStamp& GetLastTracerTime() const {
69 return mLastTracerTime;
72 NS_DECL_ISUPPORTS_INHERITED
74 private:
75 TimeStamp mLastTracerTime;
76 Monitor mMonitor;
77 nsCOMPtr<nsITimer> mTimer;
78 bool mStop;
81 NS_IMPL_ISUPPORTS_INHERITED(CheckResponsivenessTask, nsRunnable, nsITimerCallback)
83 ThreadResponsiveness::ThreadResponsiveness(ThreadProfile *aThreadProfile)
84 : mThreadProfile(aThreadProfile)
85 , mActiveTracerEvent(nullptr)
87 MOZ_COUNT_CTOR(ThreadResponsiveness);
90 ThreadResponsiveness::~ThreadResponsiveness()
92 MOZ_COUNT_DTOR(ThreadResponsiveness);
93 if (mActiveTracerEvent) {
94 mActiveTracerEvent->Terminate();
98 void
99 ThreadResponsiveness::Update()
101 return;
102 if (!mActiveTracerEvent) {
103 if (mThreadProfile->GetThreadInfo()->IsMainThread()) {
104 mActiveTracerEvent = new CheckResponsivenessTask();
105 NS_DispatchToMainThread(mActiveTracerEvent);
106 } else if (mThreadProfile->GetThreadInfo()->GetThread()) {
107 mActiveTracerEvent = new CheckResponsivenessTask();
108 mThreadProfile->GetThreadInfo()->
109 GetThread()->Dispatch(mActiveTracerEvent, NS_DISPATCH_NORMAL);
113 if (mActiveTracerEvent) {
114 mLastTracerTime = mActiveTracerEvent->GetLastTracerTime();