Fixes an edge case which leads to deadlock in ShortcutService
ShortcutService uses two levels of synchronization lock, one on the service-level, another on package-level. To prevent deadlock, we made an implicit rule that a thread can never acquire service-level lock if they were holding onto package-level lock. An edge case emerges when we ran into "what a terrible failure", service-level lock was acquired to increase wtf counter and capture stack traces, regardless of the implicit rule mentioned above. This CL solves the deadlock by using a separate lock in wtf. Bug: 243880581 Test: manual Change-Id: I136ed4018b07ae17591207c5c855e9d34082ae77
This commit is contained in:
@@ -280,6 +280,7 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
|
||||
private final Object mLock = new Object();
|
||||
private final Object mNonPersistentUsersLock = new Object();
|
||||
private final Object mWtfLock = new Object();
|
||||
|
||||
private static List<ResolveInfo> EMPTY_RESOLVE_INFO = new ArrayList<>(0);
|
||||
|
||||
@@ -444,10 +445,10 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
@interface ShortcutOperation {
|
||||
}
|
||||
|
||||
@GuardedBy("mLock")
|
||||
@GuardedBy("mWtfLock")
|
||||
private int mWtfCount = 0;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
@GuardedBy("mWtfLock")
|
||||
private Exception mLastWtfStacktrace;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
@@ -4727,13 +4728,15 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
|
||||
mStatLogger.dump(pw, " ");
|
||||
|
||||
pw.println();
|
||||
pw.print(" #Failures: ");
|
||||
pw.println(mWtfCount);
|
||||
synchronized (mWtfLock) {
|
||||
pw.println();
|
||||
pw.print(" #Failures: ");
|
||||
pw.println(mWtfCount);
|
||||
|
||||
if (mLastWtfStacktrace != null) {
|
||||
pw.print(" Last failure stack trace: ");
|
||||
pw.println(Log.getStackTraceString(mLastWtfStacktrace));
|
||||
if (mLastWtfStacktrace != null) {
|
||||
pw.print(" Last failure stack trace: ");
|
||||
pw.println(Log.getStackTraceString(mLastWtfStacktrace));
|
||||
}
|
||||
}
|
||||
|
||||
pw.println();
|
||||
@@ -5148,7 +5151,7 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
if (e == null) {
|
||||
e = new RuntimeException("Stacktrace");
|
||||
}
|
||||
synchronized (mLock) {
|
||||
synchronized (mWtfLock) {
|
||||
mWtfCount++;
|
||||
mLastWtfStacktrace = new Exception("Last failure was logged here:");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user