diff options
author | hkuang <hkuang@google.com> | 2020-01-22 10:03:21 -0800 |
---|---|---|
committer | Hangyu Kuang <hkuang@google.com> | 2020-01-31 21:37:04 +0000 |
commit | 9c04b8d17071731b919563c129919dd070f8075c (patch) | |
tree | e82f6739c53cb900a6cd02ea77b8ccdfd946c47b /media/libmediatranscoding/TranscodingClientManager.cpp | |
parent | 91fe789336d2c9ff772651bfa654604d5d241fd2 (diff) |
MediaTranscodingService: Implement service's add/remove client APIs.
Bug: 145233472
Test: Unit test.
Change-Id: Ice22f86942bf3838c80b100c71af46ff6e217744
Diffstat (limited to 'media/libmediatranscoding/TranscodingClientManager.cpp')
-rw-r--r-- | media/libmediatranscoding/TranscodingClientManager.cpp | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/media/libmediatranscoding/TranscodingClientManager.cpp b/media/libmediatranscoding/TranscodingClientManager.cpp index 5013a51526..e26dbaa3f8 100644 --- a/media/libmediatranscoding/TranscodingClientManager.cpp +++ b/media/libmediatranscoding/TranscodingClientManager.cpp @@ -17,12 +17,12 @@ // #define LOG_NDEBUG 0 #define LOG_TAG "TranscodingClientManager" +#include <inttypes.h> #include <media/TranscodingClientManager.h> #include <utils/Log.h> namespace android { -class DeathNotifier; using Status = ::ndk::ScopedAStatus; // static @@ -31,9 +31,17 @@ sp<TranscodingClientManager> TranscodingClientManager::getInstance() { return sInstance; } +// static +void TranscodingClientManager::BinderDiedCallback(void* cookie) { + int32_t clientId = static_cast<int32_t>(reinterpret_cast<intptr_t>(cookie)); + ALOGD("Client %" PRId32 " is dead", clientId); + // Don't check for pid validity since we know it's already dead. + sp<TranscodingClientManager> manager = TranscodingClientManager::getInstance(); + manager->removeClient(clientId); +} + TranscodingClientManager::TranscodingClientManager() - : mDeathRecipient(AIBinder_DeathRecipient_new( - TranscodingClientManager::DeathNotifier::BinderDiedCallback)) { + : mDeathRecipient(AIBinder_DeathRecipient_new(BinderDiedCallback)) { ALOGD("TranscodingClientManager started"); } @@ -77,14 +85,13 @@ void TranscodingClientManager::dumpAllClients(int fd, const Vector<String16>& ar status_t TranscodingClientManager::addClient(std::unique_ptr<ClientInfo> client) { // Validate the client. - if (client == nullptr || client->mClientId <= 0 || client->mClientPid <= 0 || - client->mClientUid <= 0 || client->mClientOpPackageName.empty() || + if (client == nullptr || client->mClientId < 0 || client->mClientPid < 0 || + client->mClientUid < 0 || client->mClientOpPackageName.empty() || client->mClientOpPackageName == "") { ALOGE("Invalid client"); return BAD_VALUE; } - ALOGD("Adding client id %d %s", client->mClientId, client->mClientOpPackageName.c_str()); std::scoped_lock lock{mLock}; // Check if the client already exists. @@ -93,10 +100,11 @@ status_t TranscodingClientManager::addClient(std::unique_ptr<ClientInfo> client) return ALREADY_EXISTS; } - // Listen to the death of the client. - client->mDeathNotifier = new DeathNotifier(); + ALOGD("Adding client id %d pid: %d uid: %d %s", client->mClientId, client->mClientPid, + client->mClientUid, client->mClientOpPackageName.c_str()); + AIBinder_linkToDeath(client->mClient->asBinder().get(), mDeathRecipient.get(), - client->mDeathNotifier.get()); + reinterpret_cast<void*>(client->mClientId)); // Adds the new client to the map. mClientIdToClientInfoMap[client->mClientId] = std::move(client); @@ -120,7 +128,7 @@ status_t TranscodingClientManager::removeClient(int32_t clientId) { // Check if the client still live. If alive, unlink the death. if (client) { AIBinder_unlinkToDeath(client->asBinder().get(), mDeathRecipient.get(), - it->second->mDeathNotifier.get()); + reinterpret_cast<void*>(clientId)); } // Erase the entry. @@ -134,13 +142,4 @@ size_t TranscodingClientManager::getNumOfClients() const { return mClientIdToClientInfoMap.size(); } -// static -void TranscodingClientManager::DeathNotifier::BinderDiedCallback(void* cookie) { - int32_t* pClientId = static_cast<int32_t*>(cookie); - ALOGD("Client %d is dead", *pClientId); - // Don't check for pid validity since we know it's already dead. - sp<TranscodingClientManager> manager = TranscodingClientManager::getInstance(); - manager->removeClient(*pClientId); -} - } // namespace android |