diff options
| author | Ronghua Wu <ronghuawu@google.com> | 2015-07-18 03:07:04 +0000 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-07-18 03:07:05 +0000 | 
| commit | 51390b48d311d1164a6638d3fe0b4a48aaa9028f (patch) | |
| tree | edb401cf9346bb27d1126df49ec15d61edf3a62a | |
| parent | f6d07bc61fd7fefe9d2b2cbdaf637f2fdb1bd21e (diff) | |
| parent | 37c8924c508a7c9b8bd3c8ce80fc005070531902 (diff) | |
| download | frameworks_av-51390b48d311d1164a6638d3fe0b4a48aaa9028f.zip frameworks_av-51390b48d311d1164a6638d3fe0b4a48aaa9028f.tar.gz frameworks_av-51390b48d311d1164a6638d3fe0b4a48aaa9028f.tar.bz2  | |
Merge "mediaresourcemanager: add pid to removeResource method" into mnc-dev
| -rw-r--r-- | include/media/IResourceManagerService.h | 2 | ||||
| -rw-r--r-- | include/media/stagefright/MediaCodec.h | 4 | ||||
| -rw-r--r-- | media/libmedia/IResourceManagerService.cpp | 6 | ||||
| -rw-r--r-- | media/libstagefright/MediaCodec.cpp | 24 | ||||
| -rw-r--r-- | services/mediaresourcemanager/ResourceManagerService.cpp | 27 | ||||
| -rw-r--r-- | services/mediaresourcemanager/ResourceManagerService.h | 2 | ||||
| -rw-r--r-- | services/mediaresourcemanager/test/ResourceManagerService_test.cpp | 31 | 
7 files changed, 50 insertions, 46 deletions
diff --git a/include/media/IResourceManagerService.h b/include/media/IResourceManagerService.h index 067392c..1e4f6de 100644 --- a/include/media/IResourceManagerService.h +++ b/include/media/IResourceManagerService.h @@ -43,7 +43,7 @@ public:              const sp<IResourceManagerClient> client,              const Vector<MediaResource> &resources) = 0; -    virtual void removeResource(int64_t clientId) = 0; +    virtual void removeResource(int pid, int64_t clientId) = 0;      virtual bool reclaimResource(              int callingPid, diff --git a/include/media/stagefright/MediaCodec.h b/include/media/stagefright/MediaCodec.h index 09cbe8f..b1dc278 100644 --- a/include/media/stagefright/MediaCodec.h +++ b/include/media/stagefright/MediaCodec.h @@ -260,18 +260,18 @@ private:          virtual void binderDied(const wp<IBinder>& /*who*/);          void addResource( -                int pid,                  int64_t clientId,                  const sp<IResourceManagerClient> client,                  const Vector<MediaResource> &resources);          void removeResource(int64_t clientId); -        bool reclaimResource(int callingPid, const Vector<MediaResource> &resources); +        bool reclaimResource(const Vector<MediaResource> &resources);      private:          Mutex mLock;          sp<IResourceManagerService> mService; +        int mPid;      };      State mState; diff --git a/media/libmedia/IResourceManagerService.cpp b/media/libmedia/IResourceManagerService.cpp index 6902e99..4598686 100644 --- a/media/libmedia/IResourceManagerService.cpp +++ b/media/libmedia/IResourceManagerService.cpp @@ -85,9 +85,10 @@ public:          remote()->transact(ADD_RESOURCE, data, &reply);      } -    virtual void removeResource(int64_t clientId) { +    virtual void removeResource(int pid, int64_t clientId) {          Parcel data, reply;          data.writeInterfaceToken(IResourceManagerService::getInterfaceDescriptor()); +        data.writeInt32(pid);          data.writeInt64(clientId);          remote()->transact(REMOVE_RESOURCE, data, &reply); @@ -139,8 +140,9 @@ status_t BnResourceManagerService::onTransact(          case REMOVE_RESOURCE: {              CHECK_INTERFACE(IResourceManagerService, data, reply); +            int pid = data.readInt32();              int64_t clientId = data.readInt64(); -            removeResource(clientId); +            removeResource(pid, clientId);              return NO_ERROR;          } break; diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index fb32d3a..09742a4 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -54,10 +54,6 @@  namespace android { -static inline int getCallingPid() { -    return IPCThreadState::self()->getCallingPid(); -} -  static int64_t getId(sp<IResourceManagerClient> client) {      return (int64_t) client.get();  } @@ -108,7 +104,8 @@ private:      DISALLOW_EVIL_CONSTRUCTORS(ResourceManagerClient);  }; -MediaCodec::ResourceManagerServiceProxy::ResourceManagerServiceProxy() { +MediaCodec::ResourceManagerServiceProxy::ResourceManagerServiceProxy() +        : mPid(IPCThreadState::self()->getCallingPid()) {  }  MediaCodec::ResourceManagerServiceProxy::~ResourceManagerServiceProxy() { @@ -135,7 +132,6 @@ void MediaCodec::ResourceManagerServiceProxy::binderDied(const wp<IBinder>& /*wh  }  void MediaCodec::ResourceManagerServiceProxy::addResource( -        int pid,          int64_t clientId,          const sp<IResourceManagerClient> client,          const Vector<MediaResource> &resources) { @@ -143,7 +139,7 @@ void MediaCodec::ResourceManagerServiceProxy::addResource(      if (mService == NULL) {          return;      } -    mService->addResource(pid, clientId, client, resources); +    mService->addResource(mPid, clientId, client, resources);  }  void MediaCodec::ResourceManagerServiceProxy::removeResource(int64_t clientId) { @@ -151,16 +147,16 @@ void MediaCodec::ResourceManagerServiceProxy::removeResource(int64_t clientId) {      if (mService == NULL) {          return;      } -    mService->removeResource(clientId); +    mService->removeResource(mPid, clientId);  }  bool MediaCodec::ResourceManagerServiceProxy::reclaimResource( -        int callingPid, const Vector<MediaResource> &resources) { +        const Vector<MediaResource> &resources) {      Mutex::Autolock _l(mLock);      if (mService == NULL) {          return false;      } -    return mService->reclaimResource(callingPid, resources); +    return mService->reclaimResource(mPid, resources);  }  // static @@ -375,7 +371,7 @@ status_t MediaCodec::init(const AString &name, bool nameIsType, bool encoder) {      for (int i = 0; i <= kMaxRetry; ++i) {          if (i > 0) {              // Don't try to reclaim resource for the first time. -            if (!mResourceManagerService->reclaimResource(getCallingPid(), resources)) { +            if (!mResourceManagerService->reclaimResource(resources)) {                  break;              }          } @@ -438,7 +434,7 @@ status_t MediaCodec::configure(      for (int i = 0; i <= kMaxRetry; ++i) {          if (i > 0) {              // Don't try to reclaim resource for the first time. -            if (!mResourceManagerService->reclaimResource(getCallingPid(), resources)) { +            if (!mResourceManagerService->reclaimResource(resources)) {                  break;              }          } @@ -517,7 +513,7 @@ void MediaCodec::addResource(const String8 &type, const String8 &subtype, uint64      Vector<MediaResource> resources;      resources.push_back(MediaResource(type, subtype, value));      mResourceManagerService->addResource( -            getCallingPid(), getId(mResourceManagerClient), mResourceManagerClient, resources); +            getId(mResourceManagerClient), mResourceManagerClient, resources);  }  status_t MediaCodec::start() { @@ -535,7 +531,7 @@ status_t MediaCodec::start() {      for (int i = 0; i <= kMaxRetry; ++i) {          if (i > 0) {              // Don't try to reclaim resource for the first time. -            if (!mResourceManagerService->reclaimResource(getCallingPid(), resources)) { +            if (!mResourceManagerService->reclaimResource(resources)) {                  break;              }              // Recover codec from previous error before retry start. diff --git a/services/mediaresourcemanager/ResourceManagerService.cpp b/services/mediaresourcemanager/ResourceManagerService.cpp index 61147ff..e54cc5a 100644 --- a/services/mediaresourcemanager/ResourceManagerService.cpp +++ b/services/mediaresourcemanager/ResourceManagerService.cpp @@ -179,23 +179,24 @@ void ResourceManagerService::addResource(      info.resources.appendVector(resources);  } -void ResourceManagerService::removeResource(int64_t clientId) { -    String8 log = String8::format("removeResource(%lld)", (long long) clientId); +void ResourceManagerService::removeResource(int pid, int64_t clientId) { +    String8 log = String8::format( +            "removeResource(pid %d, clientId %lld)", +            pid, (long long) clientId);      mServiceLog->add(log);      Mutex::Autolock lock(mLock); +    ssize_t index = mMap.indexOfKey(pid); +    if (index < 0) { +        ALOGV("removeResource: didn't find pid %d for clientId %lld", pid, (long long) clientId); +        return; +    }      bool found = false; -    for (size_t i = 0; i < mMap.size(); ++i) { -        ResourceInfos &infos = mMap.editValueAt(i); -        for (size_t j = 0; j < infos.size();) { -            if (infos[j].clientId == clientId) { -                j = infos.removeAt(j); -                found = true; -            } else { -                ++j; -            } -        } -        if (found) { +    ResourceInfos &infos = mMap.editValueAt(index); +    for (size_t j = 0; j < infos.size(); ++j) { +        if (infos[j].clientId == clientId) { +            j = infos.removeAt(j); +            found = true;              break;          }      } diff --git a/services/mediaresourcemanager/ResourceManagerService.h b/services/mediaresourcemanager/ResourceManagerService.h index ca218fc..4769373 100644 --- a/services/mediaresourcemanager/ResourceManagerService.h +++ b/services/mediaresourcemanager/ResourceManagerService.h @@ -63,7 +63,7 @@ public:              const sp<IResourceManagerClient> client,              const Vector<MediaResource> &resources); -    virtual void removeResource(int64_t clientId); +    virtual void removeResource(int pid, int64_t clientId);      // Tries to reclaim resource from processes with lower priority than the calling process      // according to the requested resources. diff --git a/services/mediaresourcemanager/test/ResourceManagerService_test.cpp b/services/mediaresourcemanager/test/ResourceManagerService_test.cpp index 8ae6a55..df49ddc 100644 --- a/services/mediaresourcemanager/test/ResourceManagerService_test.cpp +++ b/services/mediaresourcemanager/test/ResourceManagerService_test.cpp @@ -29,6 +29,10 @@  namespace android { +static int64_t getId(sp<IResourceManagerClient> client) { +    return (int64_t) client.get(); +} +  struct TestProcessInfo : public ProcessInfoInterface {      TestProcessInfo() {}      virtual ~TestProcessInfo() {} @@ -45,12 +49,12 @@ private:  };  struct TestClient : public BnResourceManagerClient { -    TestClient(sp<ResourceManagerService> service) -        : mReclaimed(false), mService(service) {} +    TestClient(int pid, sp<ResourceManagerService> service) +        : mReclaimed(false), mPid(pid), mService(service) {}      virtual bool reclaimResource() {          sp<IResourceManagerClient> client(this); -        mService->removeResource((int64_t) client.get()); +        mService->removeResource(mPid, (int64_t) client.get());          mReclaimed = true;          return true;      } @@ -72,6 +76,7 @@ protected:  private:      bool mReclaimed; +    int mPid;      sp<ResourceManagerService> mService;      DISALLOW_EVIL_CONSTRUCTORS(TestClient);  }; @@ -87,9 +92,9 @@ class ResourceManagerServiceTest : public ::testing::Test {  public:      ResourceManagerServiceTest()          : mService(new ResourceManagerService(new TestProcessInfo)), -          mTestClient1(new TestClient(mService)), -          mTestClient2(new TestClient(mService)), -          mTestClient3(new TestClient(mService)) { +          mTestClient1(new TestClient(kTestPid1, mService)), +          mTestClient2(new TestClient(kTestPid2, mService)), +          mTestClient3(new TestClient(kTestPid2, mService)) {      }  protected: @@ -144,24 +149,24 @@ protected:          // kTestPid1 mTestClient1          Vector<MediaResource> resources1;          resources1.push_back(MediaResource(String8(kResourceSecureCodec), 1)); -        mService->addResource(kTestPid1, (int64_t) mTestClient1.get(), mTestClient1, resources1); +        mService->addResource(kTestPid1, getId(mTestClient1), mTestClient1, resources1);          resources1.push_back(MediaResource(String8(kResourceGraphicMemory), 200));          Vector<MediaResource> resources11;          resources11.push_back(MediaResource(String8(kResourceGraphicMemory), 200)); -        mService->addResource(kTestPid1, (int64_t) mTestClient1.get(), mTestClient1, resources11); +        mService->addResource(kTestPid1, getId(mTestClient1), mTestClient1, resources11);          // kTestPid2 mTestClient2          Vector<MediaResource> resources2;          resources2.push_back(MediaResource(String8(kResourceNonSecureCodec), 1));          resources2.push_back(MediaResource(String8(kResourceGraphicMemory), 300)); -        mService->addResource(kTestPid2, (int64_t) mTestClient2.get(), mTestClient2, resources2); +        mService->addResource(kTestPid2, getId(mTestClient2), mTestClient2, resources2);          // kTestPid2 mTestClient3          Vector<MediaResource> resources3; -        mService->addResource(kTestPid2, (int64_t) mTestClient3.get(), mTestClient3, resources3); +        mService->addResource(kTestPid2, getId(mTestClient3), mTestClient3, resources3);          resources3.push_back(MediaResource(String8(kResourceSecureCodec), 1));          resources3.push_back(MediaResource(String8(kResourceGraphicMemory), 100)); -        mService->addResource(kTestPid2, (int64_t) mTestClient3.get(), mTestClient3, resources3); +        mService->addResource(kTestPid2, getId(mTestClient3), mTestClient3, resources3);          const PidResourceInfosMap &map = mService->mMap;          EXPECT_EQ(2u, map.size()); @@ -213,7 +218,7 @@ protected:      void testRemoveResource() {          addResource(); -        mService->removeResource((int64_t) mTestClient2.get()); +        mService->removeResource(kTestPid2, getId(mTestClient2));          const PidResourceInfosMap &map = mService->mMap;          EXPECT_EQ(2u, map.size()); @@ -431,7 +436,7 @@ protected:              verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);              // clean up client 3 which still left -            mService->removeResource((int64_t) mTestClient3.get()); +            mService->removeResource(kTestPid2, getId(mTestClient3));          }      }  | 
