am 9e094efa: Merge "TIF: handle a race condition when a session is crashed" into lmp-mr1-dev

* commit '9e094efa93e9c95212c0edfcd1b0bb0380f7af9a':
  TIF: handle a race condition when a session is crashed
This commit is contained in:
Dongwon Kang
2014-12-05 04:12:12 +00:00
committed by Android Git Automerger

View File

@@ -461,7 +461,7 @@ public final class TvInputManagerService extends SystemService {
UserState userState = getUserStateLocked(userId); UserState userState = getUserStateLocked(userId);
SessionState sessionState = userState.sessionStateMap.get(sessionToken); SessionState sessionState = userState.sessionStateMap.get(sessionToken);
if (sessionState == null) { 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. // Only the application that requested this session or the system can access it.
if (callingUid != Process.SYSTEM_UID && callingUid != sessionState.callingUid) { 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) { private void releaseSessionLocked(IBinder sessionToken, int callingUid, int userId) {
SessionState sessionState = getSessionStateLocked(sessionToken, callingUid, userId); SessionState sessionState = null;
if (sessionState.session != null) { try {
UserState userState = getUserStateLocked(userId); sessionState = getSessionStateLocked(sessionToken, callingUid, userId);
if (sessionToken == userState.mainSessionToken) { if (sessionState.session != null) {
setMainLocked(sessionToken, false, callingUid, userId); UserState userState = getUserStateLocked(userId);
} if (sessionToken == userState.mainSessionToken) {
try { setMainLocked(sessionToken, false, callingUid, userId);
}
sessionState.session.release(); 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); removeSessionStateLocked(sessionToken, userId);
} }
@@ -648,19 +652,19 @@ public final class TvInputManagerService extends SystemService {
} }
private void setMainLocked(IBinder sessionToken, boolean isMain, int callingUid, int userId) { 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 { 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); session.setMain(isMain);
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in setMain", e); Slog.e(TAG, "error in setMain", e);
} }
} }
@@ -1085,7 +1089,7 @@ public final class TvInputManagerService extends SystemService {
getSessionLocked(sessionState.hardwareSessionToken, getSessionLocked(sessionState.hardwareSessionToken,
Process.SYSTEM_UID, resolvedUserId).setSurface(surface); Process.SYSTEM_UID, resolvedUserId).setSurface(surface);
} }
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in setSurface", e); Slog.e(TAG, "error in setSurface", e);
} }
} }
@@ -1116,7 +1120,7 @@ public final class TvInputManagerService extends SystemService {
getSessionLocked(sessionState.hardwareSessionToken, Process.SYSTEM_UID, getSessionLocked(sessionState.hardwareSessionToken, Process.SYSTEM_UID,
resolvedUserId).dispatchSurfaceChanged(format, width, height); resolvedUserId).dispatchSurfaceChanged(format, width, height);
} }
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in dispatchSurfaceChanged", 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) Process.SYSTEM_UID, resolvedUserId).setVolume((volume > 0.0f)
? REMOTE_VOLUME_ON : REMOTE_VOLUME_OFF); ? REMOTE_VOLUME_ON : REMOTE_VOLUME_OFF);
} }
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in setVolume", e); Slog.e(TAG, "error in setVolume", e);
} }
} }
@@ -1183,7 +1187,7 @@ public final class TvInputManagerService extends SystemService {
args.arg5 = sessionToken; args.arg5 = sessionToken;
mWatchLogHandler.obtainMessage(WatchLogHandler.MSG_LOG_WATCH_START, args) mWatchLogHandler.obtainMessage(WatchLogHandler.MSG_LOG_WATCH_START, args)
.sendToTarget(); .sendToTarget();
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in tune", e); Slog.e(TAG, "error in tune", e);
return; return;
} }
@@ -1205,7 +1209,7 @@ public final class TvInputManagerService extends SystemService {
try { try {
getSessionLocked(sessionToken, callingUid, resolvedUserId) getSessionLocked(sessionToken, callingUid, resolvedUserId)
.requestUnblockContent(unblockedRating); .requestUnblockContent(unblockedRating);
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in requestUnblockContent", e); Slog.e(TAG, "error in requestUnblockContent", e);
} }
} }
@@ -1225,7 +1229,7 @@ public final class TvInputManagerService extends SystemService {
try { try {
getSessionLocked(sessionToken, callingUid, resolvedUserId) getSessionLocked(sessionToken, callingUid, resolvedUserId)
.setCaptionEnabled(enabled); .setCaptionEnabled(enabled);
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in setCaptionEnabled", e); Slog.e(TAG, "error in setCaptionEnabled", e);
} }
} }
@@ -1245,7 +1249,7 @@ public final class TvInputManagerService extends SystemService {
try { try {
getSessionLocked(sessionToken, callingUid, resolvedUserId).selectTrack( getSessionLocked(sessionToken, callingUid, resolvedUserId).selectTrack(
type, trackId); type, trackId);
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in selectTrack", e); Slog.e(TAG, "error in selectTrack", e);
} }
} }
@@ -1266,7 +1270,7 @@ public final class TvInputManagerService extends SystemService {
try { try {
getSessionLocked(sessionToken, callingUid, resolvedUserId) getSessionLocked(sessionToken, callingUid, resolvedUserId)
.appPrivateCommand(command, data); .appPrivateCommand(command, data);
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in appPrivateCommand", e); Slog.e(TAG, "error in appPrivateCommand", e);
} }
} }
@@ -1287,7 +1291,7 @@ public final class TvInputManagerService extends SystemService {
try { try {
getSessionLocked(sessionToken, callingUid, resolvedUserId) getSessionLocked(sessionToken, callingUid, resolvedUserId)
.createOverlayView(windowToken, frame); .createOverlayView(windowToken, frame);
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in createOverlayView", e); Slog.e(TAG, "error in createOverlayView", e);
} }
} }
@@ -1307,7 +1311,7 @@ public final class TvInputManagerService extends SystemService {
try { try {
getSessionLocked(sessionToken, callingUid, resolvedUserId) getSessionLocked(sessionToken, callingUid, resolvedUserId)
.relayoutOverlayView(frame); .relayoutOverlayView(frame);
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in relayoutOverlayView", e); Slog.e(TAG, "error in relayoutOverlayView", e);
} }
} }
@@ -1327,7 +1331,7 @@ public final class TvInputManagerService extends SystemService {
try { try {
getSessionLocked(sessionToken, callingUid, resolvedUserId) getSessionLocked(sessionToken, callingUid, resolvedUserId)
.removeOverlayView(); .removeOverlayView();
} catch (RemoteException e) { } catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in removeOverlayView", 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);
}
}
} }