summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shibin George <shibing@codeaurora.org> 2016-06-28 15:56:50 +0530
committer Shibin George <shibing@codeaurora.org> 2016-07-06 05:00:43 +0000
commitc4f28a419615a6035085e74fbd7670f27faf3d0f (patch)
tree551db306b0732faf3fed53d92590e89b01e12709
parent326e55a3e25366b45e152ab5234b42dee781e8ac (diff)
Fix deadlock in MediaSessionService during getCurrentUser()
SystemServiceMAnager.stopUser() acquires ActivityManagerService lock first and then acquires MediaSessionService.mLock during onStopUser(). MediaSessionService.onSwitchUser(), on the other hand, acquires mLock first and ActivityManagerService lock next. This is a potential deadlock situation which can be resolved by moving getCurrentUser() out of synchronized block. This will release mLock sooner and avoid the deadlock. https://code.google.com/p/android/issues/detail?id=214469 Change-Id: Ieb4520d60af6ca38496ca933da0cd9ae096a9408 Signed-off-by: Shibin George <shibing@codeaurora.org>
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java9
1 files changed, 4 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 1a320d2bdb80..b7190638b0e5 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -227,8 +227,8 @@ public class MediaSessionService extends SystemService implements Monitor {
}
private void updateUser() {
+ int userId = ActivityManager.getCurrentUser();
synchronized (mLock) {
- int userId = ActivityManager.getCurrentUser();
if (mCurrentUserId != userId) {
final int oldUserId = mCurrentUserId;
mCurrentUserId = userId; // do this first
@@ -764,7 +764,7 @@ public class MediaSessionService extends SystemService implements Monitor {
synchronized (mLock) {
// If we don't have a media button receiver to fall back on
// include non-playing sessions for dispatching
- UserRecord ur = mUserRecords.get(ActivityManager.getCurrentUser());
+ UserRecord ur = mUserRecords.get(mCurrentUserId);
boolean useNotPlayingSessions = (ur == null) ||
(ur.mLastMediaButtonReceiver == null
&& ur.mRestoredMediaButtonReceiver == null);
@@ -957,8 +957,7 @@ public class MediaSessionService extends SystemService implements Monitor {
mKeyEventReceiver);
} else {
// Launch the last PendingIntent we had with priority
- int userId = ActivityManager.getCurrentUser();
- UserRecord user = mUserRecords.get(userId);
+ UserRecord user = mUserRecords.get(mCurrentUserId);
if (user.mLastMediaButtonReceiver != null
|| user.mRestoredMediaButtonReceiver != null) {
if (DEBUG) {
@@ -979,7 +978,7 @@ public class MediaSessionService extends SystemService implements Monitor {
} else {
mediaButtonIntent.setComponent(user.mRestoredMediaButtonReceiver);
getContext().sendBroadcastAsUser(mediaButtonIntent,
- new UserHandle(userId));
+ new UserHandle(mCurrentUserId));
}
} catch (CanceledException e) {
Log.i(TAG, "Error sending key event to media button receiver "