Bug 961769 - Implement event loop responsiveness instrumentation for Gonk. r=gal
authorVivien Nicolas <vnicolas@mozilla.com>
Wed, 05 Feb 2014 19:53:53 +0100
changeset 184377 cd6558ae6711ac2c52ac8fa4015a00eeff284260
parent 184251 67c9d01668dfbf6aba9fb99d324c482041bd499d
child 184378 12e53821335455fda1a053b4b5fa81b7d28635e7
push id3503
push userraliiev@mozilla.com
push dateMon, 28 Apr 2014 18:51:11 +0000
treeherdermozilla-beta@c95ac01e332e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgal
bugs961769
milestone30.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 961769 - Implement event loop responsiveness instrumentation for Gonk. r=gal
configure.in
widget/gonk/WidgetTraceEvent.cpp
widget/gonk/moz.build
--- a/configure.in
+++ b/configure.in
@@ -4442,16 +4442,17 @@ cairo-gonk)
     AC_DEFINE(MOZ_WIDGET_GONK)
     AC_DEFINE(MOZ_TOUCH)
     MOZ_WIDGET_TOOLKIT=gonk
     TK_CFLAGS='$(MOZ_CAIRO_CFLAGS) $(MOZ_PIXMAN_CFLAGS)'
     TK_LIBS='$(MOZ_CAIRO_LIBS) $(MOZ_PIXMAN_LIBS)'
     MOZ_WEBGL=1
     MOZ_PDF_PRINTING=1
     MOZ_TOUCH=1
+    MOZ_INSTRUMENT_EVENT_LOOP=1
     ;;
 
 esac
 
 AC_SUBST(MOZ_PDF_PRINTING)
 if test "$MOZ_PDF_PRINTING"; then
    PDF_SURFACE_FEATURE="#define CAIRO_HAS_PDF_SURFACE 1"
    AC_DEFINE(MOZ_PDF_PRINTING)
new file mode 100644
--- /dev/null
+++ b/widget/gonk/WidgetTraceEvent.cpp
@@ -0,0 +1,96 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/WidgetTraceEvent.h"
+#include "mozilla/StaticPtr.h"
+#include "nsThreadUtils.h"
+#include <mozilla/CondVar.h>
+#include <mozilla/Mutex.h>
+
+using mozilla::CondVar;
+using mozilla::Mutex;
+using mozilla::MutexAutoLock;
+
+namespace mozilla {
+  class TracerRunnable : public nsRunnable {
+    public:
+      TracerRunnable() {
+        mTracerLock = new Mutex("TracerRunnable");
+        mTracerCondVar = new CondVar(*mTracerLock, "TracerRunnable");
+        mMainThread = do_GetMainThread();
+      }
+
+      ~TracerRunnable() {
+        delete mTracerCondVar;
+        delete mTracerLock;
+        mTracerLock = nullptr;
+        mTracerCondVar = nullptr;
+      }
+
+      virtual nsresult Run() {
+        MutexAutoLock lock(*mTracerLock);
+        mHasRun = true;
+        mTracerCondVar->Notify();
+        return NS_OK;
+      }
+
+      bool Fire() {
+        if (!mTracerLock || !mTracerCondVar) {
+          return false;
+        }
+
+        MutexAutoLock lock(*mTracerLock);
+        mHasRun = false;
+        mMainThread->Dispatch(this, NS_DISPATCH_NORMAL);
+        while (!mHasRun) {
+          mTracerCondVar->Wait();
+        }
+        return true;
+      }
+
+      void Signal() {
+        MutexAutoLock lock(*mTracerLock);
+        mHasRun = true;
+        mTracerCondVar->Notify();
+      }
+
+    private:
+      Mutex* mTracerLock;
+      CondVar* mTracerCondVar;
+      bool mHasRun;
+      nsCOMPtr<nsIThread> mMainThread;
+  };
+
+  StaticRefPtr<TracerRunnable> sTracerRunnable;
+
+  bool InitWidgetTracing()
+  {
+    if (!sTracerRunnable) {
+      sTracerRunnable = new TracerRunnable();
+    }
+    return true;
+  }
+
+  void CleanUpWidgetTracing()
+  {
+    sTracerRunnable = nullptr;
+  }
+
+  bool FireAndWaitForTracerEvent()
+  {
+    if (sTracerRunnable) {
+      return sTracerRunnable->Fire();
+    }
+
+    return false;
+  }
+
+  void SignalTracerThread()
+  {
+    if (sTracerRunnable) {
+      return sTracerRunnable->Signal();
+    }
+  }
+}  // namespace mozilla
+
--- a/widget/gonk/moz.build
+++ b/widget/gonk/moz.build
@@ -52,17 +52,18 @@ SOURCES += [
     'HwcUtils.cpp',
     'nsAppShell.cpp',
     'nsIdleServiceGonk.cpp',
     'nsLookAndFeel.cpp',
     'nsWidgetFactory.cpp',
     'nsWindow.cpp',
     'OrientationObserver.cpp',
     'ParentProcessController.cpp',
-    'ProcessOrientation.cpp'
+    'ProcessOrientation.cpp',
+    'WidgetTraceEvent.cpp'
 ]
 
 LIBRARY_NAME = 'widget_gonk'
 
 include('/ipc/chromium/chromium-config.mozbuild')
 
 FINAL_LIBRARY = 'xul'