summaryrefslogtreecommitdiffstats
path: root/services/core
diff options
context:
space:
mode:
authorDongwon Kang <dwkang@google.com>2014-12-05 04:08:21 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-12-05 04:08:25 +0000
commit9e094efa93e9c95212c0edfcd1b0bb0380f7af9a (patch)
treec6a6b842213979cd512fb6f7bef063eb236b206f /services/core
parent670de6b6277768deb32ea67a4e0ae7a4ed2d3540 (diff)
parentfdce9e541e143332ba4ece6a0bda4f11520f0b07 (diff)
downloadframeworks_base-9e094efa93e9c95212c0edfcd1b0bb0380f7af9a.zip
frameworks_base-9e094efa93e9c95212c0edfcd1b0bb0380f7af9a.tar.gz
frameworks_base-9e094efa93e9c95212c0edfcd1b0bb0380f7af9a.tar.bz2
Merge "TIF: handle a race condition when a session is crashed" into lmp-mr1-dev
Diffstat (limited to 'services/core')
-rw-r--r--services/core/java/com/android/server/tv/TvInputManagerService.java79
1 files changed, 46 insertions, 33 deletions
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 5ab3fa1..5375bfc 100644
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -461,7 +461,7 @@ public final class TvInputManagerService extends SystemService {
UserState userState = getUserStateLocked(userId);
SessionState sessionState = userState.sessionStateMap.get(sessionToken);
if (sessionState == null) {
- throw new IllegalArgumentException("Session state not found for token " + sessionToken);
+ throw new SessionNotFoundException("Session state not found for token " + sessionToken);
}
// Only the application that requested this session or the system can access it.
if (callingUid != Process.SYSTEM_UID && callingUid != sessionState.callingUid) {
@@ -589,18 +589,22 @@ public final class TvInputManagerService extends SystemService {
}
private void releaseSessionLocked(IBinder sessionToken, int callingUid, int userId) {
- SessionState sessionState = getSessionStateLocked(sessionToken, callingUid, userId);
- if (sessionState.session != null) {
- UserState userState = getUserStateLocked(userId);
- if (sessionToken == userState.mainSessionToken) {
- setMainLocked(sessionToken, false, callingUid, userId);
- }
- try {
+ SessionState sessionState = null;
+ try {
+ sessionState = getSessionStateLocked(sessionToken, callingUid, userId);
+ if (sessionState.session != null) {
+ UserState userState = getUserStateLocked(userId);
+ if (sessionToken == userState.mainSessionToken) {
+ setMainLocked(sessionToken, false, callingUid, userId);
+ }
sessionState.session.release();
- } catch (RemoteException e) {
- Slog.e(TAG, "session process has already died", e);
}
- sessionState.session = null;
+ } catch (RemoteException | SessionNotFoundException e) {
+ Slog.e(TAG, "error in releaseSession", e);
+ } finally {
+ if (sessionState != null) {
+ sessionState.session = null;
+ }
}
removeSessionStateLocked(sessionToken, userId);
}
@@ -648,19 +652,19 @@ public final class TvInputManagerService extends SystemService {
}
private void setMainLocked(IBinder sessionToken, boolean isMain, int callingUid, int userId) {
- SessionState sessionState = getSessionStateLocked(sessionToken, callingUid, userId);
- if (sessionState.hardwareSessionToken != null) {
- sessionState = getSessionStateLocked(sessionState.hardwareSessionToken,
- Process.SYSTEM_UID, userId);
- }
- ServiceState serviceState = getServiceStateLocked(sessionState.info.getComponent(), userId);
- if (!serviceState.isHardware) {
- return;
- }
- ITvInputSession session = getSessionLocked(sessionState);
try {
+ SessionState sessionState = getSessionStateLocked(sessionToken, callingUid, userId);
+ if (sessionState.hardwareSessionToken != null) {
+ sessionState = getSessionStateLocked(sessionState.hardwareSessionToken,
+ Process.SYSTEM_UID, userId);
+ }
+ ServiceState serviceState = getServiceStateLocked(sessionState.info.getComponent(), userId);
+ if (!serviceState.isHardware) {
+ return;
+ }
+ ITvInputSession session = getSessionLocked(sessionState);
session.setMain(isMain);
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in setMain", e);
}
}
@@ -1085,7 +1089,7 @@ public final class TvInputManagerService extends SystemService {
getSessionLocked(sessionState.hardwareSessionToken,
Process.SYSTEM_UID, resolvedUserId).setSurface(surface);
}
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in setSurface", e);
}
}
@@ -1116,7 +1120,7 @@ public final class TvInputManagerService extends SystemService {
getSessionLocked(sessionState.hardwareSessionToken, Process.SYSTEM_UID,
resolvedUserId).dispatchSurfaceChanged(format, width, height);
}
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in dispatchSurfaceChanged", e);
}
}
@@ -1146,7 +1150,7 @@ public final class TvInputManagerService extends SystemService {
Process.SYSTEM_UID, resolvedUserId).setVolume((volume > 0.0f)
? REMOTE_VOLUME_ON : REMOTE_VOLUME_OFF);
}
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in setVolume", e);
}
}
@@ -1183,7 +1187,7 @@ public final class TvInputManagerService extends SystemService {
args.arg5 = sessionToken;
mWatchLogHandler.obtainMessage(WatchLogHandler.MSG_LOG_WATCH_START, args)
.sendToTarget();
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in tune", e);
return;
}
@@ -1205,7 +1209,7 @@ public final class TvInputManagerService extends SystemService {
try {
getSessionLocked(sessionToken, callingUid, resolvedUserId)
.requestUnblockContent(unblockedRating);
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in requestUnblockContent", e);
}
}
@@ -1225,7 +1229,7 @@ public final class TvInputManagerService extends SystemService {
try {
getSessionLocked(sessionToken, callingUid, resolvedUserId)
.setCaptionEnabled(enabled);
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in setCaptionEnabled", e);
}
}
@@ -1245,7 +1249,7 @@ public final class TvInputManagerService extends SystemService {
try {
getSessionLocked(sessionToken, callingUid, resolvedUserId).selectTrack(
type, trackId);
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in selectTrack", e);
}
}
@@ -1266,7 +1270,7 @@ public final class TvInputManagerService extends SystemService {
try {
getSessionLocked(sessionToken, callingUid, resolvedUserId)
.appPrivateCommand(command, data);
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in appPrivateCommand", e);
}
}
@@ -1287,7 +1291,7 @@ public final class TvInputManagerService extends SystemService {
try {
getSessionLocked(sessionToken, callingUid, resolvedUserId)
.createOverlayView(windowToken, frame);
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in createOverlayView", e);
}
}
@@ -1307,7 +1311,7 @@ public final class TvInputManagerService extends SystemService {
try {
getSessionLocked(sessionToken, callingUid, resolvedUserId)
.relayoutOverlayView(frame);
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in relayoutOverlayView", e);
}
}
@@ -1327,7 +1331,7 @@ public final class TvInputManagerService extends SystemService {
try {
getSessionLocked(sessionToken, callingUid, resolvedUserId)
.removeOverlayView();
- } catch (RemoteException e) {
+ } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in removeOverlayView", e);
}
}
@@ -2340,4 +2344,13 @@ public final class TvInputManagerService extends SystemService {
}
}
}
+
+ private static class SessionNotFoundException extends IllegalArgumentException {
+ public SessionNotFoundException() {
+ }
+
+ public SessionNotFoundException(String name) {
+ super(name);
+ }
+ }
}