summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShibin George <shibing@codeaurora.org>2016-06-14 20:42:13 +0530
committerShibin George <shibing@codeaurora.org>2016-06-21 04:45:25 +0000
commit19e84047ab8ec6b61d5e2bfd79909fe8942943af (patch)
tree228e5d2cc863256a9d4680be681a65fb4bfdde4a
parentcf81fdb37ba0608c8743d41b45879aeb74851e1a (diff)
downloadbase-19e84047ab8ec6b61d5e2bfd79909fe8942943af.tar.gz
Fix deadlock b/w ActivityManagerService and MediaSessionService
While handling adjustVolume and finishReceiver at the same time, system_server gets into deadlock situation where ActivityManagerService lock and MediaSessionService lock are getting acquired in reverse order. To fix this, adjustSuggestedStreamVolume() is shifted to MediaSessionService's Handler thread. https://code.google.com/p/android/issues/detail?id=213014 Change-Id: I3125c890546c8ab7c4df530bb68ba87cd688f8ce
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java25
1 files changed, 18 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 7028fa6695f6..1a320d2bdb80 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -887,13 +887,24 @@ public class MediaSessionService extends SystemService implements Monitor {
}
return;
}
- try {
- String packageName = getContext().getOpPackageName();
- mAudioService.adjustSuggestedStreamVolume(direction, suggestedStream,
- flags, packageName, TAG);
- } catch (RemoteException e) {
- Log.e(TAG, "Error adjusting default volume.", e);
- }
+
+ // Execute mAudioService.adjustSuggestedStreamVolume() on
+ // handler thread of MediaSessionService.
+ // This will release the MediaSessionService.mLock sooner and avoid
+ // a potential deadlock between MediaSessionService.mLock and
+ // ActivityManagerService lock.
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ String packageName = getContext().getOpPackageName();
+ mAudioService.adjustSuggestedStreamVolume(direction, suggestedStream,
+ flags, packageName, TAG);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error adjusting default volume.", e);
+ }
+ }
+ });
} else {
session.adjustVolume(direction, flags, getContext().getPackageName(),
UserHandle.myUserId(), true);