Add an observer to log blocked threads.

This commit is contained in:
Greyson Parrelli
2021-10-08 15:18:52 -04:00
parent f65de84c19
commit 0c8b6f8ef8
10 changed files with 194 additions and 15 deletions

View File

@@ -191,7 +191,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
long startTime = System.currentTimeMillis();
Log.i(TAG, "App is now visible.");
ApplicationDependencies.getFrameRateTracker().begin();
ApplicationDependencies.getFrameRateTracker().start();
ApplicationDependencies.getMegaphoneRepository().onAppForegrounded();
SignalExecutors.BOUNDED.execute(() -> {
@@ -203,6 +203,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
KeyCachingService.onAppForegrounded(this);
ApplicationDependencies.getShakeToReport().enable();
checkBuildExpiration();
ApplicationDependencies.getDeadlockDetector().start();
});
Log.d(TAG, "onStart() took " + (System.currentTimeMillis() - startTime) + " ms");
@@ -213,8 +214,9 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
Log.i(TAG, "App is no longer visible.");
KeyCachingService.onAppBackgrounded(this);
ApplicationDependencies.getMessageNotifier().clearVisibleThread();
ApplicationDependencies.getFrameRateTracker().end();
ApplicationDependencies.getFrameRateTracker().stop();
ApplicationDependencies.getShakeToReport().disable();
ApplicationDependencies.getDeadlockDetector().stop();
}
public PersistentLogger getPersistentLogger() {

View File

@@ -5,6 +5,7 @@ import android.app.Application;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import org.signal.core.util.concurrent.DeadlockDetector;
import org.thoughtcrime.securesms.KbsEnclave;
import org.thoughtcrime.securesms.components.TypingStatusRepository;
import org.thoughtcrime.securesms.components.TypingStatusSender;
@@ -106,6 +107,7 @@ public class ApplicationDependencies {
private static volatile SimpleExoPlayerPool exoPlayerPool;
private static volatile AudioManagerCompat audioManagerCompat;
private static volatile DonationsService donationsService;
private static volatile DeadlockDetector deadlockDetector;
@MainThread
public static void init(@NonNull Application application, @NonNull Provider provider) {
@@ -603,6 +605,17 @@ public class ApplicationDependencies {
return donationsService;
}
public static @NonNull DeadlockDetector getDeadlockDetector() {
if (deadlockDetector == null) {
synchronized (LOCK) {
if (deadlockDetector == null) {
deadlockDetector = provider.provideDeadlockDetector();
}
}
}
return deadlockDetector;
}
public interface Provider {
@NonNull GroupsV2Operations provideGroupsV2Operations();
@NonNull SignalServiceAccountManager provideSignalServiceAccountManager();
@@ -639,5 +652,6 @@ public class ApplicationDependencies {
@NonNull SimpleExoPlayerPool provideExoPlayerPool();
@NonNull AudioManagerCompat provideAndroidCallAudioManager();
@NonNull DonationsService provideDonationsService();
@NonNull DeadlockDetector provideDeadlockDetector();
}
}

View File

@@ -2,9 +2,12 @@ package org.thoughtcrime.securesms.dependencies;
import android.app.Application;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import androidx.annotation.NonNull;
import org.signal.core.util.concurrent.DeadlockDetector;
import org.signal.core.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.components.TypingStatusRepository;
@@ -76,6 +79,7 @@ import org.whispersystems.signalservice.api.websocket.WebSocketFactory;
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* Implementation of {@link ApplicationDependencies.Provider} that provides real app dependencies.
@@ -311,6 +315,13 @@ public class ApplicationDependencyProvider implements ApplicationDependencies.Pr
FeatureFlags.okHttpAutomaticRetry());
}
@Override
public @NonNull DeadlockDetector provideDeadlockDetector() {
HandlerThread handlerThread = new HandlerThread("signal-DeadlockDetector");
handlerThread.start();
return new DeadlockDetector(new Handler(handlerThread.getLooper()), TimeUnit.SECONDS.toMillis(5));
}
private @NonNull WebSocketFactory provideWebSocketFactory(@NonNull SignalWebSocketHealthMonitor healthMonitor) {
return new WebSocketFactory() {
@Override

View File

@@ -40,7 +40,7 @@ public class FrameRateTracker {
updateRefreshRate();
}
public void begin() {
public void start() {
Log.d(TAG, String.format(Locale.ENGLISH, "Beginning frame rate tracking. Screen refresh rate: %.2f hz, or %.2f ms per frame.", refreshRate, idealTimePerFrameNanos / (float) 1_000_000));
lastFrameTimeNanos = System.nanoTime();
@@ -48,7 +48,7 @@ public class FrameRateTracker {
Choreographer.getInstance().postFrameCallback(calculator);
}
public void end() {
public void stop() {
Choreographer.getInstance().removeFrameCallback(calculator);
}