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

Commit fcab2f03 authored by Wale Ogunwale's avatar Wale Ogunwale Committed by Automerger Merge Worker
Browse files

Merge "Revert "Avoid wm<->am deadlock when checking uri permission"" into...

Merge "Revert "Avoid wm<->am deadlock when checking uri permission"" into rvc-dev am: 6b937bab am: 4c21fd60 am: 5be7d416

Change-Id: I7f4f7e24ae4f20d4d2f31020b36e71ef549d4454
parents 32439259 5be7d416
Loading
Loading
Loading
Loading
+20 −32
Original line number Original line Diff line number Diff line
@@ -337,7 +337,6 @@ import com.android.internal.util.Preconditions;
import com.android.internal.util.function.HexFunction;
import com.android.internal.util.function.HexFunction;
import com.android.internal.util.function.QuadFunction;
import com.android.internal.util.function.QuadFunction;
import com.android.internal.util.function.TriFunction;
import com.android.internal.util.function.TriFunction;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.AlarmManagerInternal;
import com.android.server.AlarmManagerInternal;
import com.android.server.AttributeCache;
import com.android.server.AttributeCache;
import com.android.server.DeviceIdleInternal;
import com.android.server.DeviceIdleInternal;
@@ -18832,39 +18831,28 @@ public class ActivityManagerService extends IActivityManager.Stub
        @Override
        @Override
        public int checkContentProviderUriPermission(Uri uri, int userId,
        public int checkContentProviderUriPermission(Uri uri, int userId,
                int callingUid, int modeFlags) {
                int callingUid, int modeFlags) {
            final Object wmLock = mActivityTaskManager.getGlobalLock();
            // We can find ourselves needing to check Uri permissions while
            if (Thread.currentThread().holdsLock(wmLock)
            // already holding the WM lock, which means reaching back here for
                    && !Thread.currentThread().holdsLock(ActivityManagerService.this)) {
            // the AM lock would cause an inversion. The WM team has requested
                // We can find ourselves needing to check Uri permissions while already holding the
            // that we use the strategy below instead of shifting where Uri
                // WM lock, which means reaching back here for the AM lock would cause an inversion.
            // grants are calculated.
                // The WM team has requested that we use the strategy below instead of shifting
                // where Uri grants are calculated.
            // Since we could also arrive here while holding the AM lock, we
                synchronized (wmLock) {
            // can't always delegate the call through the handler, and we need
                    final int[] result = new int[1];
            // to delicately dance between the deadlocks.
                    final Message msg = PooledLambda.obtainMessage(
            if (Thread.currentThread().holdsLock(ActivityManagerService.this)) {
                            LocalService::checkContentProviderUriPermission,
                            this, uri, userId, callingUid, modeFlags, wmLock, result);
                    mHandler.sendMessage(msg);
                    try {
                        wmLock.wait();
                    } catch (InterruptedException ignore) {
                    }
                    return result[0];
                }
            } else {
                return ActivityManagerService.this.checkContentProviderUriPermission(uri,
                return ActivityManagerService.this.checkContentProviderUriPermission(uri,
                        userId, callingUid, modeFlags);
                        userId, callingUid, modeFlags);
            }
            } else {
        }
                final CompletableFuture<Integer> res = new CompletableFuture<>();
                mHandler.post(() -> {
        void checkContentProviderUriPermission(
                    res.complete(ActivityManagerService.this.checkContentProviderUriPermission(uri,
                Uri uri, int userId, int callingUid, int modeFlags, Object wmLock, int[] result) {
                            userId, callingUid, modeFlags));
            synchronized (ActivityManagerService.this) {
                });
                synchronized (wmLock) {
                try {
                    result[0] = ActivityManagerService.this.checkContentProviderUriPermission(
                    return res.get();
                                    uri, userId, callingUid, modeFlags);
                } catch (InterruptedException | ExecutionException e) {
                    wmLock.notify();
                    throw new RuntimeException(e);
                }
                }
            }
            }
        }
        }