diff options
author | Shibin George <shibing@codeaurora.org> | 2016-06-14 20:42:13 +0530 |
---|---|---|
committer | Shibin George <shibing@codeaurora.org> | 2016-06-21 04:45:25 +0000 |
commit | 19e84047ab8ec6b61d5e2bfd79909fe8942943af (patch) | |
tree | 228e5d2cc863256a9d4680be681a65fb4bfdde4a | |
parent | cf81fdb37ba0608c8743d41b45879aeb74851e1a (diff) | |
download | base-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.java | 25 |
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); |