From 8ebba5cb83e70d3f30ee5a77565eafe9229f2a1a Mon Sep 17 00:00:00 2001 From: riddle_hsu Date: Tue, 20 Oct 2015 16:00:15 +0800 Subject: [PATCH] MediaSession: Use mHandler for sending a pending intent When PendingIntent.send() is called with a null handler, onSendFinished() will be called inside of the send() method. Therefore in this case, if a thread holds a lock before calling send(), and onSendFinished() also requires the lock, a deadlock could happen. Change-Id: I71d9f708fc3d52b7b5713426ad6140cbf6e336ef --- .../com/android/server/media/MediaSessionService.java | 9 ++++----- 1 file 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 7028fa6695f66..14a8c16975f3a 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -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); @@ -946,8 +946,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) { @@ -964,11 +963,11 @@ public class MediaSessionService extends SystemService implements Monitor { if (user.mLastMediaButtonReceiver != null) { user.mLastMediaButtonReceiver.send(getContext(), needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1, - mediaButtonIntent, mKeyEventReceiver, null); + mediaButtonIntent, mKeyEventReceiver, mHandler); } 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 "