Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30fed8c2 authored by Pinyao Ting's avatar Pinyao Ting
Browse files

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
parent b4c3a068
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -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,6 +4728,7 @@ public class ShortcutService extends IShortcutService.Stub {

                mStatLogger.dump(pw, "  ");

                synchronized (mWtfLock) {
                    pw.println();
                    pw.print("  #Failures: ");
                    pw.println(mWtfCount);
@@ -4735,6 +4737,7 @@ public class ShortcutService extends IShortcutService.Stub {
                        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:");
        }