system server watchdog caused by deadlock

There is deadlock among ActivityManagerService, ActivityTaskManagerService
and ConnectionServiceWrapper. Move stopLockTaskModeInternal out of mGlobalLock scope.
This will remove the deadlock

Bug: 159213837
Bug: 162950591
Test: presubmit
Change-Id: I6aee6f9837bac22e480f42124bfcdba991e0fa1a
This commit is contained in:
Catherine Shi
2020-06-22 12:12:03 -07:00
committed by Agatha Man
parent 5d650722cb
commit 3a17ba2f25

View File

@@ -2999,13 +2999,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public void stopLockTaskModeByToken(IBinder token) {
synchronized (mGlobalLock) {
final ActivityRecord r = ActivityRecord.forTokenLocked(token);
if (r == null) {
return;
}
stopLockTaskModeInternal(r.getTask(), false /* isSystemCaller */);
}
stopLockTaskModeInternal(token, false /* isSystemCaller */);
}
/**
@@ -3047,11 +3041,19 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
}
private void stopLockTaskModeInternal(@Nullable Task task, boolean isSystemCaller) {
private void stopLockTaskModeInternal(@Nullable IBinder token, boolean isSystemCaller) {
final int callingUid = Binder.getCallingUid();
long ident = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
Task task = null;
if (token != null) {
final ActivityRecord r = ActivityRecord.forTokenLocked(token);
if (r == null) {
return;
}
task = r.getTask();
}
getLockTaskController().stopLockTaskMode(task, isSystemCaller, callingUid);
}
// Launch in-call UI if a call is ongoing. This is necessary to allow stopping the lock