diff --git a/services/core/java/com/android/server/NativeDaemonConnector.java b/services/core/java/com/android/server/NativeDaemonConnector.java index 519a2a3f4f..3a6fa0563d 100644 --- a/services/core/java/com/android/server/NativeDaemonConnector.java +++ b/services/core/java/com/android/server/NativeDaemonConnector.java @@ -25,6 +25,7 @@ import android.os.Message; import android.os.PowerManager; import android.os.SystemClock; import android.util.LocalLog; +import android.util.Log; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; @@ -57,6 +58,7 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo private LocalLog mLocalLog; private volatile boolean mDebug = false; + private volatile Object mLockWarning; private final ResponseQueue mResponseQueue; @@ -107,6 +109,14 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo mDebug = debug; } + /** + * Yell loudly if someone tries making future {@link #execute(Command)} calls while holding a + * lock on the given object. + */ + public void setLockWarning(Object lockWarning) { + mLockWarning = lockWarning; + } + @Override public void run() { mCallbackHandler = new Handler(mLooper, this); @@ -394,6 +404,10 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo */ public NativeDaemonEvent[] executeForList(long timeoutMs, String cmd, Object... args) throws NativeDaemonConnectorException { + if (mLockWarning != null && Thread.holdsLock(mLockWarning)) { + Log.wtf(TAG, "Calling thread is holding lock " + mLockWarning, new Throwable()); + } + final long startTime = SystemClock.elapsedRealtime(); final ArrayList events = Lists.newArrayList();