diff options
author | Kun Liang <kunliang@codeaurora.org> | 2014-12-11 12:57:33 +0800 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-10-30 03:11:46 -0700 |
commit | ead326c2d00eda5e58303827bfef6a72ad5cdf74 (patch) | |
tree | 6b518775605bde2a37e692e18d97346d7ece9324 | |
parent | edeea4f0ce1fb941a19338beff1b0b12f3d14b07 (diff) | |
download | frameworks_base-ead326c2d00eda5e58303827bfef6a72ad5cdf74.zip frameworks_base-ead326c2d00eda5e58303827bfef6a72ad5cdf74.tar.gz frameworks_base-ead326c2d00eda5e58303827bfef6a72ad5cdf74.tar.bz2 |
AppOps: fix deadlock issue when showing dialog
WindowManagerService need call PowerManagerService to release
wakelock. The Notifier in PowerManagerService need call AppOpsService
to notify holding wakelock ops is finished. Meanwhile, AppOpsService
may need call WindowManagerService to show dialog. This scenario
will lead to deadlock issue.
To move showing dialog action out of lock section to fix this issue.
Since only UI work is moved out of lock area, it is supposed to be
safe.
Change-Id: I3f2bf4b9c9d81914cfd3c0fc3fc76d0b4a06a1f6
CRs-fixed: 786466
-rw-r--r-- | services/core/java/com/android/server/AppOpsService.java | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index 2b23310..5d0b4f8 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -1948,16 +1948,19 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void run() { + PermissionDialog permDialog = null; synchronized (AppOpsService.this) { Log.e(TAG, "Creating dialog box"); op.dialogReqQueue.register(request); if (op.dialogReqQueue.getDialog() == null) { - Dialog d = new PermissionDialog(mContext, + permDialog = new PermissionDialog(mContext, AppOpsService.this, code, uid, packageName); - op.dialogReqQueue.setDialog((PermissionDialog)d); - d.show(); + op.dialogReqQueue.setDialog(permDialog); } } + if (permDialog != null) { + permDialog.show(); + } } } |