summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/DrmSessionManager.cpp
diff options
context:
space:
mode:
authorRonghua Wu <ronghuawu@google.com>2015-02-22 08:45:28 -0800
committerRonghua Wu <ronghuawu@google.com>2015-03-06 14:13:01 -0800
commit5c3da20ddde6d17c3ab3cff7f7ca19f4f484f812 (patch)
tree9dbf56e6dcc2ecc7198ca7be6dfa36e45304cebd /media/libmediaplayerservice/DrmSessionManager.cpp
parent2129895bac582be50d3fe067bd5cf5a088863b3a (diff)
downloadframeworks_av-5c3da20ddde6d17c3ab3cff7f7ca19f4f484f812.zip
frameworks_av-5c3da20ddde6d17c3ab3cff7f7ca19f4f484f812.tar.gz
frameworks_av-5c3da20ddde6d17c3ab3cff7f7ca19f4f484f812.tar.bz2
drm: use DrmSessionManager for session resource managing.
Bug: 19265536 Change-Id: Ie35184f99c51e7bd94d7c826ffb8e89040a81905
Diffstat (limited to 'media/libmediaplayerservice/DrmSessionManager.cpp')
-rw-r--r--media/libmediaplayerservice/DrmSessionManager.cpp56
1 files changed, 43 insertions, 13 deletions
diff --git a/media/libmediaplayerservice/DrmSessionManager.cpp b/media/libmediaplayerservice/DrmSessionManager.cpp
index 43346e0..6e17eb1 100644
--- a/media/libmediaplayerservice/DrmSessionManager.cpp
+++ b/media/libmediaplayerservice/DrmSessionManager.cpp
@@ -23,6 +23,8 @@
#include "DrmSessionClientInterface.h"
#include "ProcessInfoInterface.h"
#include <binder/IPCThreadState.h>
+#include <binder/IProcessInfoService.h>
+#include <binder/IServiceManager.h>
#include <unistd.h>
#include <utils/String8.h>
@@ -39,12 +41,25 @@ static String8 GetSessionIdString(const Vector<uint8_t> &sessionId) {
struct ProcessInfo : public ProcessInfoInterface {
ProcessInfo() {}
- virtual int getPriority(int pid) {
- // TODO: implement
- // Get process state to determine priority.
- // According to the define of PROCESS_STATE_***, higher the value lower
- // the priority. So we will do a converting from state to priority here.
- return -1;
+ virtual bool getPriority(int pid, int* priority) {
+ sp<IBinder> binder = defaultServiceManager()->getService(String16("processinfo"));
+ sp<IProcessInfoService> service = interface_cast<IProcessInfoService>(binder);
+
+ size_t length = 1;
+ int32_t states;
+ status_t err = service->getProcessStatesFromPids(length, &pid, &states);
+ if (err != OK) {
+ ALOGE("getProcessStatesFromPids failed");
+ return false;
+ }
+ ALOGV("pid %d states %d", pid, states);
+ if (states < 0) {
+ return false;
+ }
+
+ // Use process state as the priority. Lower the value, higher the priority.
+ *priority = states;
+ return true;
}
protected:
@@ -66,6 +81,11 @@ bool isEqualSessionId(const Vector<uint8_t> &sessionId1, const Vector<uint8_t> &
return true;
}
+sp<DrmSessionManager> DrmSessionManager::Instance() {
+ static sp<DrmSessionManager> drmSessionManager = new DrmSessionManager();
+ return drmSessionManager;
+}
+
DrmSessionManager::DrmSessionManager()
: mProcessInfo(new ProcessInfo()),
mTime(0) {}
@@ -155,15 +175,18 @@ bool DrmSessionManager::reclaimSession(int callingPid) {
sp<DrmSessionClientInterface> drm;
Vector<uint8_t> sessionId;
+ int lowestPriorityPid;
+ int lowestPriority;
{
Mutex::Autolock lock(mLock);
- int callingPriority = mProcessInfo->getPriority(callingPid);
- int lowestPriorityPid;
- int lowestPriority;
+ int callingPriority;
+ if (!mProcessInfo->getPriority(callingPid, &callingPriority)) {
+ return false;
+ }
if (!getLowestPriority_l(&lowestPriorityPid, &lowestPriority)) {
return false;
}
- if (lowestPriority >= callingPriority) {
+ if (lowestPriority <= callingPriority) {
return false;
}
@@ -176,6 +199,9 @@ bool DrmSessionManager::reclaimSession(int callingPid) {
return false;
}
+ ALOGV("reclaim session(%s) opened by pid %d",
+ GetSessionIdString(sessionId).string(), lowestPriorityPid);
+
return drm->reclaimSession(sessionId);
}
@@ -185,19 +211,23 @@ int64_t DrmSessionManager::getTime_l() {
bool DrmSessionManager::getLowestPriority_l(int* lowestPriorityPid, int* lowestPriority) {
int pid = -1;
- int priority = INT_MAX;
+ int priority = -1;
for (size_t i = 0; i < mSessionMap.size(); ++i) {
if (mSessionMap.valueAt(i).size() == 0) {
// no opened session by this process.
continue;
}
int tempPid = mSessionMap.keyAt(i);
- int tempPriority = mProcessInfo->getPriority(tempPid);
+ int tempPriority;
+ if (!mProcessInfo->getPriority(tempPid, &tempPriority)) {
+ // shouldn't happen.
+ return false;
+ }
if (pid == -1) {
pid = tempPid;
priority = tempPriority;
} else {
- if (tempPriority < priority) {
+ if (tempPriority > priority) {
pid = tempPid;
priority = tempPriority;
}