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 idunknown
push userunknown
push dateunknown
reviewersgal
bugs961769
milestone30.0a1
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'