summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKun Liang <kunliang@codeaurora.org>2014-12-11 12:57:33 +0800
committerSteve Kondik <steve@cyngn.com>2015-10-30 03:11:46 -0700
commitead326c2d00eda5e58303827bfef6a72ad5cdf74 (patch)
tree6b518775605bde2a37e692e18d97346d7ece9324
parentedeea4f0ce1fb941a19338beff1b0b12f3d14b07 (diff)
downloadframeworks_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.java9
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();
+ }
}
}