Bug 1469495 - Java Sampler never stops profiling. r?njn draft
authorMakoto Kato <m_kato@ga2.so-net.ne.jp>
Fri, 22 Jun 2018 15:27:45 +0900
changeset 812349 d761285a865f6db987ead3bdde0983172962b196
parent 809377 27e90ec610a4c8f6b2a73d79cb1a4df38e822e6a
push id114531
push userbmo:m_kato@ga2.so-net.ne.jp
push dateFri, 29 Jun 2018 06:09:50 +0000
reviewersnjn
bugs1469495
milestone62.0a1
Bug 1469495 - Java Sampler never stops profiling. r?njn Since GeckoJavaSampler::Stop() isn't called from locked_profiler_stop, Java sampler is never stopped after stopping profiler. And when calling GeckoJavaSampler::Stop(), it causes dead lock since stop() is acquiring lock. So when calling join method, we should release this lock. MozReview-Commit-ID: BLREo0lH6DS
mobile/android/base/java/org/mozilla/gecko/GeckoJavaSampler.java
tools/profiler/core/platform.cpp
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoJavaSampler.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoJavaSampler.java
@@ -182,24 +182,28 @@ public class GeckoJavaSampler {
     public static void unpause() {
         synchronized (GeckoJavaSampler.class) {
             sSamplingRunnable.mPauseSampler = false;
         }
     }
 
     @WrapForJNI
     public static void stop() {
+        Thread samplingThread;
+
         synchronized (GeckoJavaSampler.class) {
             if (sSamplingThread == null) {
                 return;
             }
 
             sSamplingRunnable.mStopSampler = true;
-            try {
-                sSamplingThread.join();
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
+            samplingThread = sSamplingThread;
             sSamplingThread = null;
             sSamplingRunnable = null;
         }
+
+        try {
+            samplingThread.join();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
     }
 }
--- a/tools/profiler/core/platform.cpp
+++ b/tools/profiler/core/platform.cpp
@@ -3089,16 +3089,22 @@ locked_profiler_stop(PSLockRef aLock)
 {
   LOG("locked_profiler_stop");
 
   MOZ_RELEASE_ASSERT(CorePS::Exists() && ActivePS::Exists(aLock));
 
   // At the very start, clear RacyFeatures.
   RacyFeatures::SetInactive();
 
+#if defined(GP_OS_android)
+  if (ActivePS::FeatureJava(aLock)) {
+    java::GeckoJavaSampler::Stop();
+  }
+#endif
+
 #ifdef MOZ_TASK_TRACER
   if (ActivePS::FeatureTaskTracer(aLock)) {
     tasktracer::StopLogging();
   }
 #endif
 
   // Stop sampling live threads.
   int tid = Thread::GetCurrentId();