summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author RoboErik <epastern@google.com> 2014-05-01 17:11:34 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2014-05-01 17:11:34 +0000
commit67e2196d07dd4dc1f3ce82fdaaa34cdbce89e1ce (patch)
treeeb4bb9d5fc69356ba7f74f6b65a7b21afb9c9204
parent4a26164316b0d9a6d97dfbb85a2ac176384bb985 (diff)
parenta278ea7cecb59a73586e5dd74ec05e85caa370c5 (diff)
Merge "Add dump to MediaSessionService"
-rw-r--r--media/java/android/media/routeprovider/RouteRequest.java13
-rw-r--r--media/java/android/media/session/SessionInfo.java5
-rw-r--r--services/core/java/com/android/server/media/MediaRouteProviderProxy.java29
-rw-r--r--services/core/java/com/android/server/media/MediaSessionRecord.java22
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java54
-rw-r--r--services/core/java/com/android/server/media/RouteConnectionRecord.java12
-rw-r--r--services/java/com/android/server/SystemServer.java1
7 files changed, 121 insertions, 15 deletions
diff --git a/media/java/android/media/routeprovider/RouteRequest.java b/media/java/android/media/routeprovider/RouteRequest.java
index 9913566259d6..68475c07bd10 100644
--- a/media/java/android/media/routeprovider/RouteRequest.java
+++ b/media/java/android/media/routeprovider/RouteRequest.java
@@ -20,6 +20,8 @@ import android.media.session.SessionInfo;
import android.os.Parcel;
import android.os.Parcelable;
+import java.io.PrintWriter;
+
/**
* A request to connect or discover routes with certain capabilities.
* <p>
@@ -70,6 +72,17 @@ public final class RouteRequest implements Parcelable {
}
@Override
+ public String toString() {
+ StringBuilder bob = new StringBuilder();
+ bob.append("RouteRequest {");
+ bob.append("active=").append(mActive);
+ bob.append(", info=").append(mSessionInfo.toString());
+ bob.append(", options=").append(mOptions.toString());
+ bob.append("}");
+ return bob.toString();
+ }
+
+ @Override
public int describeContents() {
return 0;
}
diff --git a/media/java/android/media/session/SessionInfo.java b/media/java/android/media/session/SessionInfo.java
index 22d8ab1943f9..2b6552832543 100644
--- a/media/java/android/media/session/SessionInfo.java
+++ b/media/java/android/media/session/SessionInfo.java
@@ -57,6 +57,11 @@ public final class SessionInfo implements Parcelable {
}
@Override
+ public String toString() {
+ return "SessionInfo {id=" + mId + ", pkg=" + mPackageName + "}";
+ }
+
+ @Override
public int describeContents() {
return 0;
}
diff --git a/services/core/java/com/android/server/media/MediaRouteProviderProxy.java b/services/core/java/com/android/server/media/MediaRouteProviderProxy.java
index d314ea7cbbf6..c4e205892a4d 100644
--- a/services/core/java/com/android/server/media/MediaRouteProviderProxy.java
+++ b/services/core/java/com/android/server/media/MediaRouteProviderProxy.java
@@ -36,6 +36,7 @@ import android.os.UserHandle;
import android.util.Log;
import android.util.Slog;
+import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
@@ -55,13 +56,12 @@ public class MediaRouteProviderProxy {
private final String mId;
private final ComponentName mComponentName;
private final int mUserId;
-
- private Intent mBindIntent;
// Interfaces declared in the manifest
- private ArrayList<String> mInterfaces;
- private ArrayList<RouteConnectionRecord> mConnections = new ArrayList<RouteConnectionRecord>();
- private Handler mHandler = new Handler();
+ private final ArrayList<String> mInterfaces = new ArrayList<String>();
+ private final ArrayList<RouteConnectionRecord> mConnections = new ArrayList<RouteConnectionRecord>();
+ private final Handler mHandler = new Handler();
+ private Intent mBindIntent;
private IRouteProvider mBinder;
private boolean mRunning;
private boolean mInterested;
@@ -76,7 +76,9 @@ public class MediaRouteProviderProxy {
mId = id;
mComponentName = component;
mUserId = uid;
- mInterfaces = interfaces;
+ if (interfaces != null) {
+ mInterfaces.addAll(interfaces);
+ }
mBindIntent = new Intent(RouteProviderService.SERVICE_INTERFACE);
mBindIntent.setComponent(mComponentName);
}
@@ -202,7 +204,7 @@ public class MediaRouteProviderProxy {
if (connection != null) {
RouteConnectionRecord record = new RouteConnectionRecord(
- connection);
+ connection, mComponentName.getPackageName(), mUserId);
mConnections.add(record);
if (mRouteListener != null) {
mRouteListener.onRouteConnected(sessionId, route, request, record);
@@ -234,6 +236,19 @@ public class MediaRouteProviderProxy {
return mId;
}
+ public void dump(PrintWriter pw, String prefix) {
+ pw.println(prefix + mId + " " + this);
+ String indent = prefix + " ";
+
+ pw.println(indent + "component=" + mComponentName.toString());
+ pw.println(indent + "user id=" + mUserId);
+ pw.println(indent + "interfaces=" + mInterfaces.toString());
+ pw.println(indent + "connections=" + mConnections.toString());
+ pw.println(indent + "running=" + mRunning);
+ pw.println(indent + "interested=" + mInterested);
+ pw.println(indent + "bound=" + mBound);
+ }
+
private void updateBinding() {
if (shouldBind()) {
bind();
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index ac7f4f37fc07..2a1e2c3a2686 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -46,6 +46,7 @@ import android.util.Pair;
import android.util.Slog;
import android.view.KeyEvent;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@@ -226,6 +227,27 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
mService.sessionDied(this);
}
+ public void dump(PrintWriter pw, String prefix) {
+ pw.println(prefix + mTag + " " + this);
+
+ final String indent = prefix + " ";
+ pw.println(indent + "pid=" + mPid);
+ pw.println(indent + "info=" + mSessionInfo.toString());
+ pw.println(indent + "published=" + mIsPublished);
+ pw.println(indent + "transport controls enabled=" + mTransportPerformerEnabled);
+ pw.println(indent + "rating type=" + mRatingType);
+ pw.println(indent + "controllers: " + mControllerCallbacks.size());
+ pw.println(indent + "route requests {");
+ int size = mRequests.size();
+ for (int i = 0; i < size; i++) {
+ pw.println(indent + " " + mRequests.get(i).toString());
+ }
+ pw.println(indent + "}");
+ pw.println(indent + "route=" + (mRoute == null ? null : mRoute.toString()));
+ pw.println(indent + "connection=" + (mConnection == null ? null : mConnection.toString()));
+ pw.println(indent + "params=" + (mRequest == null ? null : mRequest.toString()));
+ }
+
private void onDestroy() {
mService.destroySession(this);
}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index bc9137049726..107f6ad257f2 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -16,7 +16,9 @@
package com.android.server.media;
+import android.Manifest;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.media.routeprovider.RouteRequest;
import android.media.session.ISession;
import android.media.session.ISessionCallback;
@@ -30,13 +32,17 @@ import android.text.TextUtils;
import android.util.Log;
import com.android.server.SystemService;
+import com.android.server.Watchdog;
+import com.android.server.Watchdog.Monitor;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
/**
* System implementation of MediaSessionManager
*/
-public class MediaSessionService extends SystemService {
+public class MediaSessionService extends SystemService implements Monitor {
private static final String TAG = "MediaSessionService";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -69,6 +75,7 @@ public class MediaSessionService extends SystemService {
public void onStart() {
publishBinderService(Context.MEDIA_SESSION_SERVICE, mSessionManagerImpl);
mRouteProviderWatcher.start();
+ Watchdog.getInstance().addMonitor(this);
}
/**
@@ -114,14 +121,21 @@ public class MediaSessionService extends SystemService {
}
}
+ @Override
+ public void monitor() {
+ synchronized (mLock) {
+ // Check for deadlock
+ }
+ }
+
void sessionDied(MediaSessionRecord session) {
- synchronized (mSessions) {
+ synchronized (mLock) {
destroySessionLocked(session);
}
}
void destroySession(MediaSessionRecord session) {
- synchronized (mSessions) {
+ synchronized (mLock) {
destroySessionLocked(session);
}
}
@@ -160,9 +174,7 @@ public class MediaSessionService extends SystemService {
} catch (RemoteException e) {
throw new RuntimeException("Media Session owner died prematurely.", e);
}
- synchronized (mSessions) {
- mSessions.add(session);
- }
+ mSessions.add(session);
if (DEBUG) {
Log.d(TAG, "Created session for package " + packageName + " with tag " + tag);
}
@@ -259,6 +271,36 @@ public class MediaSessionService extends SystemService {
Binder.restoreCallingIdentity(token);
}
}
+
+ @Override
+ public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
+ if (getContext().checkCallingOrSelfPermission(Manifest.permission.DUMP)
+ != PackageManager.PERMISSION_GRANTED) {
+ pw.println("Permission Denial: can't dump MediaSessionService from from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid());
+ return;
+ }
+
+ pw.println("MEDIA SESSION SERVICE (dumpsys media_session)");
+ pw.println();
+
+ synchronized (mLock) {
+ int count = mSessions.size();
+ pw.println("Sessions - have " + count + " states:");
+ for (int i = 0; i < count; i++) {
+ MediaSessionRecord record = mSessions.get(i);
+ pw.println();
+ record.dump(pw, "");
+ }
+ pw.println("Providers:");
+ count = mProviders.size();
+ for (int i = 0; i < count; i++) {
+ MediaRouteProviderProxy provider = mProviders.get(i);
+ provider.dump(pw, "");
+ }
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/media/RouteConnectionRecord.java b/services/core/java/com/android/server/media/RouteConnectionRecord.java
index 8da0f95125a5..90ddf29c31dd 100644
--- a/services/core/java/com/android/server/media/RouteConnectionRecord.java
+++ b/services/core/java/com/android/server/media/RouteConnectionRecord.java
@@ -29,10 +29,14 @@ import android.util.Log;
public class RouteConnectionRecord {
private static final String TAG = "RouteConnRecord";
private final IRouteConnection mBinder;
+ private final String mPackageName;
+ private final int mUid;
private Listener mListener;
- public RouteConnectionRecord(IRouteConnection binder) {
+ public RouteConnectionRecord(IRouteConnection binder, String packageName, int uid) {
mBinder = binder;
+ mPackageName = packageName;
+ mUid = uid;
}
/**
@@ -89,6 +93,12 @@ public class RouteConnectionRecord {
}
}
+ @Override
+ public String toString() {
+ return "RouteConnection { binder=" + mBinder.toString() + ", package=" + mPackageName
+ + ", uid=" + mUid + "}";
+ }
+
/**
* Listener to receive updates from the provider for this connection.
*/
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 3d82027ebee4..7c9f7a8c058c 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -923,7 +923,6 @@ public final class SystemServer {
}
try {
- Slog.i(TAG, "MediaSessionService");
mSystemServiceManager.startService(MediaSessionService.class);
} catch (Throwable e) {
reportWtf("starting MediaSessionService", e);